private bool CatchAnalyzerException(Exception e, DiagnosticAnalyzer analyzer, bool testOnly_DonotCatchAnalyzerExceptions) { DiagnosticAnalyzerLogger.LogAnalyzerCrashCount(analyzer, e, _logAggregator); if (testOnly_DonotCatchAnalyzerExceptions) { return(false); } if (AnalyzerHelper.IsBuiltInAnalyzer(analyzer)) { return(FatalError.ReportWithoutCrashUnlessCanceled(e)); } return(true); }
private async Task GetCompilationDiagnosticsAsync(DiagnosticAnalyzer analyzer, List <Diagnostic> diagnostics, Action <Project, DiagnosticAnalyzer, CancellationToken> forceAnalyzeAllDocuments) { Contract.ThrowIfFalse(_project.SupportsCompilation); var analyzerActionsAndDiagnostics = GetSessionAnalyzerActionsAndDiagnostics(analyzer); var analyzerActions = analyzerActionsAndDiagnostics.Item1; var compilation = await _project.GetCompilationAsync(_cancellationToken).ConfigureAwait(false); diagnostics.AddRange(CompilationWithAnalyzers.GetEffectiveDiagnostics(analyzerActionsAndDiagnostics.Item2, compilation)); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, analyzerActions, (DiagnosticLogAggregator)_logAggregator); if (analyzerActions == null || (analyzerActions.CompilationStartActionsCount == 0 && analyzerActions.CompilationEndActionsCount == 0)) { return; } using (var pooledObject = SharedPools.Default <List <Diagnostic> >().GetPooledObject()) { var localDiagnostics = pooledObject.Object; // Get all the analyzer actions, including the per-compilation actions. var allAnalyzerActions = await GetAnalyzerActionsAsync(analyzer, localDiagnostics.Add).ConfigureAwait(false); if (analyzerActions.CompilationEndActionsCount < allAnalyzerActions.CompilationEndActionsCount && forceAnalyzeAllDocuments != null) { if (allAnalyzerActions.CodeBlockEndActionsCount > analyzerActions.CodeBlockEndActionsCount || allAnalyzerActions.CodeBlockStartActionsCount > analyzerActions.CodeBlockStartActionsCount || allAnalyzerActions.SemanticModelActionsCount > analyzerActions.SemanticModelActionsCount || allAnalyzerActions.SymbolActionsCount > analyzerActions.SymbolActionsCount || allAnalyzerActions.SyntaxNodeActionsCount > analyzerActions.SyntaxNodeActionsCount || allAnalyzerActions.SyntaxTreeActionsCount > analyzerActions.SyntaxTreeActionsCount) { // Analyzer registered a compilation end action and at least one other analyzer action during it's compilation start action. // We need to ensure that we have force analyzed all documents in this project for this analyzer before executing the end actions. forceAnalyzeAllDocuments(_project, analyzer, _cancellationToken); } } // CompilationEnd actions. AnalyzerDriverHelper.ExecuteCompilationEndActions(allAnalyzerActions, compilation, _analyzerOptions, localDiagnostics.Add, CatchAnalyzerException, _cancellationToken); diagnostics.AddRange(CompilationWithAnalyzers.GetEffectiveDiagnostics(localDiagnostics, compilation)); } }
public async Task <AnalyzerActions> GetAnalyzerActionsAsync(DiagnosticAnalyzer analyzer, Action <Diagnostic> addDiagnostic) { var analyzerActions = GetSessionAnalyzerActions(analyzer); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, analyzerActions, (DiagnosticLogAggregator)_logAggregator); if (analyzerActions != null) { if (_project.SupportsCompilation && analyzerActions.CompilationStartActionsCount > 0) { var compilation = await _project.GetCompilationAsync(_cancellationToken).ConfigureAwait(false); var analyzerCompilationActions = GetPerCompilationAnalyzerActions(analyzer, analyzerActions, compilation, addDiagnostic); if (analyzerCompilationActions != null) { analyzerActions = analyzerActions.Append(analyzerCompilationActions); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, analyzerActions, (DiagnosticLogAggregator)_logAggregator); } } } return(analyzerActions); }
private async Task UpdateAnalyzerTelemetryDataAsync(DiagnosticAnalyzer analyzer, CompilationWithAnalyzers compilationWithAnalyzers) { var actionCounts = await compilationWithAnalyzers.GetAnalyzerActionCountsAsync(analyzer, _cancellationToken).ConfigureAwait(false); DiagnosticAnalyzerLogger.UpdateAnalyzerTypeCount(analyzer, actionCounts, _project, _owner.DiagnosticLogAggregator); }
private bool CatchAnalyzerException(Exception e, DiagnosticAnalyzer analyzer, bool testOnly_DonotCatchAnalyzerExceptions) { DiagnosticAnalyzerLogger.LogAnalyzerCrashCount(analyzer, e, _logAggregator); return(CatchAnalyzerException_NoTelemetryLogging(e, analyzer, testOnly_DonotCatchAnalyzerExceptions)); }