public override void Initialize(AnalysisContext context) { context.EnableConcurrentExecution(); context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze); context.RegisterCompilationStartAction(compilationStartAnalysisContext => { INamedTypeSymbol?requiredAttributeType = null; if (RequiresAttributeOnMethod && (requiredAttributeType = GetRequiredAttributeType(compilationStartAnalysisContext.Compilation)) == null) { return; } var disallowedCatchTypes = GetDisallowedCatchTypes(compilationStartAnalysisContext.Compilation); compilationStartAnalysisContext.RegisterOperationBlockAction(operationBlockAnalysisContext => { if (operationBlockAnalysisContext.OwningSymbol.Kind != SymbolKind.Method) { return; } var method = (IMethodSymbol)operationBlockAnalysisContext.OwningSymbol; if (RequiresAttributeOnMethod && !method.HasAttribute(requiredAttributeType)) { return; } if (_allowExcludedSymbolNames && operationBlockAnalysisContext.Options.IsConfiguredToSkipAnalysis(SupportedDiagnostics[0], method, operationBlockAnalysisContext.Compilation)) { return; } foreach (var operation in operationBlockAnalysisContext.OperationBlocks) { var walker = new DisallowGeneralCatchUnlessRethrowWalker(IsDisallowedCatchType, _shouldCheckLambdas); walker.Visit(operation); foreach (var catchClause in walker.CatchClausesForDisallowedTypesWithoutRethrow) { operationBlockAnalysisContext.ReportDiagnostic(CreateDiagnostic(method, catchClause.Syntax.GetFirstToken())); } } bool IsDisallowedCatchType(INamedTypeSymbol type) => disallowedCatchTypes.Contains(type) || IsConfiguredDisallowedExceptionType(type, method, compilationStartAnalysisContext.Compilation, compilationStartAnalysisContext.Options, compilationStartAnalysisContext.CancellationToken); }); }); }
public override void Initialize(AnalysisContext analysisContext) { analysisContext.EnableConcurrentExecution(); analysisContext.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze); analysisContext.RegisterCompilationStartAction(compilationStartAnalysisContext => { INamedTypeSymbol requiredAttributeType = null; if (RequiresAttributeOnMethod && (requiredAttributeType = GetRequiredAttributeType(compilationStartAnalysisContext.Compilation)) == null) { return; } var disallowedCatchTypes = GetDisallowedCatchTypes(compilationStartAnalysisContext.Compilation); compilationStartAnalysisContext.RegisterOperationBlockAction(operationBlockAnalysisContext => { if (operationBlockAnalysisContext.OwningSymbol.Kind != SymbolKind.Method) { return; } var method = (IMethodSymbol)operationBlockAnalysisContext.OwningSymbol; if (RequiresAttributeOnMethod && !MethodHasAttribute(method, requiredAttributeType)) { return; } foreach (var operation in operationBlockAnalysisContext.OperationBlocks) { var walker = new DisallowGeneralCatchUnlessRethrowWalker(disallowedCatchTypes, _shouldCheckLambdas); walker.Visit(operation); foreach (var catchClause in walker.CatchClausesForDisallowedTypesWithoutRethrow) { operationBlockAnalysisContext.ReportDiagnostic(CreateDiagnostic(method, catchClause.Syntax)); } } }); }); }