File: Declarations\SingleTypeDeclaration.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 Microsoft.CodeAnalysis.VisualBasic.Symbols
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
    Friend Class SingleTypeDeclaration
        Inherits SingleNamespaceOrTypeDeclaration
 
        Private ReadOnly _children As ImmutableArray(Of SingleTypeDeclaration)
 
        ' CONSIDER: It may be possible to merge the flags and arity into a single
        ' 32-bit quantity if space is needed.
 
        Private ReadOnly _kind As DeclarationKind
        Private ReadOnly _flags As TypeDeclarationFlags
        Private ReadOnly _arity As UShort
        Private ReadOnly _modifiers As DeclarationModifiers
 
        Public ReadOnly QuickAttributes As QuickAttributes
 
        Friend Enum TypeDeclarationFlags As Byte
            None = 0
            HasAnyAttributes = 1 << 1
            HasBaseDeclarations = 1 << 2
            AnyMemberHasAttributes = 1 << 3
            HasAnyNontypeMembers = 1 << 4
        End Enum
 
        Public Sub New(kind As DeclarationKind,
                       name As String,
                       arity As Integer,
                       modifiers As DeclarationModifiers,
                       declFlags As TypeDeclarationFlags,
                       syntaxReference As SyntaxReference,
                       nameLocation As Location,
                       memberNames As ImmutableHashSet(Of String),
                       children As ImmutableArray(Of SingleTypeDeclaration),
                       quickAttributes As QuickAttributes)
            MyBase.New(name, syntaxReference, nameLocation)
 
            Debug.Assert(kind <> DeclarationKind.Namespace)
 
            Me._kind = kind
            Me._arity = CUShort(arity)
            Me._flags = declFlags
            Me._modifiers = modifiers
            Me.MemberNames = memberNames
            Me._children = children
            Me.QuickAttributes = quickAttributes
        End Sub
 
        Public Overrides ReadOnly Property Kind As DeclarationKind
            Get
                Return Me._kind
            End Get
        End Property
 
        Public ReadOnly Property Arity As Integer
            Get
                Return _arity
            End Get
        End Property
 
        Public ReadOnly Property HasAnyAttributes As Boolean
            Get
                Return (_flags And TypeDeclarationFlags.HasAnyAttributes) <> 0
            End Get
        End Property
 
        Public ReadOnly Property HasBaseDeclarations As Boolean
            Get
                Return (_flags And TypeDeclarationFlags.HasBaseDeclarations) <> 0
            End Get
        End Property
 
        Public ReadOnly Property HasAnyNontypeMembers As Boolean
            Get
                Return (_flags And TypeDeclarationFlags.HasAnyNontypeMembers) <> 0
            End Get
        End Property
 
        Public ReadOnly Property AnyMemberHasAttributes As Boolean
            Get
                Return (_flags And TypeDeclarationFlags.AnyMemberHasAttributes) <> 0
            End Get
        End Property
 
        Public Overloads ReadOnly Property Children As ImmutableArray(Of SingleTypeDeclaration)
            Get
                Return _children
            End Get
        End Property
 
        Public ReadOnly Property Modifiers As DeclarationModifiers
            Get
                Return Me._modifiers
            End Get
        End Property
 
        Public ReadOnly Property MemberNames As ImmutableHashSet(Of String)
 
        Protected Overrides Function GetNamespaceOrTypeDeclarationChildren() As ImmutableArray(Of SingleNamespaceOrTypeDeclaration)
            Return StaticCast(Of SingleNamespaceOrTypeDeclaration).From(_children)
        End Function
 
        Private Function GetEmbeddedSymbolKind() As EmbeddedSymbolKind
            Return SyntaxReference.SyntaxTree.GetEmbeddedKind()
        End Function
 
        Private NotInheritable Class Comparer
            Implements IEqualityComparer(Of SingleTypeDeclaration)
 
            Private Shadows Function Equals(decl1 As SingleTypeDeclaration, decl2 As SingleTypeDeclaration) As Boolean Implements IEqualityComparer(Of SingleTypeDeclaration).Equals
                ' We should not merge types across embedded code / user code boundary.
                Return IdentifierComparison.Equals(decl1.Name, decl2.Name) _
                        AndAlso decl1.Kind = decl2.Kind _
                        AndAlso decl1.Kind <> DeclarationKind.Enum _
                        AndAlso decl1.Arity = decl2.Arity _
                        AndAlso decl1.GetEmbeddedSymbolKind() = decl2.GetEmbeddedSymbolKind()
            End Function
 
            Private Shadows Function GetHashCode(decl1 As SingleTypeDeclaration) As Integer Implements IEqualityComparer(Of SingleTypeDeclaration).GetHashCode
                Return Hash.Combine(IdentifierComparison.GetHashCode(decl1.Name), Hash.Combine(decl1.Arity.GetHashCode(), CType(decl1.Kind, Integer)))
            End Function
        End Class
 
        Public Shared ReadOnly EqualityComparer As IEqualityComparer(Of SingleTypeDeclaration) = New Comparer()
    End Class
End Namespace