From 622a9e096f3d8aaadf9b132ed5bf7deb9b0747de Mon Sep 17 00:00:00 2001 From: Kirill Osenkov Date: Mon, 25 Nov 2019 17:03:59 -0800 Subject: Fixes https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1012526 Make sure dynamic files are added to the project info every time the project is reloaded. Also double-check that the document we're about to reload still exists in the current solution. --- .../MonoDevelop.Ide.TypeSystem/DynamicFileManager.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'main') diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/DynamicFileManager.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/DynamicFileManager.cs index 80dac3ba84..f3de469729 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/DynamicFileManager.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.TypeSystem/DynamicFileManager.cs @@ -88,11 +88,18 @@ namespace MonoDevelop.Ide.TypeSystem private void OnDynamicDocumentUpdated (DocumentInfo document) { if (projectContexts.TryGetValue (document.Id.ProjectId, out var projectContext)) { - if (projectContext.Workspace.IsDocumentOpen (document.Id)) { + var workspace = projectContext.Workspace; + if (workspace.IsDocumentOpen (document.Id)) { return; } - projectContext.Workspace.OnDocumentReloaded (document); + if (!workspace.CurrentSolution.ContainsDocument (document.Id)) { + // By the time we get called back from Razor the project might + // have been unloaded + return; + } + + workspace.OnDocumentReloaded (document); } } @@ -114,7 +121,6 @@ namespace MonoDevelop.Ide.TypeSystem var newFiles = currentDynamicSourceFiles.ToImmutableHashSet (); dynamicSourceFiles = newFiles; - var addedFiles = newFiles.Except (oldFiles); var removedFiles = oldFiles.Except (newFiles); foreach (var document in removedFiles) { @@ -128,14 +134,16 @@ namespace MonoDevelop.Ide.TypeSystem List documents = new List (); - foreach (var document in addedFiles) { + foreach (var document in dynamicSourceFiles) { foreach (var dynamicFileProvider in dynamicFileManager.GetDynamicFileProviders (document)) { var dynamicFileInfo = dynamicFileProvider.GetDynamicDocumentInfo ( projectInfo.Id, projectInfo.FilePath, document); - if (dynamicFileInfo != null) { + bool alreadyAdded = projectInfo.Documents.Any (d => string.Equals (d.FilePath, document, StringComparison.OrdinalIgnoreCase)); + + if (dynamicFileInfo != null && !alreadyAdded) { documents.Add (dynamicFileInfo); } } -- cgit v1.2.3