File: Symbols\MissingAssemblySymbol.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
Imports System.Collections.Immutable
Imports System.Collections.ObjectModel
Imports System.Reflection
Imports System.Threading
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Roslyn.Utilities
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
 
    ''' <summary>
    ''' A <see cref="MissingAssemblySymbol"/> is a special kind of <see cref="AssemblySymbol"/> that represents
    ''' an assembly that couldn't be found.
    ''' </summary>
    Friend Class MissingAssemblySymbol
        Inherits AssemblySymbol
 
        Protected ReadOnly m_Identity As AssemblyIdentity
        Protected ReadOnly m_ModuleSymbol As MissingModuleSymbol
 
        Private _lazyModules As ImmutableArray(Of ModuleSymbol)
 
        Public Sub New(identity As AssemblyIdentity)
            Debug.Assert(identity IsNot Nothing)
            m_Identity = identity
            m_ModuleSymbol = New MissingModuleSymbol(Me, 0)
        End Sub
 
        Friend NotOverridable Overrides ReadOnly Property IsMissing As Boolean
            Get
                Return True
            End Get
        End Property
 
        Friend Overrides ReadOnly Property IsLinked As Boolean
            Get
                Return False
            End Get
        End Property
 
        Friend Overrides Function GetDeclaredSpecialTypeMember(member As SpecialMember) As Symbol
            Return Nothing
        End Function
 
        Public Overrides ReadOnly Property Identity As AssemblyIdentity
            Get
                Return m_Identity
            End Get
        End Property
 
        Public Overrides ReadOnly Property AssemblyVersionPattern As Version
            Get
                Return Nothing
            End Get
        End Property
 
        Friend Overrides ReadOnly Property PublicKey As ImmutableArray(Of Byte)
            Get
                Return Identity.PublicKey
            End Get
        End Property
 
        Public Overrides ReadOnly Property Modules As ImmutableArray(Of ModuleSymbol)
            Get
                If _lazyModules.IsDefault Then
                    _lazyModules = ImmutableArray.Create(Of ModuleSymbol)(m_ModuleSymbol)
                End If
 
                Return _lazyModules
            End Get
        End Property
 
        Public NotOverridable Overrides ReadOnly Property GlobalNamespace As NamespaceSymbol
            Get
                Return m_ModuleSymbol.GlobalNamespace
            End Get
        End Property
 
        Public Overrides ReadOnly Property HasImportedFromTypeLibAttribute As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides ReadOnly Property HasPrimaryInteropAssemblyAttribute As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides Function GetHashCode() As Integer
            Return m_Identity.GetHashCode()
        End Function
 
        Public Overrides Function Equals(obj As Object) As Boolean
            Return Equals(TryCast(obj, MissingAssemblySymbol))
        End Function
 
        Public Overloads Function Equals(other As MissingAssemblySymbol) As Boolean
            Return other IsNot Nothing AndAlso (Me Is other OrElse m_Identity.Equals(other.m_Identity))
        End Function
 
        Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location)
            Get
                Return ImmutableArray(Of Location).Empty
            End Get
        End Property
 
        Friend Overrides Sub SetLinkedReferencedAssemblies(assemblies As ImmutableArray(Of AssemblySymbol))
            Throw ExceptionUtilities.Unreachable
        End Sub
 
        Friend Overrides Function GetLinkedReferencedAssemblies() As ImmutableArray(Of AssemblySymbol)
            Return ImmutableArray(Of AssemblySymbol).Empty
        End Function
 
        Friend Overrides Sub SetNoPiaResolutionAssemblies(assemblies As ImmutableArray(Of AssemblySymbol))
            Throw ExceptionUtilities.Unreachable
        End Sub
 
        Friend Overrides Function GetNoPiaResolutionAssemblies() As ImmutableArray(Of AssemblySymbol)
            Return ImmutableArray(Of AssemblySymbol).Empty
        End Function
 
        Friend Overrides Function GetInternalsVisibleToPublicKeys(simpleName As String) As IEnumerable(Of ImmutableArray(Of Byte))
            Return SpecializedCollections.EmptyEnumerable(Of ImmutableArray(Of Byte))()
        End Function
 
        Friend Overrides Function GetInternalsVisibleToAssemblyNames() As IEnumerable(Of String)
            Return SpecializedCollections.EmptyEnumerable(Of String)()
        End Function
 
        Public Overrides ReadOnly Property TypeNames As ICollection(Of String)
            Get
                Return SpecializedCollections.EmptyCollection(Of String)()
            End Get
        End Property
 
        Public Overrides ReadOnly Property NamespaceNames As ICollection(Of String)
            Get
                Return SpecializedCollections.EmptyCollection(Of String)()
            End Get
        End Property
 
        Friend Overrides Function AreInternalsVisibleToThisAssembly(other As AssemblySymbol) As Boolean
            Return False
        End Function
 
        Friend Overrides Function LookupDeclaredOrForwardedTopLevelMetadataType(ByRef emittedName As MetadataTypeName, visitedAssemblies As ConsList(Of AssemblySymbol)) As NamedTypeSymbol
            Return New MissingMetadataTypeSymbol.TopLevel(m_ModuleSymbol, emittedName)
        End Function
 
        Friend Overrides Function LookupDeclaredTopLevelMetadataType(ByRef emittedName As MetadataTypeName) As NamedTypeSymbol
            Return Nothing
        End Function
 
        Friend NotOverridable Overrides Function GetAllTopLevelForwardedTypes() As IEnumerable(Of NamedTypeSymbol)
            Return SpecializedCollections.EmptyEnumerable(Of NamedTypeSymbol)()
        End Function
 
        Friend Overrides Function GetDeclaredSpecialType(type As ExtendedSpecialType) As NamedTypeSymbol
            Throw ExceptionUtilities.Unreachable
        End Function
 
        Public NotOverridable Overrides ReadOnly Property MightContainExtensionMethods As Boolean
            Get
                Return False
            End Get
        End Property
 
        Public Overrides Function GetMetadata() As AssemblyMetadata
            Return Nothing
        End Function
 
        Friend Overrides ReadOnly Property ObsoleteAttributeData As ObsoleteAttributeData
            Get
                Return Nothing
            End Get
        End Property
 
        Friend Overrides Function GetGuidString(ByRef guidString As String) As Boolean
            guidString = Nothing
            Return False
        End Function
    End Class
 
    ''' <summary>
    ''' AssemblySymbol to represent missing, for whatever reason, CorLibrary.
    ''' The symbol is created by ReferenceManager on as needed basis and is shared by all compilations
    ''' with missing CorLibraries.
    ''' </summary>
    Friend NotInheritable Class MissingCorLibrarySymbol
        Inherits MissingAssemblySymbol
 
        Friend Shared ReadOnly Instance As MissingCorLibrarySymbol = New MissingCorLibrarySymbol()
 
        ''' <summary>
        ''' An array of cached Cor types defined in this assembly.
        ''' Lazily filled by GetDeclaredSpecialType method.
        ''' </summary>
        Private _lazySpecialTypes() As NamedTypeSymbol
 
        Private Sub New()
            MyBase.New(New AssemblyIdentity("<Missing Core Assembly>"))
            Me.SetCorLibrary(Me)
        End Sub
 
        ''' <summary>
        ''' Lookup declaration for predefined CorLib type in this Assembly. Only should be
        ''' called if it is know that this is the Cor Library (mscorlib).
        ''' </summary>
        ''' <param name="type"></param>
        Friend Overrides Function GetDeclaredSpecialType(type As ExtendedSpecialType) As NamedTypeSymbol
#If DEBUG Then
            For Each [module] In Me.Modules
                Debug.Assert([module].GetReferencedAssemblies().Length = 0)
            Next
#End If
 
            If _lazySpecialTypes Is Nothing Then
                Interlocked.CompareExchange(_lazySpecialTypes, New NamedTypeSymbol(InternalSpecialType.NextAvailable - 1) {}, Nothing)
            End If
 
            If _lazySpecialTypes(CInt(type)) Is Nothing Then
                Dim emittedFullName As MetadataTypeName = MetadataTypeName.FromFullName(SpecialTypes.GetMetadataName(type), useCLSCompliantNameArityEncoding:=True)
                Dim corType As NamedTypeSymbol = New MissingMetadataTypeSymbol.TopLevel(m_ModuleSymbol, emittedFullName, type)
                Interlocked.CompareExchange(_lazySpecialTypes(CInt(type)), corType, Nothing)
            End If
 
            Return _lazySpecialTypes(CInt(type))
 
        End Function
    End Class
End Namespace