File: Microsoft.NetCore.Analyzers\Runtime\BasicUseSpanBasedStringConcat.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.Operations
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis
 
Namespace Microsoft.NetCore.VisualBasic.Analyzers.Runtime
 
    <DiagnosticAnalyzer(LanguageNames.VisualBasic)>
    Public NotInheritable Class BasicUseSpanBasedStringConcat : Inherits UseSpanBasedStringConcat
 
        Private Protected Overrides Function IsTopMostConcatOperation(binaryOperation As IBinaryOperation) As Boolean
            If Not IsStringConcatOperation(binaryOperation) Then
                Return False
            End If
 
            Dim parentBinaryOperation = TryCast(WalkUpImplicitConversionToObject(binaryOperation.Parent), IBinaryOperation)
            Return parentBinaryOperation Is Nothing OrElse Not IsStringConcatOperation(parentBinaryOperation)
        End Function
 
        Private Protected Overrides Function WalkDownBuiltInImplicitConversionOnConcatOperand(operand As IOperation) As IOperation
 
            Return BasicWalkDownBuiltInImplicitConversionOnConcatOperand(operand)
        End Function
 
        Private Shared Function IsStringConcatOperation(operation As IBinaryOperation) As Boolean
 
            'OperatorKind will be Concatenate even when the "+" operator is used, provided both operands are strings.
            Return operation.OperatorKind = BinaryOperatorKind.Concatenate
        End Function
 
        Private Shared Function WalkUpImplicitConversionToObject(operation As IOperation) As IOperation
 
            Dim conversion = TryCast(operation, IConversionOperation)
            If conversion IsNot Nothing AndAlso conversion.Type.SpecialType = SpecialType.System_Object AndAlso
                conversion.IsImplicit AndAlso Not conversion.Conversion.IsUserDefined Then
                Return conversion.Parent
            Else
                Return operation
            End If
        End Function
    End Class
End Namespace