diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs index 05ecf2be49..e25da4db2d 100644 --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs @@ -212,12 +212,10 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem { difference |= ProjectDifference.WorkspaceProjectRemoved; } - else if ( - WorkspaceProject?.Id != workspaceProject?.Id || - WorkspaceProject?.Version != workspaceProject?.Version) + else { - // For now this is very naive. We will want to consider changing - // our logic here to be more robust. + // We always update the snapshot right now when the project changes. This is how + // we deal with changes to the content of C# sources. difference |= ProjectDifference.WorkspaceProjectChanged; } diff --git a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/ProjectSystem/DefaultProjectSnapshotManagerTest.cs b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/ProjectSystem/DefaultProjectSnapshotManagerTest.cs index 05fb0f19f0..415ecc6da9 100644 --- a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/ProjectSystem/DefaultProjectSnapshotManagerTest.cs +++ b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/ProjectSystem/DefaultProjectSnapshotManagerTest.cs @@ -538,8 +538,10 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem Assert.Equal(ProjectChangeKind.ProjectChanged, ProjectManager.ListenersNotifiedOf); } + // We always update the snapshot when someone calls WorkspaceProjectChanged. This is how we deal + // with changes to source code, which wouldn't result in a new project. [ForegroundFact] - public void WorkspaceProjectChanged_WithHostProject_CanNoOp() + public void WorkspaceProjectChanged_WithHostProject_NotifiesListeners() { // Arrange ProjectManager.HostProjectAdded(HostProject); @@ -553,6 +555,24 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem var snapshot = ProjectManager.GetSnapshot(WorkspaceProject); Assert.True(snapshot.IsInitialized); + Assert.Equal(ProjectChangeKind.ProjectChanged, ProjectManager.ListenersNotifiedOf); + } + + [ForegroundFact] + public void WorkspaceProjectChanged_WithHostProject_CanNoOpForSecondProject() + { + // Arrange + ProjectManager.HostProjectAdded(HostProject); + ProjectManager.WorkspaceProjectAdded(WorkspaceProject); + ProjectManager.Reset(); + + // Act + ProjectManager.WorkspaceProjectChanged(WorkspaceProjectWithDifferentTfm); + + // Assert + var snapshot = ProjectManager.GetSnapshot(WorkspaceProject); + Assert.True(snapshot.IsInitialized); + Assert.Null(ProjectManager.ListenersNotifiedOf); } diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/DocumentInfo/RazorDocumentInfoWindow.cs b/tooling/Microsoft.VisualStudio.RazorExtension/DocumentInfo/RazorDocumentInfoWindow.cs index ae2a02e6d1..08a40cc240 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/DocumentInfo/RazorDocumentInfoWindow.cs +++ b/tooling/Microsoft.VisualStudio.RazorExtension/DocumentInfo/RazorDocumentInfoWindow.cs @@ -81,6 +81,10 @@ namespace Microsoft.VisualStudio.RazorExtension.DocumentInfo } var textBuffer = textView.BufferGraph.GetRazorBuffers().FirstOrDefault(); + if (textBuffer == null) + { + return; + } if (!_editorFactoryService.TryGetDocumentTracker(textBuffer, out _documentTracker)) { diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindow.cs b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindow.cs index 4f4640435e..c391b59a6c 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindow.cs +++ b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindow.cs @@ -120,6 +120,7 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo { changed = project; changed.Snapshot = new ProjectSnapshotViewModel(_projectManager.GetLoadedProject(e.ProjectFilePath)); + DataContext.LoadProjectInfo(); break; } } diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindowControl.xaml b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindowControl.xaml index 06840264d8..1db8a28d62 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindowControl.xaml +++ b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoToolWindowControl.xaml @@ -119,7 +119,7 @@ Command="{Binding UpdateCommand}" /> - + + - - + + - diff --git a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs index 7dd7d34022..aaec39b6df 100644 --- a/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs +++ b/tooling/Microsoft.VisualStudio.RazorExtension/RazorInfo/RazorInfoViewModel.cs @@ -56,7 +56,7 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo _currentProject = value; OnPropertyChanged(); - LoadProjectInfo(_currentProject.Snapshot.Project); + LoadProjectInfo(); } } @@ -100,11 +100,11 @@ namespace Microsoft.VisualStudio.RazorExtension.RazorInfo } } } - - private async void LoadProjectInfo(ProjectSnapshot snapshot) + public async void LoadProjectInfo() { CurrentProjectInfo = new ProjectInfoViewModel(); + var snapshot = CurrentProject?.Snapshot.Project; if (snapshot == null) { return;