File: Microsoft.NetCore.Analyzers\Performance\BasicUseStringMethodCharOverloadWithSingleCharacters.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.Collections.Immutable
Imports System.Composition
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Operations
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.NetCore.Analyzers.Performance

Namespace Microsoft.NetCore.VisualBasic.Analyzers.Performance
    <ExportCodeFixProvider(LanguageNames.VisualBasic), [Shared]>
    Public NotInheritable Class BasicUseStringMethodCharOverloadWithSingleCharactersFixer
        Inherits UseStringMethodCharOverloadWithSingleCharactersFixer

        Protected Overrides Function TryGetChar(model As SemanticModel, argumentListNode As SyntaxNode, ByRef c As Char) As Boolean
            If TypeOf argumentListNode IsNot ArgumentListSyntax Then
                Return False
            End If

            Dim argumentList = CType(argumentListNode, ArgumentListSyntax)

            Dim stringArgumentNode As ArgumentSyntax = Nothing
            For Each argument In argumentList.Arguments
                Dim argumentOperation = TryCast(model.GetOperation(argument), IArgumentOperation)

                If argumentOperation?.Parameter IsNot Nothing AndAlso argumentOperation.Parameter.Ordinal = 0 Then
                    stringArgumentNode = argument
                    Exit For
                End If
            Next

            If stringArgumentNode IsNot Nothing And TypeOf stringArgumentNode.GetExpression() Is LiteralExpressionSyntax Then
                Return TryGetCharFromLiteralExpressionSyntax(CType(stringArgumentNode.GetExpression(), LiteralExpressionSyntax), c)
            End If

            Return False
        End Function

        Protected Overrides Function GetArguments(argumentListNode As SyntaxNode) As ImmutableArray(Of SyntaxNode)
            Return CType(argumentListNode, ArgumentListSyntax).Arguments.Cast(Of SyntaxNode)().ToImmutableArray()
        End Function

        Protected Overrides Function CreateArgumentList(arguments As IEnumerable(Of SyntaxNode)) As SyntaxNode
            Return SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(arguments.Cast(Of ArgumentSyntax)()))
        End Function

        Private Shared Function TryGetCharFromLiteralExpressionSyntax(sourceLiteralExpressionSyntax As LiteralExpressionSyntax, ByRef parsedCharLiteral As Char) As Boolean
            If TypeOf sourceLiteralExpressionSyntax.Token.Value IsNot String Then
                Return False
            End If

            Dim sourceLiteralValue = CType(sourceLiteralExpressionSyntax.Token.Value, String)
            If Char.TryParse(sourceLiteralValue, parsedCharLiteral) Then
                Return True
            End If

            Return False
        End Function
    End Class
End Namespace