Пример #1
0
        protected override void AnalyzeNode(SyntaxNodeAnalysisContext context)
        {
            AnalyzerCanContinueMethodResult result = GetContinuationResult(context);

            if (!result.CanContinue)
            {
                return;
            }

            INamedTypeSymbol taskType = context.Compilation.GetTypeByMetadataName(_taskType);
            INamedTypeSymbol voidType = context.Compilation.GetSpecialType(SpecialType.System_Void);

            if (!Equals(result.ReturnTypeSymbol, voidType) &&
                result.ReturnTypeSymbol != null &&
                (result.MethodSymbol.IsAsync ||
                 Equals(result.ReturnTypeSymbol, taskType) ||
                 string.Equals(_genericTaskType, result.ReturnTypeSymbol.ConstructedFrom.ToString())))
            {
                INamedTypeSymbol cancellationToken          = context.Compilation.GetTypeByMetadataName(_cancellationTokenType);
                IParameterSymbol cancellationTokenParameter = result.MethodSymbol.Parameters.FirstOrDefault(d => d.Type == cancellationToken);

                if (cancellationTokenParameter == null)
                {
                    ReportDiagnosticResult(context, context.Node);
                }
            }
        }
        protected override void AnalyzeNode(SyntaxNodeAnalysisContext context)
        {
            AnalyzerCanContinueMethodResult result = GetContinuationResult(context);

            if (!result.CanContinue)
            {
                return;
            }

            INamedTypeSymbol voidType = context.Compilation.GetSpecialType(SpecialType.System_Void);

            if (result.MethodSymbol.IsAsync &&
                Equals(result.MethodSymbol?.ReturnType, voidType))
            {
                if (!(context.ContainingSymbol is IMethodSymbol currentMethodSymbol))
                {
                    return;
                }

                INamedTypeSymbol cancellationToken = context.Compilation.GetTypeByMetadataName(_cancellationTokenType);
                IParameterSymbol currentMethodCancellationToken = currentMethodSymbol.Parameters.FirstOrDefault(d => d.Type == cancellationToken);
                IParameterSymbol cancellationTokenParameter     = result.MethodSymbol.Parameters.FirstOrDefault(d => d.Type == cancellationToken);
                if (cancellationTokenParameter == null && currentMethodCancellationToken != null)
                {
                    ReportDiagnosticResult(context, context.Node);
                }
            }
        }
        protected override void AnalyzeNode(SyntaxNodeAnalysisContext context)
        {
            AnalyzerCanContinueMethodResult result = GetContinuationResult(context);

            if (!result.CanContinue)
            {
                return;
            }

            INamedTypeSymbol voidType = context.Compilation.GetSpecialType(SpecialType.System_Void);

            if (result.MethodSymbol.IsAsync &&
                Equals(result.MethodSymbol?.ReturnType, voidType) &&
                !result.MethodSymbol.Name.EndsWith(_asyncSuffix))
            {
                ReportDiagnosticResult(context, context.Node);
            }
        }
Пример #4
0
        protected override void AnalyzeSymbol(SymbolAnalysisContext context)
        {
            AnalyzerCanContinueMethodResult result = GetContinuationResult(context);

            if (!result.CanContinue)
            {
                return;
            }

            INamedTypeSymbol taskType = context.Compilation.GetTypeByMetadataName(_taskType);
            INamedTypeSymbol voidType = context.Compilation.GetSpecialType(SpecialType.System_Void);

            if (!Equals(result.ReturnTypeSymbol, voidType) &&
                result.ReturnTypeSymbol != null &&
                (result.MethodSymbol.IsAsync ||
                 Equals(result.ReturnTypeSymbol, taskType) ||
                 string.Equals(_genericTaskType, result.ReturnTypeSymbol.ConstructedFrom.ToString())) &&
                !result.MethodSymbol.Name.EndsWith(_asyncSuffix))
            {
                ReportDiagnosticResult(context, context.Symbol);
            }
        }
Пример #5
0
        protected override void AnalyzeSymbol(SymbolAnalysisContext context)
        {
            AnalyzerCanContinueMethodResult result = GetContinuationResult(context);

            if (!result.CanContinue)
            {
                return;
            }

            List <IParameterSymbol> parameters = result.MethodSymbol.Parameters.ToList();

            if (parameters.Count <= 1)
            {
                return;
            }

            INamedTypeSymbol cancellationToken          = context.Compilation.GetTypeByMetadataName(_cancellationTokenType);
            IParameterSymbol cancellationTokenParameter = parameters.SingleOrDefault(parameterSymbol => Equals(parameterSymbol.Type, cancellationToken));

            if (cancellationTokenParameter == null)
            {
                return;
            }

            int index = parameters.IndexOf(cancellationTokenParameter);

            if (index == -1)
            {
                return;
            }

            if (index != parameters.Count - 1)
            {
                ReportDiagnosticResult(context, cancellationTokenParameter);
            }
        }