File: Symbols\ModuleSymbol.vb
Web Access
Project: src\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports System.Collections.Immutable
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports Microsoft.CodeAnalysis.Symbols
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
    ''' <summary>
    ''' Represents a module within an assembly. Every assembly contains one or more modules.
    ''' </summary>
    Friend MustInherit Class ModuleSymbol
        Inherits Symbol
        Implements IModuleSymbol, IModuleSymbolInternal
 
        ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        ' Changes to the public interface of this class should remain synchronized with the C# version of Symbol.
        ' Do not make any changes to the public interface without making the corresponding change
        ' to the C# version.
        ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
        Friend Sub New()
        End Sub
 
        ''' <summary>
        ''' Module's ordinal within containing assembly's Modules array.
        ''' 0 - for a source module, etc.
        ''' -1 - for a module that doesn't have containing assembly, or has it, but is not part of Modules array. 
        ''' </summary>
        Friend MustOverride ReadOnly Property Ordinal As Integer
 
        ''' <summary>
        ''' Target architecture of the machine.
        ''' </summary>
        Friend MustOverride ReadOnly Property Machine As System.Reflection.PortableExecutable.Machine
 
        ''' <summary>
        ''' Indicates that this PE file makes Win32 calls. See CorPEKind.pe32BitRequired for more information (http://msdn.microsoft.com/en-us/library/ms230275.aspx).
        ''' </summary>
        Friend MustOverride ReadOnly Property Bit32Required As Boolean
 
        Public NotOverridable Overrides ReadOnly Property DeclaredAccessibility As Accessibility
            Get
                Return Accessibility.NotApplicable
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property IsMustOverride As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property IsNotOverridable As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property IsOverridable As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property IsOverrides As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property IsShared As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property DeclaringSyntaxReferences As ImmutableArray(Of SyntaxReference)
            Get
                Return ImmutableArray(Of SyntaxReference).Empty
            End Get
        End Property
 
        ''' <summary>
        ''' Returns a NamespaceSymbol representing the global (root) namespace, with
        ''' module extent, that can be used to browse all of the symbols defined in this module.
        ''' </summary>
        Public MustOverride ReadOnly Property GlobalNamespace As NamespaceSymbol
 
        ''' <summary>
        ''' Returns the containing assembly. Modules are always directly contained by an assembly,
        ''' so this property always returns the same as ContainingSymbol.
        ''' </summary>
        Public Overrides ReadOnly Property ContainingAssembly As AssemblySymbol
            Get
                Return DirectCast(ContainingSymbol, AssemblySymbol)
            End Get
        End Property
 
        Public Overrides ReadOnly Property ContainingModule As ModuleSymbol
            Get
                Return Nothing
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property Kind As SymbolKind
            Get
                Return SymbolKind.NetModule
            End Get
        End Property
 
        Friend Overrides Function Accept(Of TArgument, TResult)(visitor As VisualBasicSymbolVisitor(Of TArgument, TResult), arg As TArgument) As TResult
            Return visitor.VisitModule(Me, arg)
        End Function
 
        ''' <summary>
        ''' Returns an array of assembly identities for assemblies referenced by this module.
        ''' Items at the same position from ReferencedAssemblies And from ReferencedAssemblySymbols 
        ''' correspond to each other.
        ''' </summary>
        Public ReadOnly Property ReferencedAssemblies As ImmutableArray(Of AssemblyIdentity) Implements IModuleSymbol.ReferencedAssemblies
            Get
                Return GetReferencedAssemblies()
            End Get
        End Property
 
        ''' <summary>
        ''' If this symbol represents a metadata module returns the underlying <see cref="ModuleMetadata"/>.
        ''' 
        ''' Otherwise, this returns <see langword="Nothing"/>.
        ''' </summary>
        Public MustOverride Function GetMetadata() As ModuleMetadata Implements IModuleSymbol.GetMetadata
 
        ''' <summary>
        ''' Returns an array of assembly identities for assemblies referenced by this module.
        ''' Items at the same position from GetReferencedAssemblies and from GetReferencedAssemblySymbols 
        ''' should correspond to each other.
        ''' 
        ''' The array and its content is provided by ReferenceManager and must not be modified.
        ''' </summary>
        Friend MustOverride Function GetReferencedAssemblies() As ImmutableArray(Of AssemblyIdentity) ' TODO: Remove this method and make ReferencedAssemblies property abstract instead.
 
        ''' <summary>
        ''' Returns an array of AssemblySymbol objects corresponding to assemblies referenced 
        ''' by this module. Items at the same position from ReferencedAssemblies And 
        ''' from ReferencedAssemblySymbols correspond to each other.
        ''' </summary>
        Public ReadOnly Property ReferencedAssemblySymbols As ImmutableArray(Of AssemblySymbol)
            Get
                Return GetReferencedAssemblySymbols()
            End Get
        End Property
 
        ''' <summary>
        ''' Returns an array of AssemblySymbol objects corresponding to assemblies referenced 
        ''' by this module. Items at the same position from GetReferencedAssemblies and 
        ''' from GetReferencedAssemblySymbols should correspond to each other. If reference is 
        ''' not resolved by compiler, GetReferencedAssemblySymbols returns MissingAssemblySymbol in the
        ''' corresponding item.
        ''' 
        ''' The array and its content is provided by ReferenceManager and must not be modified.
        ''' </summary>
        Friend MustOverride Function GetReferencedAssemblySymbols() As ImmutableArray(Of AssemblySymbol) ' TODO: Remove this method and make ReferencedAssemblySymbols property abstract instead.
 
        Friend Function GetReferencedAssemblySymbol(referencedAssemblyIndex As Integer) As AssemblySymbol
            Dim referencedAssemblies = GetReferencedAssemblySymbols()
            If referencedAssemblyIndex < referencedAssemblies.Length Then
                Return referencedAssemblies(referencedAssemblyIndex)
            End If
 
            ' This module must be a corlib where the original metadata contains assembly
            ' references (see https://github.com/dotnet/roslyn/issues/13275).
            Dim assembly = ContainingAssembly
            If assembly IsNot assembly.CorLibrary Then
                Throw New ArgumentOutOfRangeException(NameOf(referencedAssemblyIndex))
            End If
 
            Return Nothing
        End Function
 
        ''' <summary>
        ''' A helper method for ReferenceManager to set assembly identities for assemblies
        ''' referenced by this module and corresponding AssemblySymbols.
        ''' </summary>
        ''' <param name="moduleReferences">A description of the assemblies referenced by this module.</param>
        '''
        ''' <param name="originatingSourceAssemblyDebugOnly">
        ''' Source assembly that triggered creation of this module symbol.
        ''' For debug purposes only, this assembly symbol should not be persisted within
        ''' this module symbol because the module can be shared across multiple source
        ''' assemblies. This method will only be called for the first one.
        ''' </param>
        Friend MustOverride Sub SetReferences(
            moduleReferences As ModuleReferences(Of AssemblySymbol),
            Optional originatingSourceAssemblyDebugOnly As SourceAssemblySymbol = Nothing)
 
        ''' <summary>
        ''' True if this module has any unified references.
        ''' </summary>
        Friend MustOverride ReadOnly Property HasUnifiedReferences As Boolean
 
        ''' <summary> 
        ''' Returns a unification use-site error (if any) for a symbol contained in this module 
        ''' that is referring to a specified <paramref name="dependentType"/>.
        ''' </summary> 
        ''' <remarks> 
        ''' If an assembly referenced by this module isn't exactly matching any reference given to compilation 
        ''' the Assembly Manager might decide to use another reference if it matches except for version 
        ''' (it unifies the version with the existing reference).  
        ''' </remarks>
        Friend MustOverride Function GetUnificationUseSiteErrorInfo(dependentType As TypeSymbol) As DiagnosticInfo
 
        ''' <summary>
        ''' Lookup a top level type referenced from metadata, names should be
        ''' compared case-sensitively.
        ''' </summary>
        ''' <param name="emittedName">
        ''' Full type name possibly with generic name mangling.
        ''' </param>
        ''' <returns>
        ''' Symbol for the type, or Nothing if the type isn't found.
        ''' </returns>
        ''' <remarks></remarks>
        Friend MustOverride Function LookupTopLevelMetadataType(
            ByRef emittedName As MetadataTypeName
        ) As NamedTypeSymbol
 
        Friend MustOverride ReadOnly Property TypeNames As ICollection(Of String)
 
        Friend MustOverride ReadOnly Property NamespaceNames As ICollection(Of String)
 
        ''' <summary>
        ''' Returns true if there is any applied CompilationRelaxationsAttribute assembly attribute for this module.
        ''' </summary>
        Friend MustOverride ReadOnly Property HasAssemblyCompilationRelaxationsAttribute As Boolean
 
        ''' <summary>
        ''' Returns true if there is any applied RuntimeCompatibilityAttribute assembly attribute for this module.
        ''' </summary>
        Friend MustOverride ReadOnly Property HasAssemblyRuntimeCompatibilityAttribute As Boolean
 
        ''' <summary>
        ''' Default char set for contained types, or null if not specified.
        ''' </summary>
        ''' <remarks>
        ''' Determined based upon value specified via <see cref="DefaultCharSetAttribute"/> applied on this module.
        ''' </remarks>
        Friend MustOverride ReadOnly Property DefaultMarshallingCharSet As CharSet?
 
        Friend Overridable Function GetHash(algorithmId As AssemblyHashAlgorithm) As ImmutableArray(Of Byte)
            Throw ExceptionUtilities.Unreachable
        End Function
 
        ''' <summary>
        ''' Given a namespace symbol, returns the corresponding module specific namespace symbol
        ''' </summary>
        Public Function GetModuleNamespace(namespaceSymbol As INamespaceSymbol) As NamespaceSymbol
            If namespaceSymbol Is Nothing Then
                Throw New ArgumentNullException(NameOf(namespaceSymbol))
            End If
 
            Dim moduleNs = TryCast(namespaceSymbol, NamespaceSymbol)
            If moduleNs IsNot Nothing And moduleNs.Extent.Kind = NamespaceKind.Module And moduleNs.ContainingModule = Me Then
                Return moduleNs
            End If
 
            If namespaceSymbol.IsGlobalNamespace Or namespaceSymbol.ContainingNamespace Is Nothing Then
                Return Me.GlobalNamespace
            Else
                Dim cns = GetModuleNamespace(namespaceSymbol.ContainingNamespace)
                If cns IsNot Nothing Then
                    Return cns.GetNestedNamespace(namespaceSymbol.Name)
                End If
                Return Nothing
            End If
        End Function
 
        ''' <summary>
        ''' Does this symbol represent a missing Module.
        ''' </summary>
        Friend MustOverride ReadOnly Property IsMissing As Boolean
 
        ''' <summary>
        ''' If this property returns false, it is certain that there are no extension
        ''' methods (from language perspective) inside this module. If this property returns true, 
        ''' it is highly likely (but not certain) that this type contains extension methods. 
        ''' This property allows the search for extension methods to be narrowed much more quickly.
        ''' 
        ''' !!! Note that this property can mutate during lifetime of the symbol !!!
        ''' !!! from True to False, as we learn more about the module.           !!! 
        ''' </summary>
        Friend MustOverride ReadOnly Property MightContainExtensionMethods As Boolean
 
#Region "IModuleSymbol"
        Private ReadOnly Property IModuleSymbol_GlobalNamespace As INamespaceSymbol Implements IModuleSymbol.GlobalNamespace
            Get
                Return Me.GlobalNamespace
            End Get
        End Property
 
        Private Function IModuleSymbol_GetModuleNamespace(namespaceSymbol As INamespaceSymbol) As INamespaceSymbol Implements IModuleSymbol.GetModuleNamespace
            Return Me.GetModuleNamespace(namespaceSymbol)
        End Function
 
        Private ReadOnly Property IModuleSymbol_ReferencedAssemblySymbols As ImmutableArray(Of IAssemblySymbol) Implements IModuleSymbol.ReferencedAssemblySymbols
            Get
                Return ImmutableArray(Of IAssemblySymbol).CastUp(ReferencedAssemblySymbols)
            End Get
        End Property
 
        Public Overrides Sub Accept(visitor As SymbolVisitor)
            visitor.VisitModule(Me)
        End Sub
 
        Public Overrides Function Accept(Of TResult)(visitor As SymbolVisitor(Of TResult)) As TResult
            Return visitor.VisitModule(Me)
        End Function
 
        Public Overrides Function Accept(Of TArgument, TResult)(visitor As SymbolVisitor(Of TArgument, TResult), argument As TArgument) As TResult
            Return visitor.VisitModule(Me, argument)
        End Function
 
        Public Overrides Sub Accept(visitor As VisualBasicSymbolVisitor)
            visitor.VisitModule(Me)
        End Sub
 
        Public Overrides Function Accept(Of TResult)(visitor As VisualBasicSymbolVisitor(Of TResult)) As TResult
            Return visitor.VisitModule(Me)
        End Function
 
#End Region
 
    End Class
End Namespace