コード例 #1
0
        private static void AddCallToConfigureAwait(SyntaxNodeAnalysisContext context)
        {
            var awaitExpression = (AwaitExpressionSyntax)context.Node;

            ExpressionSyntax expression = awaitExpression.Expression;

            if (IsConfigureAwait(expression))
            {
                return;
            }

            ITypeSymbol typeSymbol = context.SemanticModel.GetTypeSymbol(expression, context.CancellationToken);

            if (typeSymbol == null)
            {
                return;
            }

            if (!SymbolUtility.IsAwaitable(typeSymbol))
            {
                return;
            }

            DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.AddCallToConfigureAwaitOrViceVersa, awaitExpression.Expression, AnalyzerOptions.RemoveCallToConfigureAwait);
        }
コード例 #2
0
        public static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context, bool shouldCheckWindowsRuntimeTypes)
        {
            var methodDeclaration = (MethodDeclarationSyntax)context.Node;

            if (methodDeclaration.Modifiers.Contains(SyntaxKind.OverrideKeyword))
            {
                return;
            }

            if (methodDeclaration.Identifier.ValueText.EndsWith("Async", StringComparison.Ordinal))
            {
                IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration, context.CancellationToken);

                if (methodSymbol.IsAsync)
                {
                    return;
                }

                if (!methodSymbol.Name.EndsWith("Async", StringComparison.Ordinal))
                {
                    return;
                }

                if (SymbolUtility.IsAwaitable(methodSymbol.ReturnType, shouldCheckWindowsRuntimeTypes))
                {
                    return;
                }

                SyntaxToken identifier = methodDeclaration.Identifier;

                DiagnosticHelpers.ReportDiagnostic(context,
                                                   DiagnosticDescriptors.NonAsynchronousMethodNameShouldNotEndWithAsync,
                                                   identifier);

                DiagnosticHelpers.ReportDiagnostic(context,
                                                   DiagnosticDescriptors.NonAsynchronousMethodNameShouldNotEndWithAsyncFadeOut,
                                                   Location.Create(identifier.SyntaxTree, TextSpan.FromBounds(identifier.Span.End - 5, identifier.Span.End)));
            }
            else
            {
                IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration, context.CancellationToken);

                if (methodSymbol.Name.EndsWith("Async", StringComparison.Ordinal))
                {
                    return;
                }

                if (SymbolUtility.CanBeEntryPoint(methodSymbol))
                {
                    return;
                }

                if (!SymbolUtility.IsAwaitable(methodSymbol.ReturnType, shouldCheckWindowsRuntimeTypes))
                {
                    return;
                }

                DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.AsynchronousMethodNameShouldEndWithAsync, methodDeclaration.Identifier);
            }
        }
コード例 #3
0
        private static void AnalyzeAnonymousMethodExpression(SyntaxNodeAnalysisContext context)
        {
            var anonymousMethod = (AnonymousMethodExpressionSyntax)context.Node;

            if (anonymousMethod.AsyncKeyword.IsKind(SyntaxKind.AsyncKeyword))
            {
                return;
            }

            BlockSyntax body = anonymousMethod.Block;

            if (body == null)
            {
                return;
            }

            if (context.SemanticModel.GetSymbol(anonymousMethod, context.CancellationToken) is not IMethodSymbol methodSymbol)
            {
                return;
            }

            if (!SymbolUtility.IsAwaitable(methodSymbol.ReturnType))
            {
                return;
            }

            if (IsFixable(body, context))
            {
                DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.UseAsyncAwait, anonymousMethod);
            }
        }
コード例 #4
0
        private static void AnalyzeLocalFunctionStatement(SyntaxNodeAnalysisContext context)
        {
            var localFunction = (LocalFunctionStatementSyntax)context.Node;

            if (localFunction.Modifiers.Contains(SyntaxKind.AsyncKeyword))
            {
                return;
            }

            BlockSyntax body = localFunction.Body;

            if (body == null)
            {
                return;
            }

            if (!body.Statements.Any())
            {
                return;
            }

            IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(localFunction, context.CancellationToken);

            if (!SymbolUtility.IsAwaitable(methodSymbol.ReturnType))
            {
                return;
            }

            if (IsFixable(body, context))
            {
                DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.UseAsyncAwait, localFunction.Identifier);
            }
        }
コード例 #5
0
        private static void AnalyzeParenthesizedLambdaExpression(SyntaxNodeAnalysisContext context)
        {
            var parenthesizedLambda = (ParenthesizedLambdaExpressionSyntax)context.Node;

            if (parenthesizedLambda.AsyncKeyword.IsKind(SyntaxKind.AsyncKeyword))
            {
                return;
            }

            if (parenthesizedLambda.Body is not BlockSyntax body)
            {
                return;
            }

            if (context.SemanticModel.GetSymbol(parenthesizedLambda, context.CancellationToken) is not IMethodSymbol methodSymbol)
            {
                return;
            }

            if (!SymbolUtility.IsAwaitable(methodSymbol.ReturnType))
            {
                return;
            }

            if (IsFixable(body, context))
            {
                DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.UseAsyncAwait, parenthesizedLambda);
            }
        }