File: Microsoft.NetCore.Analyzers\Runtime\BasicForwardCancellationTokenToInvocations.Analyzer.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.Collections.Immutable
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Operations
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.NetCore.Analyzers.Runtime

Namespace Microsoft.NetCore.VisualBasic.Analyzers.Runtime

    <DiagnosticAnalyzer(LanguageNames.VisualBasic)>
    Public NotInheritable Class BasicForwardCancellationTokenToInvocationsAnalyzer

        Inherits ForwardCancellationTokenToInvocationsAnalyzer

        Protected Overrides Function GetInvocationMethodNameNode(invocationNode As SyntaxNode) As SyntaxNode

            Dim invocationExpression = TryCast(invocationNode, InvocationExpressionSyntax)

            If invocationExpression IsNot Nothing Then

                Dim memberBindingExpression = TryCast(invocationExpression.Expression, MemberAccessExpressionSyntax)

                If memberBindingExpression IsNot Nothing Then

                    Return memberBindingExpression.Name

                End If

                Return invocationExpression.Expression

            End If

            Return Nothing

        End Function

        Protected Overrides Function ArgumentsImplicitOrNamed(cancellationTokenType As INamedTypeSymbol, arguments As ImmutableArray(Of IArgumentOperation)) As Boolean

            Return arguments.Any(Function(a)

                                     If a.IsImplicit AndAlso Not a.Parameter.Type.Equals(cancellationTokenType) Then
                                         Return True
                                     End If

                                     Dim argumentNode As ArgumentSyntax = TryCast(a.Syntax, ArgumentSyntax)

                                     Return argumentNode IsNot Nothing AndAlso argumentNode.IsNamed

                                 End Function)

        End Function

    End Class

End Namespace