From cb6729b04ab45d4c48243327d79e775cf3c3d421 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Thu, 2 Jul 2020 12:57:48 -0700 Subject: [PATCH] Clear the cache as the solution changes. --- ...ceFactory.SemanticModelWorkspaceService.cs | 4 +++ ...ceFactory.SemanticModelWorkspaceService.cs | 25 +++++++++++++++++++ ...manticModelReuseWorkspaceServiceFactory.cs | 2 +- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/CodeStyle/Core/CodeFixes/LanguageServices/SemanticModelWorkspaceService/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs b/src/CodeStyle/Core/CodeFixes/LanguageServices/SemanticModelWorkspaceService/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs index 2230634f548..a3e57e222db 100644 --- a/src/CodeStyle/Core/CodeFixes/LanguageServices/SemanticModelWorkspaceService/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs +++ b/src/CodeStyle/Core/CodeFixes/LanguageServices/SemanticModelWorkspaceService/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs @@ -15,6 +15,10 @@ internal partial class SemanticModelReuseWorkspaceServiceFactory : IWorkspaceSer { private sealed class SemanticModelReuseWorkspaceService : ISemanticModelReuseWorkspaceService { + public SemanticModelReuseWorkspaceService(Workspace _) + { + } + public Task ReuseExistingSpeculativeModelAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) { // TODO: port the GetSemanticModelForNodeAsync implementation from Workspaces layer, diff --git a/src/Workspaces/Core/Portable/SemanticModelReuse/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs b/src/Workspaces/Core/Portable/SemanticModelReuse/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs index e6e57b35863..d7e959d5f80 100644 --- a/src/Workspaces/Core/Portable/SemanticModelReuse/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs +++ b/src/Workspaces/Core/Portable/SemanticModelReuse/SemanticModelWorkspaceServiceFactory.SemanticModelWorkspaceService.cs @@ -52,6 +52,8 @@ internal partial class SemanticModelReuseWorkspaceServiceFactory : IWorkspaceSer { private sealed class SemanticModelReuseWorkspaceService : ISemanticModelReuseWorkspaceService { + private readonly Workspace _workspace; + /// /// A mapping from a document id to the last semantic model we produced for it, along with the top level /// semantic version that that semantic model corresponds to. We can continue reusing the semantic model as @@ -67,6 +69,29 @@ private sealed class SemanticModelReuseWorkspaceService : ISemanticModelReuseWor /// private ImmutableDictionary _semanticModelMap = ImmutableDictionary.Empty; + public SemanticModelReuseWorkspaceService(Workspace workspace) + { + _workspace = workspace; + _workspace.WorkspaceChanged += (_, e) => + { + // if our map points at documents not in the current solution, then we want to clear things out. + // this way we don't hold onto semantic models past, say, the c#/vb solutions closing. + var map = _semanticModelMap; + if (map.IsEmpty) + return; + + var solution = e.NewSolution; + foreach (var (docId, _) in map) + { + if (!solution.ContainsDocument(docId)) + { + _semanticModelMap = ImmutableDictionary.Empty; + return; + } + } + }; + } + public async Task ReuseExistingSpeculativeModelAsync(Document document, SyntaxNode node, CancellationToken cancellationToken) { var reuseService = document.GetRequiredLanguageService(); diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/WorkspaceServices/SemanticModelReuse/SemanticModelReuseWorkspaceServiceFactory.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/WorkspaceServices/SemanticModelReuse/SemanticModelReuseWorkspaceServiceFactory.cs index 6a01ca2ab0c..f7031e90232 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/WorkspaceServices/SemanticModelReuse/SemanticModelReuseWorkspaceServiceFactory.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/WorkspaceServices/SemanticModelReuse/SemanticModelReuseWorkspaceServiceFactory.cs @@ -21,6 +21,6 @@ public SemanticModelReuseWorkspaceServiceFactory() } public IWorkspaceService CreateService(HostWorkspaceServices workspaceServices) - => new SemanticModelReuseWorkspaceService(); + => new SemanticModelReuseWorkspaceService(workspaceServices.Workspace); } } -- GitLab