File: Symbols\NamespaceExtent.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.Generic
Imports System.Threading
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
 
    ''' <summary>
    ''' A NamespaceExtent represents whether a namespace contains types and sub-namespaces from a particular module,
    ''' assembly, or merged across all modules (source and metadata) in a particular compilation.
    ''' </summary>
    Partial Friend Structure NamespaceExtent
        Private ReadOnly _kind As NamespaceKind
        Private ReadOnly _symbolOrCompilation As Object
 
        ''' <summary>
        ''' Returns what kind of extent: Module, Assembly, or Compilation.
        ''' </summary>
        Public ReadOnly Property Kind As NamespaceKind
            Get
                Return _kind
            End Get
        End Property
 
        ''' <summary>
        ''' If the Kind is ExtendKind.Module, returns the module symbol that this namespace
        ''' encompasses. Otherwise throws InvalidOperationException.
        ''' </summary>
        Public ReadOnly Property [Module] As ModuleSymbol
            Get
                If Kind = NamespaceKind.Module Then
                    Return DirectCast(_symbolOrCompilation, ModuleSymbol)
                Else
                    Throw New InvalidOperationException()
                End If
            End Get
        End Property
 
        ''' <summary>
        ''' If the Kind is ExtendKind.Assembly, returns the assembly symbol that this namespace
        ''' encompasses. Otherwise throws InvalidOperationException.
        ''' </summary>
        Public ReadOnly Property Assembly As AssemblySymbol
            Get
                If Kind = NamespaceKind.Assembly Then
                    Return DirectCast(_symbolOrCompilation, AssemblySymbol)
                Else
                    Throw New InvalidOperationException()
                End If
            End Get
        End Property
 
        ''' <summary>
        ''' If the Kind is ExtendKind.Compilation, returns the compilation symbol that this namespace
        ''' encompasses. Otherwise throws InvalidOperationException.
        ''' </summary>
        Public ReadOnly Property Compilation As VisualBasicCompilation
            Get
                If Kind = NamespaceKind.Compilation Then
                    Return DirectCast(_symbolOrCompilation, VisualBasicCompilation)
                Else
                    Throw New InvalidOperationException()
                End If
            End Get
        End Property
 
        Public Overrides Function ToString() As String
            Return String.Format("{0}: {1}", Kind.ToString(), _symbolOrCompilation.ToString())
        End Function
 
        ''' <summary>
        ''' Create a NamespaceExtent that represents a given ModuleSymbol.
        ''' </summary>
        Friend Sub New([module] As ModuleSymbol)
            _kind = NamespaceKind.Module
            _symbolOrCompilation = [module]
        End Sub
 
        ''' <summary>
        ''' Create a NamespaceExtent that represents a given AssemblySymbol.
        ''' </summary>
        Friend Sub New(assembly As AssemblySymbol)
            _kind = NamespaceKind.Assembly
            _symbolOrCompilation = assembly
        End Sub
 
        ''' <summary>
        ''' Create a NamespaceExtent that represents a given Compilation.
        ''' </summary>
        Friend Sub New(compilation As VisualBasicCompilation)
            _kind = NamespaceKind.Compilation
            _symbolOrCompilation = compilation
        End Sub
 
#If DEBUG Then
        Shared Sub New()
 
            ' Below is a set of compile time asserts, they break build if violated.
 
            ' Assert(NamespaceKind.Compilation <> NamespaceKindNamespaceGroup)
            Const assert1 As Integer = 1 Mod (NamespaceKind.Compilation - NamespaceKindNamespaceGroup)
 
            ' Assert(NamespaceKind.Assembly <> NamespaceKindNamespaceGroup)
            Const assert2 As Integer = 1 Mod (NamespaceKind.Assembly - NamespaceKindNamespaceGroup)
 
            ' Assert(NamespaceKind.Module <> NamespaceKindNamespaceGroup)
            Const assert3 As Integer = 1 Mod (NamespaceKind.Module - NamespaceKindNamespaceGroup)
 
            Dim dummy = assert1 + assert2 + assert3
        End Sub
#End If
    End Structure
End Namespace