public void StoreAnalysisResult(AnalysisScope analysisScope, AnalyzerDriver driver) { foreach (var analyzer in analysisScope.Analyzers) { // Dequeue reported analyzer diagnostics from the driver and store them in our maps. var syntaxDiagnostics = driver.DequeueLocalDiagnostics(analyzer, syntax: true); var semanticDiagnostics = driver.DequeueLocalDiagnostics(analyzer, syntax: false); var compilationDiagnostics = driver.DequeueNonLocalDiagnostics(analyzer); lock (_gate) { if (syntaxDiagnostics.Length > 0 || semanticDiagnostics.Length > 0 || compilationDiagnostics.Length > 0) { UpdateLocalDiagnostics_NoLock(analyzer, syntaxDiagnostics, ref _localSyntaxDiagnosticsOpt); UpdateLocalDiagnostics_NoLock(analyzer, semanticDiagnostics, ref _localSemanticDiagnosticsOpt); UpdateNonLocalDiagnostics_NoLock(analyzer, compilationDiagnostics); } if (_analyzerExecutionTimeOpt != null) { _analyzerExecutionTimeOpt[analyzer] += driver.ResetAnalyzerExecutionTime(analyzer); } } } }
internal void StoreAnalysisResult(AnalysisScope analysisScope, AnalyzerDriver driver, Compilation compilation, Func <DiagnosticAnalyzer, AnalyzerActionCounts> getAnalyzerActionCounts, bool fullAnalysisResultForAnalyzersInScope) { Debug.Assert(!fullAnalysisResultForAnalyzersInScope || analysisScope.FilterTreeOpt == null, "Full analysis result cannot come from partial (tree) analysis."); foreach (var analyzer in analysisScope.Analyzers) { // Dequeue reported analyzer diagnostics from the driver and store them in our maps. var syntaxDiagnostics = driver.DequeueLocalDiagnostics(analyzer, syntax: true, compilation: compilation); var semanticDiagnostics = driver.DequeueLocalDiagnostics(analyzer, syntax: false, compilation: compilation); var compilationDiagnostics = driver.DequeueNonLocalDiagnostics(analyzer, compilation); lock (_gate) { if (_completedAnalyzers.Contains(analyzer)) { // Already stored full analysis result for this analyzer. continue; } if (syntaxDiagnostics.Length > 0 || semanticDiagnostics.Length > 0 || compilationDiagnostics.Length > 0 || fullAnalysisResultForAnalyzersInScope) { UpdateLocalDiagnostics_NoLock(analyzer, syntaxDiagnostics, fullAnalysisResultForAnalyzersInScope, ref _localSyntaxDiagnosticsOpt); UpdateLocalDiagnostics_NoLock(analyzer, semanticDiagnostics, fullAnalysisResultForAnalyzersInScope, ref _localSemanticDiagnosticsOpt); UpdateNonLocalDiagnostics_NoLock(analyzer, compilationDiagnostics, fullAnalysisResultForAnalyzersInScope); } if (_analyzerExecutionTimeOpt != null) { var timeSpan = driver.ResetAnalyzerExecutionTime(analyzer); _analyzerExecutionTimeOpt[analyzer] = fullAnalysisResultForAnalyzersInScope ? timeSpan : _analyzerExecutionTimeOpt[analyzer] + timeSpan; } if (!_analyzerActionCounts.ContainsKey(analyzer)) { _analyzerActionCounts.Add(analyzer, getAnalyzerActionCounts(analyzer)); } if (fullAnalysisResultForAnalyzersInScope) { _completedAnalyzers.Add(analyzer); } } } }
internal void StoreAnalysisResult(AnalysisScope analysisScope, AnalyzerDriver driver, Compilation compilation, Func<DiagnosticAnalyzer, AnalyzerActionCounts> getAnalyzerActionCounts, bool fullAnalysisResultForAnalyzersInScope) { Debug.Assert(!fullAnalysisResultForAnalyzersInScope || analysisScope.FilterTreeOpt == null, "Full analysis result cannot come from partial (tree) analysis."); foreach (var analyzer in analysisScope.Analyzers) { // Dequeue reported analyzer diagnostics from the driver and store them in our maps. var syntaxDiagnostics = driver.DequeueLocalDiagnostics(analyzer, syntax: true, compilation: compilation); var semanticDiagnostics = driver.DequeueLocalDiagnostics(analyzer, syntax: false, compilation: compilation); var compilationDiagnostics = driver.DequeueNonLocalDiagnostics(analyzer, compilation); lock (_gate) { if (_completedAnalyzers.Contains(analyzer)) { // Already stored full analysis result for this analyzer. continue; } if (syntaxDiagnostics.Length > 0 || semanticDiagnostics.Length > 0 || compilationDiagnostics.Length > 0 || fullAnalysisResultForAnalyzersInScope) { UpdateLocalDiagnostics_NoLock(analyzer, syntaxDiagnostics, fullAnalysisResultForAnalyzersInScope, ref _localSyntaxDiagnosticsOpt); UpdateLocalDiagnostics_NoLock(analyzer, semanticDiagnostics, fullAnalysisResultForAnalyzersInScope, ref _localSemanticDiagnosticsOpt); UpdateNonLocalDiagnostics_NoLock(analyzer, compilationDiagnostics, fullAnalysisResultForAnalyzersInScope); } if (_analyzerExecutionTimeOpt != null) { var timeSpan = driver.ResetAnalyzerExecutionTime(analyzer); _analyzerExecutionTimeOpt[analyzer] = fullAnalysisResultForAnalyzersInScope ? timeSpan : _analyzerExecutionTimeOpt[analyzer] + timeSpan; } if (!_analyzerActionCounts.ContainsKey(analyzer)) { _analyzerActionCounts.Add(analyzer, getAnalyzerActionCounts(analyzer)); } if (fullAnalysisResultForAnalyzersInScope) { _completedAnalyzers.Add(analyzer); } } } }