File: Microsoft.NetCore.Analyzers\Runtime\BasicPreferDictionaryContainsMethods.Fixer.vb
Web Access
Project: src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Microsoft.CodeAnalysis.VisualBasic.NetAnalyzers\Microsoft.CodeAnalysis.VisualBasic.NetAnalyzers.vbproj (Microsoft.CodeAnalysis.VisualBasic.NetAnalyzers)
' Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the MIT license.  See License.txt in the project root for license information.

Imports System.Composition
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Editing
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.NetCore.Analyzers.Runtime

Namespace Microsoft.NetCore.VisualBasic.Analyzers.Runtime
    <ExportCodeFixProvider(LanguageNames.VisualBasic), [Shared]>
    Public NotInheritable Class BasicPreferDictionaryContainsMethodsFixer : Inherits PreferDictionaryContainsMethodsFixer

        Protected Overrides Function GetPropertyName(invocation As SyntaxNode) As String
            Dim keysOrValuesMember = GetKeysOrValuesMemberAccess(invocation)
            If keysOrValuesMember Is Nothing Then
                Return Nothing
            End If

            Return keysOrValuesMember.Name.Identifier.ValueText
        End Function

        Protected Overrides Function Rewrite(invocation As SyntaxNode, methodName As String, generator As SyntaxGenerator) As SyntaxNode
            Dim keysOrValuesMember = GetKeysOrValuesMemberAccess(invocation)
            If keysOrValuesMember Is Nothing Then
                Return Nothing
            End If

            Dim containsMemberExpression = generator.MemberAccessExpression(keysOrValuesMember.Expression, methodName)
            Return generator.InvocationExpression(containsMemberExpression, DirectCast(invocation, InvocationExpressionSyntax).ArgumentList.Arguments)
        End Function

        Private Shared Function GetKeysOrValuesMemberAccess(node As SyntaxNode) As MemberAccessExpressionSyntax
            Dim invocation = TryCast(node, InvocationExpressionSyntax)
            If invocation Is Nothing Then
                Return Nothing
            End If

            Dim containsMemberAccess = TryCast(invocation.Expression, MemberAccessExpressionSyntax)
            If containsMemberAccess Is Nothing Then
                Return Nothing
            End If

            Return TryCast(containsMemberAccess.Expression, MemberAccessExpressionSyntax)
        End Function
    End Class
End Namespace