File: Symbols\MemberSignatureComparer.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 Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
 
Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
    ''' <summary>
    ''' This class provides an easy way to combine a MethodSignatureComparer and a PropertySignatureComparer
    ''' to create a unified MemberSignatureComparer (e.g. for use in a HashSet).
    ''' </summary>
    ''' <remarks></remarks>
    Friend Class MemberSignatureComparer
        Implements IEqualityComparer(Of Symbol)
 
        ''' <summary>
        ''' This instance is used to compare potential WinRT fake members in type projection.
        ''' 
        ''' FIXME(angocke): This is almost certainly wrong. The semantics of WinRT conflict 
        ''' comparison should probably match overload resolution (i.e., we should not add a member
        '''  to lookup that would result in ambiguity), but this is closer to what Dev12 does.
        ''' 
        ''' The real fix here is to establish a spec for how WinRT conflict comparison should be
        ''' performed. Once this is done we should remove these comments.
        ''' </summary>
        Public Shared ReadOnly WinRTComparer As MemberSignatureComparer =
            New MemberSignatureComparer(MethodSignatureComparer.WinRTConflictComparer,
                                        PropertySignatureComparer.WinRTConflictComparer,
                                        EventSignatureComparer.WinRTConflictComparer)
 
        Private ReadOnly _methodComparer As MethodSignatureComparer
        Private ReadOnly _propertyComparer As PropertySignatureComparer
        Private ReadOnly _eventComparer As EventSignatureComparer
 
        Private Sub New(methodComparer As MethodSignatureComparer,
                        propertyComparer As PropertySignatureComparer,
                        eventComparer As EventSignatureComparer)
            Me._methodComparer = methodComparer
            Me._propertyComparer = propertyComparer
            Me._eventComparer = eventComparer
        End Sub
 
        Public Overloads Function Equals(sym1 As Symbol, sym2 As Symbol) As Boolean _
            Implements IEqualityComparer(Of Symbol).Equals
 
            CheckSymbolKind(sym1)
            CheckSymbolKind(sym2)
 
            If sym1.Kind <> sym2.Kind Then
                Return False
            End If
 
            Select Case sym1.Kind
                Case SymbolKind.Method
                    Return _methodComparer.Equals(DirectCast(sym1, MethodSymbol), DirectCast(sym2, MethodSymbol))
                Case SymbolKind.Property
                    Return _propertyComparer.Equals(DirectCast(sym1, PropertySymbol), DirectCast(sym2, PropertySymbol))
                Case SymbolKind.Event
                    Return _eventComparer.Equals(DirectCast(sym1, EventSymbol), DirectCast(sym2, EventSymbol))
 
                Case Else
                    ' To prevent warning
                    Return False
            End Select
        End Function
 
        Public Overloads Function GetHashCode(sym As Symbol) As Integer _
            Implements IEqualityComparer(Of Symbol).GetHashCode
 
            Select Case sym.Kind
                Case SymbolKind.Method
                    Return _methodComparer.GetHashCode(DirectCast(sym, MethodSymbol))
                Case SymbolKind.Property
                    Return _propertyComparer.GetHashCode(DirectCast(sym, PropertySymbol))
                Case SymbolKind.Event
                    Return _eventComparer.GetHashCode(DirectCast(sym, EventSymbol))
 
                Case Else
                    Throw ExceptionUtilities.UnexpectedValue(sym.Kind)
            End Select
        End Function
 
        <Conditional("DEBUG")>
        Private Sub CheckSymbolKind(sym As Symbol)
            Select Case sym.Kind
                Case SymbolKind.Method, SymbolKind.Property, SymbolKind.Event
                    Exit Select
                Case Else
                    Debug.Assert(False, "Unexpected symbol kind: " & sym.Kind)
            End Select
        End Sub
    End Class
End Namespace