diff --git a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.StateManager.cs b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.StateManager.cs index 96ac1e9f691d3..3fc827fe0d769 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.StateManager.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.StateManager.cs @@ -122,19 +122,27 @@ public void RemoveStateSet(ProjectId projectId) /// public ImmutableArray CreateBuildOnlyProjectStateSet(Project project) { + // create project analyzer reference identity map var referenceIdentities = project.AnalyzerReferences.Select(r => _analyzerManager.GetAnalyzerReferenceIdentity(r)).ToSet(); - var stateSetMap = GetStateSets(project).ToDictionary(s => s.Analyzer, s => s); + // now create analyzer to host stateset map + var hostStateSetMap = _hostStates.GetOrCreateStateSets(project.Language).ToDictionary(s => s.Analyzer, s => s); + + // create build only stateSet array var stateSets = ImmutableArray.CreateBuilder(); // we always include compiler analyzer in build only state var compilerAnalyzer = _analyzerManager.GetCompilerDiagnosticAnalyzer(project.Language); StateSet compilerStateSet; - if (stateSetMap.TryGetValue(compilerAnalyzer, out compilerStateSet)) + if (hostStateSetMap.TryGetValue(compilerAnalyzer, out compilerStateSet)) { stateSets.Add(compilerStateSet); } + // now add all project analyzers + stateSets.AddRange(_projectStates.GetOrUpdateStateSets(project)); + + // now add analyzers that exist in both host and project var analyzerMap = _analyzerManager.GetHostDiagnosticAnalyzersPerReference(project.Language); foreach (var kv in analyzerMap) { @@ -151,7 +159,7 @@ public ImmutableArray CreateBuildOnlyProjectStateSet(Project project) foreach (var analyzer in kv.Value) { StateSet stateSet; - if (stateSetMap.TryGetValue(analyzer, out stateSet) && stateSet != compilerStateSet) + if (hostStateSetMap.TryGetValue(analyzer, out stateSet) && stateSet != compilerStateSet) { stateSets.Add(stateSet); } diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.StateManager.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.StateManager.cs index 0dbab31fe86b8..6430dfd786258 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.StateManager.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.StateManager.cs @@ -113,19 +113,27 @@ public StateSet GetOrCreateStateSet(Project project, DiagnosticAnalyzer analyzer /// public ImmutableArray CreateBuildOnlyProjectStateSet(Project project) { + // create project analyzer reference identity map var referenceIdentities = project.AnalyzerReferences.Select(r => _analyzerManager.GetAnalyzerReferenceIdentity(r)).ToSet(); - var stateSetMap = GetStateSets(project).ToDictionary(s => s.Analyzer, s => s); + // now create analyzer to host stateset map + var hostStateSetMap = _hostStates.GetOrCreateStateSets(project.Language).ToDictionary(s => s.Analyzer, s => s); + + // create build only stateSet array var stateSets = ImmutableArray.CreateBuilder(); // we always include compiler analyzer in build only state var compilerAnalyzer = _analyzerManager.GetCompilerDiagnosticAnalyzer(project.Language); StateSet compilerStateSet; - if (stateSetMap.TryGetValue(compilerAnalyzer, out compilerStateSet)) + if (hostStateSetMap.TryGetValue(compilerAnalyzer, out compilerStateSet)) { stateSets.Add(compilerStateSet); } + // now add all project analyzers + stateSets.AddRange(_projectStates.GetOrUpdateStateSets(project)); + + // now add analyzers that exist in both host and project var analyzerMap = _analyzerManager.GetHostDiagnosticAnalyzersPerReference(project.Language); foreach (var kv in analyzerMap) { @@ -142,7 +150,7 @@ public ImmutableArray CreateBuildOnlyProjectStateSet(Project project) foreach (var analyzer in kv.Value) { StateSet stateSet; - if (stateSetMap.TryGetValue(analyzer, out stateSet) && stateSet != compilerStateSet) + if (hostStateSetMap.TryGetValue(analyzer, out stateSet) && stateSet != compilerStateSet) { stateSets.Add(stateSet); }