diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs index adc033c43a02f1cf7ae7e9ec031a440ca34eb9fe..33067f1273d76c3aa0bd8a179875d5651ba05f71 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs @@ -90,7 +90,7 @@ public IEnumerable ConvertToLocalDiagnostics(Document targetDocu /// Return all diagnostics that belong to given project for the given StateSets (analyzers) either from cache or by calculating them /// public async Task GetProjectAnalysisDataAsync( - CompilationWithAnalyzers analyzerDriverOpt, Project project, IEnumerable stateSets, CancellationToken cancellationToken) + CompilationWithAnalyzers analyzerDriverOpt, Project project, IEnumerable stateSets, bool ignoreOption, CancellationToken cancellationToken) { using (Logger.LogBlock(FunctionId.Diagnostics_ProjectDiagnostic, GetProjectLogMessage, project, stateSets, cancellationToken)) { @@ -107,7 +107,7 @@ public IEnumerable ConvertToLocalDiagnostics(Document targetDocu } // perf optimization. check whether we want to analyze this project or not. - if (!await FullAnalysisEnabledAsync(project, cancellationToken).ConfigureAwait(false)) + if (!await FullAnalysisEnabledAsync(project, ignoreOption, cancellationToken).ConfigureAwait(false)) { return new ProjectAnalysisData(project.Id, version, existingData.Result, ImmutableDictionary.Empty); } @@ -402,11 +402,16 @@ private async Task UpdateAnalyzerTelemetryDataAsync(CompilationWithAnalyzers ana } } - private static async Task FullAnalysisEnabledAsync(Project project, CancellationToken cancellationToken) + private static async Task FullAnalysisEnabledAsync(Project project, bool ignoreOption, CancellationToken cancellationToken) { var workspace = project.Solution.Workspace; var language = project.Language; + if (ignoreOption) + { + return await project.HasSuccessfullyLoadedAsync(cancellationToken).ConfigureAwait(false); + } + if (!workspace.Options.GetOption(ServiceFeatureOnOffOptions.ClosedFileDiagnostic, language) || !workspace.Options.GetOption(RuntimeOptions.FullSolutionAnalysis)) { diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnostics.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnostics.cs index 9fc16c98968a144b36e6cc3f47a83d2782db0f69..605c1f852daf23135e2244a8d967761cd74bff43 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnostics.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnostics.cs @@ -399,7 +399,8 @@ protected override async Task AppendDiagnosticsAsync(Project project, IEnumerabl // unlike the suppressed (disabled) analyzer, we will include hidden diagnostic only analyzers here. var analyzerDriverOpt = await Owner._compilationManager.CreateAnalyzerDriverAsync(project, stateSets, IncludeSuppressedDiagnostics, cancellationToken).ConfigureAwait(false); - var result = await Owner._executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, cancellationToken).ConfigureAwait(false); + var ignoreOption = true; + var result = await Owner._executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, ignoreOption, cancellationToken).ConfigureAwait(false); foreach (var stateSet in stateSets) { @@ -445,6 +446,7 @@ private bool ShouldIncludeStateSet(Project project, StateSet stateSet) // Here, we don't care what kind of analyzer (StateSet) is given. // We just create and use AnalyzerDriver with the given analyzer (StateSet). + var ignoreOption = true; var analyzerDriverOpt = await Owner._compilationManager.CreateAnalyzerDriverAsync(project, stateSets, IncludeSuppressedDiagnostics, cancellationToken).ConfigureAwait(false); if (documentId != null) @@ -462,7 +464,7 @@ private bool ShouldIncludeStateSet(Project project, StateSet stateSet) } case AnalysisKind.NonLocal: { - var nonLocalDocumentResult = await Owner._executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, cancellationToken).ConfigureAwait(false); + var nonLocalDocumentResult = await Owner._executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, ignoreOption, cancellationToken).ConfigureAwait(false); var analysisResult = nonLocalDocumentResult.GetResult(stateSet.Analyzer); return GetResult(analysisResult, AnalysisKind.NonLocal, documentId); } @@ -472,7 +474,7 @@ private bool ShouldIncludeStateSet(Project project, StateSet stateSet) } Contract.ThrowIfFalse(kind == AnalysisKind.NonLocal); - var projectResult = await Owner._executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, cancellationToken).ConfigureAwait(false); + var projectResult = await Owner._executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, ignoreOption, cancellationToken).ConfigureAwait(false); return projectResult.GetResult(stateSet.Analyzer).Others; } } diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_IncrementalAnalyzer.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_IncrementalAnalyzer.cs index 15c004beb691fce747db4b57493768ba3e64ab53..de41b0946e52d6d3e11fd0dab02024ff3dfbf01b 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_IncrementalAnalyzer.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_IncrementalAnalyzer.cs @@ -83,7 +83,8 @@ public override async Task AnalyzeProjectAsync(Project project, bool semanticsCh var includeSuppressedDiagnostics = true; var analyzerDriverOpt = await _compilationManager.CreateAnalyzerDriverAsync(project, activeAnalyzers, includeSuppressedDiagnostics, cancellationToken).ConfigureAwait(false); - var result = await _executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, cancellationToken).ConfigureAwait(false); + var ignoreOption = false; + var result = await _executor.GetProjectAnalysisDataAsync(analyzerDriverOpt, project, stateSets, ignoreOption, cancellationToken).ConfigureAwait(false); if (result.FromCache) { RaiseProjectDiagnosticsIfNeeded(project, stateSets, result.Result);