File: Symbols\ExtendedErrorTypeSymbol.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.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
 
    ''' <summary>
    ''' An error type symbol with name and diagnostic. More info can be added in the future.
    ''' </summary>
    ''' <remarks></remarks>
    Friend NotInheritable Class ExtendedErrorTypeSymbol
        Inherits InstanceErrorTypeSymbol
 
        Private ReadOnly _diagnosticInfo As DiagnosticInfo
        Private ReadOnly _reportErrorWhenReferenced As Boolean
        Private ReadOnly _name As String
 
        ' Best guess at what user meant, and why they weren't accepted.
        Private ReadOnly _candidateSymbols As ImmutableArray(Of Symbol)
        Private ReadOnly _resultKind As LookupResultKind
 
        Private ReadOnly _containingSymbol As NamespaceOrTypeSymbol
 
        ' Only compiler creates an error symbol.
        Friend Sub New(errorInfo As DiagnosticInfo,
                       Optional reportErrorWhenReferenced As Boolean = False,
                       Optional nonErrorGuessType As NamedTypeSymbol = Nothing)
            Me.New(errorInfo, String.Empty, 0, reportErrorWhenReferenced, nonErrorGuessType)
        End Sub
 
        Friend Sub New(errorInfo As DiagnosticInfo,
                       name As String,
                       Optional reportErrorWhenReferenced As Boolean = False,
                       Optional nonErrorGuessType As NamedTypeSymbol = Nothing)
            Me.New(errorInfo, name, 0, reportErrorWhenReferenced, nonErrorGuessType)
        End Sub
 
        Friend Sub New(errorInfo As DiagnosticInfo,
                       name As String,
                       arity As Integer,
                       candidateSymbols As ImmutableArray(Of Symbol),
                       resultKind As LookupResultKind,
                       Optional reportErrorWhenReferenced As Boolean = False)
            MyBase.New(arity)
            Debug.Assert(errorInfo Is Nothing OrElse errorInfo.Severity = DiagnosticSeverity.Error)
 
            _name = name
            _diagnosticInfo = errorInfo
            _reportErrorWhenReferenced = reportErrorWhenReferenced
 
            If candidateSymbols.Length = 1 AndAlso
               candidateSymbols(0).Kind = SymbolKind.Namespace AndAlso
               DirectCast(candidateSymbols(0), NamespaceSymbol).NamespaceKind = NamespaceKindNamespaceGroup Then
                _candidateSymbols = StaticCast(Of Symbol).From(DirectCast(candidateSymbols(0), NamespaceSymbol).ConstituentNamespaces)
            Else
                _candidateSymbols = candidateSymbols
            End If
 
#If DEBUG Then
            For Each item In _candidateSymbols
                Debug.Assert(item.Kind <> SymbolKind.Namespace OrElse DirectCast(item, NamespaceSymbol).NamespaceKind <> NamespaceKindNamespaceGroup)
            Next
#End If
            _resultKind = resultKind
        End Sub
 
        Friend Sub New(errorInfo As DiagnosticInfo,
                       name As String,
                       arity As Integer,
                       Optional reportErrorWhenReferenced As Boolean = False,
                       Optional nonErrorGuessType As NamedTypeSymbol = Nothing)
            MyBase.New(arity)
            Debug.Assert(errorInfo Is Nothing OrElse errorInfo.Severity = DiagnosticSeverity.Error)
 
            _name = name
            _diagnosticInfo = errorInfo
            _reportErrorWhenReferenced = reportErrorWhenReferenced
            If nonErrorGuessType IsNot Nothing Then
                _candidateSymbols = ImmutableArray.Create(Of Symbol)(nonErrorGuessType)
                _resultKind = LookupResultKind.NotATypeOrNamespace ' TODO: Replace.
            Else
                _candidateSymbols = ImmutableArray(Of Symbol).Empty
                _resultKind = LookupResultKind.Empty
            End If
        End Sub
 
        Friend Sub New(containingSymbol As NamespaceOrTypeSymbol,
                       name As String,
                       arity As Integer)
            Me.New(DirectCast(Nothing, DiagnosticInfo), name, arity)
            Me._containingSymbol = containingSymbol
        End Sub
 
        Public Overrides ReadOnly Property ContainingSymbol As Symbol
            Get
                Return _containingSymbol
            End Get
        End Property
 
        Public Overrides ReadOnly Property CandidateSymbols As ImmutableArray(Of Symbol)
            Get
                Return _candidateSymbols
            End Get
        End Property
 
        Friend Overrides ReadOnly Property ResultKind As LookupResultKind
            Get
                Return _resultKind
            End Get
        End Property
 
        ''' <summary>
        ''' Returns information about the reason that this type is in error.
        ''' </summary>
        Friend Overrides ReadOnly Property ErrorInfo As DiagnosticInfo
            Get
                Return _diagnosticInfo
            End Get
        End Property
 
        Friend Overrides Function GetUseSiteInfo() As UseSiteInfo(Of AssemblySymbol)
            If _reportErrorWhenReferenced Then
                Return New UseSiteInfo(Of AssemblySymbol)(Me.ErrorInfo)
            End If
 
            Return Nothing
        End Function
 
        Public Overrides ReadOnly Property Name As String
            Get
                Return _name
            End Get
        End Property
 
        Friend Overrides ReadOnly Property MangleName As Boolean
            Get
                Return Arity > 0
            End Get
        End Property
 
        Protected Overrides Function SpecializedEquals(obj As InstanceErrorTypeSymbol) As Boolean
            Debug.Assert(obj IsNot Me)
 
            '' Error type symbols representing errors that have been reported compare based on the full
            '' name of the potential type they are representing.  If not reported, subclasses of ErrorTypeSymbol
            '' (such as MissingMetadataTypeSymbol) can define a more refined Equals relation.
            Dim other As ExtendedErrorTypeSymbol = TryCast(obj, ExtendedErrorTypeSymbol)
            If other Is Nothing Then
                Return False
            End If
 
            Return Object.Equals(Me.ContainingSymbol, other.ContainingSymbol) AndAlso String.Equals(Me.Name, other.Name, StringComparison.Ordinal) AndAlso Me.Arity = other.Arity
        End Function
 
        Public Overrides Function GetHashCode() As Integer
            Return Hash.Combine(Me.Arity,
                    Hash.Combine(If(Me.ContainingSymbol Is Nothing, 0, Me.ContainingSymbol.GetHashCode()),
                                 If(Me.Name Is Nothing, 0, Me.Name.GetHashCode())))
        End Function
    End Class
End Namespace