From e0c79807f6e23d2942b7437e830193e7f74eca3e Mon Sep 17 00:00:00 2001 From: Manish Vasani Date: Wed, 20 Apr 2016 17:27:55 -0700 Subject: [PATCH] Ensure that we explicitly ignore the skipped analyzers while creating the analyzer driver, otherwise we might end up running hidden analyzers during project analysis. --- .../EngineV1/DiagnosticIncrementalAnalyzer.cs | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs index e0f5c198985..2dc8011c767 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs @@ -412,26 +412,42 @@ private async Task AnalyzeProjectAsync(Project project, CancellationToken cancel return; } + // PERF: Ensure that we explicitly ignore the skipped analyzers while creating the analyzer driver, otherwise we might end up running hidden analyzers on closed files. + var stateSets = _stateManager.GetOrUpdateStateSets(project).ToImmutableArray(); + var skipAnalyzersMap = new Dictionary(stateSets.Length); + var shouldRunAnalyzersMap = new Dictionary(stateSets.Length); + var analyzersBuilder = ImmutableArray.CreateBuilder(stateSets.Length); + foreach (var stateSet in stateSets) + { + var skip = await SkipRunningAnalyzerAsync(project, stateSet.Analyzer, openedDocument: false, skipClosedFileCheck: true, cancellationToken: cancellationToken).ConfigureAwait(false); + skipAnalyzersMap.Add(stateSet.Analyzer, skip); + + var shouldRun = !skip && ShouldRunAnalyzerForStateType(stateSet.Analyzer, StateType.Project, diagnosticIds: null); + shouldRunAnalyzersMap.Add(stateSet.Analyzer, shouldRun); + + if (shouldRun) + { + analyzersBuilder.Add(stateSet.Analyzer); + } + } + + var analyzerDriver = new DiagnosticAnalyzerDriver(project, this, analyzersBuilder.ToImmutable(), ConcurrentAnalysis, ReportSuppressedDiagnostics, cancellationToken); + var projectTextVersion = await project.GetLatestDocumentVersionAsync(cancellationToken).ConfigureAwait(false); var semanticVersion = await project.GetDependentSemanticVersionAsync(cancellationToken).ConfigureAwait(false); var projectVersion = await project.GetDependentVersionAsync(cancellationToken).ConfigureAwait(false); - var versions = new VersionArgument(projectTextVersion, semanticVersion, projectVersion); - var stateSets = _stateManager.GetOrUpdateStateSets(project); - var analyzers = stateSets.Select(s => s.Analyzer); - var analyzerDriver = new DiagnosticAnalyzerDriver(project, this, analyzers, ConcurrentAnalysis, ReportSuppressedDiagnostics, cancellationToken); - foreach (var stateSet in stateSets) { // Compilation actions can report diagnostics on open files, so we skipClosedFileChecks. - if (await SkipRunningAnalyzerAsync(project, stateSet.Analyzer, openedDocument: false, skipClosedFileCheck: true, cancellationToken: cancellationToken).ConfigureAwait(false)) + if (skipAnalyzersMap[stateSet.Analyzer]) { await ClearExistingDiagnostics(project, stateSet, cancellationToken).ConfigureAwait(false); continue; } - if (ShouldRunAnalyzerForStateType(stateSet.Analyzer, StateType.Project, diagnosticIds: null)) + if (shouldRunAnalyzersMap[stateSet.Analyzer]) { var data = await _executor.GetProjectAnalysisDataAsync(analyzerDriver, stateSet, versions).ConfigureAwait(false); if (data.FromCache) -- GitLab