File: Microsoft.NetCore.Analyzers\Runtime\BasicPreferDictionaryContainsMethods.Fixer.vb
Web Access
Project: ..\..\..\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 Microsoft.NetCore.Analyzers.Runtime
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports System.Threading
Imports Microsoft.CodeAnalysis.Editing
Imports Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.NetCore.Analyzers
 
Namespace Microsoft.NetCore.VisualBasic.Analyzers.Runtime
    <ExportCodeFixProvider(LanguageNames.VisualBasic)>
    Public NotInheritable Class BasicPreferDictionaryContainsMethodsFixer : Inherits PreferDictionaryContainsMethodsFixer
 
        Public Overrides Async Function RegisterCodeFixesAsync(context As CodeFixContext) As Task
            Dim doc = context.Document
            Dim root = Await doc.GetSyntaxRootAsync().ConfigureAwait(False)
 
            Dim invocation = TryCast(root.FindNode(context.Span), InvocationExpressionSyntax)
            If invocation Is Nothing Then
                Return
            End If
 
            Dim containsMemberAccess = TryCast(invocation.Expression, MemberAccessExpressionSyntax)
            If containsMemberAccess Is Nothing Then
                Return
            End If
 
            Dim keysOrValuesMember = TryCast(containsMemberAccess.Expression, MemberAccessExpressionSyntax)
            If keysOrValuesMember Is Nothing Then
                Return
            End If
 
            If keysOrValuesMember.Name.Identifier.ValueText = PreferDictionaryContainsMethods.KeysPropertyName Then
                Dim ReplaceWithContainsKey =
                    Async Function(ct As CancellationToken) As Task(Of Document)
                        Dim editor = Await DocumentEditor.CreateAsync(doc, ct).ConfigureAwait(False)
                        Dim containsKeyMemberExpression = editor.Generator.MemberAccessExpression(keysOrValuesMember.Expression, PreferDictionaryContainsMethods.ContainsKeyMethodName)
                        Dim newInvocation = editor.Generator.InvocationExpression(containsKeyMemberExpression, invocation.ArgumentList.Arguments)
                        editor.ReplaceNode(invocation, newInvocation)
 
                        Return editor.GetChangedDocument()
                    End Function
 
                Dim codeFixTitle = MicrosoftNetCoreAnalyzersResources.PreferDictionaryContainsKeyCodeFixTitle
                Dim action = CodeAction.Create(codeFixTitle, ReplaceWithContainsKey, codeFixTitle)
                context.RegisterCodeFix(action, context.Diagnostics)
 
            ElseIf keysOrValuesMember.Name.Identifier.ValueText = PreferDictionaryContainsMethods.ValuesPropertyName Then
                Dim ReplaceWithContainsValue =
                    Async Function(ct As CancellationToken) As Task(Of Document)
                        Dim editor = Await DocumentEditor.CreateAsync(doc, ct).ConfigureAwait(False)
                        Dim containsValueMemberExpression = editor.Generator.MemberAccessExpression(keysOrValuesMember.Expression, PreferDictionaryContainsMethods.ContainsValueMethodName)
                        Dim newInvocation = editor.Generator.InvocationExpression(containsValueMemberExpression, invocation.ArgumentList.Arguments)
                        editor.ReplaceNode(invocation, newInvocation)
 
                        Return editor.GetChangedDocument()
                    End Function
 
                Dim codeFixTitle = MicrosoftNetCoreAnalyzersResources.PreferDictionaryContainsValueCodeFixTitle
                Dim action = CodeAction.Create(codeFixTitle, ReplaceWithContainsValue, codeFixTitle)
                context.RegisterCodeFix(action, context.Diagnostics)
            End If
        End Function
    End Class
End Namespace