diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs index c55aba049f2d4c9f76e3c34c52c57768e0393fbf..9a812acab5de34fdd1518237a92d6a68906a13f4 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.Executor.cs @@ -165,15 +165,7 @@ public IEnumerable ConvertToLocalDiagnostics(Document targetDocu Logger.Log(FunctionId.Diagnostics_ProjectDiagnostic, p => $"Failed to Load Successfully ({p.FilePath ?? p.Name})", project); // get rid of any result except syntax from compiler analyzer result - var newCompilerAnalysisResult = new DiagnosticAnalysisResult( - analysisResult.ProjectId, - analysisResult.Version, - analysisResult.SyntaxLocals, - semanticLocals: ImmutableDictionary>.Empty, - nonLocals: ImmutableDictionary>.Empty, - others: ImmutableArray.Empty, - documentIds: null, - fromBuild: false); + var newCompilerAnalysisResult = analysisResult.DropExceptSyntax(); // return new result return result.SetItem(compilerAnalyzer, newCompilerAnalysisResult); diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.ProjectState.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.ProjectState.cs index c5f99c7f606ce925ddf6c29b882a2ebd958afefa..06357fbf68c8bfe421aa502ca12f419b952af811 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.ProjectState.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.ProjectState.cs @@ -232,7 +232,7 @@ public async Task SaveAsync(Project project, DiagnosticAnalysisResult result) public void ResetVersion() { // reset version of cached data so that we can recalculate new data (ex, OnDocumentReset) - _lastResult = new DiagnosticAnalysisResult(_lastResult.ProjectId, VersionStamp.Default, _lastResult.DocumentIds, _lastResult.IsEmpty, _lastResult.FromBuild); + _lastResult = _lastResult.Reset(); } public async Task MergeAsync(ActiveFileState state, Document document) @@ -280,7 +280,7 @@ public async Task MergeAsync(ActiveFileState state, Document document) await SerializeAsync(serializer, document, document.Id, _owner.SemanticStateName, semantic.Items).ConfigureAwait(false); // save last aggregated form of analysis result - _lastResult = new DiagnosticAnalysisResult(_lastResult.ProjectId, version, _lastResult.DocumentIdsOrEmpty.Add(state.DocumentId), isEmpty: false, fromBuild: fromBuild); + _lastResult = _lastResult.UpdateAggregatedResult(version, state.DocumentId, fromBuild); } public bool OnDocumentRemoved(DocumentId id) diff --git a/src/Workspaces/Core/Portable/Diagnostics/DiagnosticAnalysisResult.cs b/src/Workspaces/Core/Portable/Diagnostics/DiagnosticAnalysisResult.cs index 573534e649734b6579f4ab835f8e4d5bdd66273c..a1b2b1e44c796c6df3429c2f8d6854cbece7aa47 100644 --- a/src/Workspaces/Core/Portable/Diagnostics/DiagnosticAnalysisResult.cs +++ b/src/Workspaces/Core/Portable/Diagnostics/DiagnosticAnalysisResult.cs @@ -30,7 +30,7 @@ internal struct DiagnosticAnalysisResult private readonly ImmutableDictionary> _nonLocals; private readonly ImmutableArray _others; - public DiagnosticAnalysisResult( + private DiagnosticAnalysisResult( ProjectId projectId, VersionStamp version, ImmutableHashSet documentIds, bool isEmpty, bool fromBuild) { ProjectId = projectId; @@ -45,7 +45,7 @@ internal struct DiagnosticAnalysisResult _others = default; } - public DiagnosticAnalysisResult( + private DiagnosticAnalysisResult( ProjectId projectId, VersionStamp version, ImmutableDictionary> syntaxLocals, ImmutableDictionary> semanticLocals, @@ -180,6 +180,29 @@ public DiagnosticAnalysisResult ToAggregatedForm() return new DiagnosticAnalysisResult(ProjectId, Version, DocumentIds, IsEmpty, FromBuild); } + public DiagnosticAnalysisResult UpdateAggregatedResult(VersionStamp version, DocumentId documentId, bool fromBuild) + { + return new DiagnosticAnalysisResult(ProjectId, version, DocumentIdsOrEmpty.Add(documentId), isEmpty: false, fromBuild: fromBuild); + } + + public DiagnosticAnalysisResult Reset() + { + return new DiagnosticAnalysisResult(ProjectId, VersionStamp.Default, DocumentIds, IsEmpty, FromBuild); + } + + public DiagnosticAnalysisResult DropExceptSyntax() + { + return new DiagnosticAnalysisResult( + ProjectId, + Version, + SyntaxLocals, + semanticLocals: ImmutableDictionary>.Empty, + nonLocals: ImmutableDictionary>.Empty, + others: ImmutableArray.Empty, + documentIds: null, + fromBuild: false); + } + private T ReturnIfNotDefault(T value) { if (object.Equals(value, default))