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); } }
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); } }
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); } }