예제 #1
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);
            }
        }
예제 #2
0
        public static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context)
        {
            var methodDeclaration = (MethodDeclarationSyntax)context.Node;

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

            if (methodDeclaration.Identifier.ValueText.EndsWith("Async", StringComparison.Ordinal))
            {
                return;
            }

            if (methodDeclaration.Body?.Statements.Any() == false)
            {
                return;
            }

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

            if (methodSymbol?.IsAsync != true)
            {
                return;
            }

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

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

            DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.AsynchronousMethodNameShouldEndWithAsync, methodDeclaration.Identifier);
        }
예제 #3
0
        private static bool IsAnalyzable(ISymbol symbol)
        {
            switch (symbol.Kind)
            {
            case SymbolKind.Namespace:
            {
                return(false);
            }

            case SymbolKind.NamedType:
            {
                var namedType = (INamedTypeSymbol)symbol;

                return(namedType.TypeKind != TypeKind.Class ||
                       !namedType.IsStatic);
            }

            case SymbolKind.Event:
            {
                var eventSymbol = (IEventSymbol)symbol;

                return(eventSymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty &&
                       !eventSymbol.ImplementsInterfaceMember(allInterfaces: true));
            }

            case SymbolKind.Field:
            {
                var fieldSymbol = (IFieldSymbol)symbol;

                return(!fieldSymbol.ImplementsInterfaceMember(allInterfaces: true));
            }

            case SymbolKind.Property:
            {
                var propertySymbol = (IPropertySymbol)symbol;

                return(propertySymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty &&
                       !propertySymbol.ImplementsInterfaceMember(allInterfaces: true));
            }

            case SymbolKind.Method:
            {
                var methodSymbol = (IMethodSymbol)symbol;

                switch (methodSymbol.MethodKind)
                {
                case MethodKind.Ordinary:
                {
                    return(methodSymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty &&
                           !SymbolUtility.CanBeEntryPoint(methodSymbol) &&
                           !methodSymbol.ImplementsInterfaceMember(allInterfaces: true));
                }

                case MethodKind.Constructor:
                {
                    return(true);
                }
                }

                return(false);
            }

            default:
            {
                Debug.Fail(symbol.Kind.ToString());
                return(false);
            }
            }
        }