File: Microsoft.NetCore.Analyzers\Usage\BasicDoNotCompareSpanToNull.Fixer.vb
Web Access
Project: src\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 Analyzer.Utilities
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.NetCore.Analyzers
Imports Microsoft.NetCore.Analyzers.Usage

Namespace Microsoft.NetCore.VisualBasic.Analyzers.Tasks
    <ExportCodeFixProvider(LanguageNames.VisualBasic), [Shared]>
    Public Class BasicDoNotCompareSpanToNullFixer
        Inherits DoNotCompareSpanToNullFixer

        Public Overrides Async Function RegisterCodeFixesAsync(context As CodeFixContext) As Task
            Dim root = Await context.Document.GetRequiredSyntaxRootAsync(context.CancellationToken).ConfigureAwait(False)
            Dim condition = root.FindNode(context.Span, getInnermostNodeForTie:=True)
            Dim binaryExpression = TryCast(condition, BinaryExpressionSyntax)
            If binaryExpression Is Nothing Then
                Return
            End If

            Dim memberAccess As ExpressionSyntax = SyntaxFactory.MemberAccessExpression(
                SyntaxKind.SimpleMemberAccessExpression,
                GetComparatorExpression(binaryExpression).WithoutTrailingTrivia(),
                SyntaxFactory.Token(SyntaxKind.DotToken),
                SyntaxFactory.IdentifierName(IsEmpty)
            )

            If binaryExpression.IsKind(SyntaxKind.NotEqualsExpression) Then
                memberAccess = SyntaxFactory.NotExpression(memberAccess)
            End If

            Dim useIsEmptyCodeAction = CodeAction.Create(
                MicrosoftNetCoreAnalyzersResources.DoNotCompareSpanToNullIsEmptyCodeFixTitle,
                Function(ct) Task.FromResult(context.Document.WithSyntaxRoot(root.ReplaceNode(binaryExpression, memberAccess))),
                MicrosoftNetCoreAnalyzersResources.DoNotCompareSpanToNullIsEmptyCodeFixTitle
            )
            context.RegisterCodeFix(useIsEmptyCodeAction, context.Diagnostics)
        End Function

        Private Shared Function GetComparatorExpression(binaryExpression As BinaryExpressionSyntax) As ExpressionSyntax
            If binaryExpression.Left.IsKind(SyntaxKind.NothingLiteralExpression) Then
                Return binaryExpression.Right
            Else
                Return binaryExpression.Left
            End If
        End Function
    End Class
End Namespace