// When the Razor project manager forgets about a document we need remove its background C# representation // so that content doesn't get stale. private void ProjectManager_Changed(object sender, OmniSharpProjectChangeEventArgs args) { switch (args.Kind) { case OmniSharpProjectChangeKind.DocumentRemoved: var roslynProject = GetRoslynProject(args.Older); if (roslynProject == null) { // Project no longer exists return; } var backgroundVirtualFilePath = GetBackgroundVirtualDocumentFilePath(args.DocumentFilePath); var backgroundDocument = GetRoslynDocument(roslynProject, backgroundVirtualFilePath); if (backgroundDocument == null) { // No background document associated return; } // There's still a background document associated with the removed Razor document. _workspace.RemoveDocument(backgroundDocument.Id); break; } }
public async Task ProjectManager_Changed_ProjectRemoved_AfterEnqueuedPublish() { // Arrange var attemptedToSerialize = false; var projectSnapshot = CreateProjectSnapshot("/path/to/project.csproj"); var expectedPublishFilePath = "/path/to/obj/bin/Debug/project.razor.json"; var publisher = new TestProjectChangePublisher( LoggerFactory, onSerializeToFile: (snapshot, publishFilePath) => attemptedToSerialize = true) { EnqueueDelay = 10 }; publisher.SetPublishFilePath(projectSnapshot.FilePath, expectedPublishFilePath); publisher.EnqueuePublish(projectSnapshot); var args = OmniSharpProjectChangeEventArgs.CreateTestInstance(projectSnapshot, newer: null, documentFilePath: null, OmniSharpProjectChangeKind.ProjectRemoved); // Act publisher.ProjectManager_Changed(null, args); // Assert await Task.Delay(publisher.EnqueueDelay * 3); Assert.False(attemptedToSerialize); }
public async Task ProjectManager_Changed_EnqueuesPublish(OmniSharpProjectChangeKind changeKind) { // Arrange var serializationSuccessful = false; var projectSnapshot = CreateProjectSnapshot("/path/to/project.csproj"); var expectedPublishFilePath = "/path/to/obj/bin/Debug/project.razor.json"; var publisher = new TestProjectChangePublisher( LoggerFactory, onSerializeToFile: (snapshot, publishFilePath) => { Assert.Same(projectSnapshot, snapshot); Assert.Equal(expectedPublishFilePath, publishFilePath); serializationSuccessful = true; }) { EnqueueDelay = 10 }; publisher.SetPublishFilePath(projectSnapshot.FilePath, expectedPublishFilePath); var args = OmniSharpProjectChangeEventArgs.CreateTestInstance(projectSnapshot, projectSnapshot, documentFilePath: null, changeKind); // Act publisher.ProjectManager_Changed(null, args); // Assert var kvp = Assert.Single(publisher._deferredPublishTasks); await kvp.Value; Assert.True(serializationSuccessful); }
// Internal for testing internal void ProjectManager_Changed(object sender, OmniSharpProjectChangeEventArgs args) { switch (args.Kind) { case OmniSharpProjectChangeKind.DocumentRemoved: case OmniSharpProjectChangeKind.DocumentAdded: case OmniSharpProjectChangeKind.ProjectChanged: // These changes can come in bursts so we don't want to overload the publishing system. Therefore, // we enqueue publishes and then publish the latest project after a delay. EnqueuePublish(args.Newer); break; case OmniSharpProjectChangeKind.ProjectAdded: Publish(args.Newer); break; case OmniSharpProjectChangeKind.ProjectRemoved: lock (_publishLock) { var oldProjectFilePath = args.Older.FilePath; if (_publishFilePathMappings.TryGetValue(oldProjectFilePath, out var publishFilePath)) { if (_pendingProjectPublishes.TryGetValue(oldProjectFilePath, out _)) { // Project was removed while a delayed publish was in flight. Clear the in-flight publish so it noops. _pendingProjectPublishes.Remove(oldProjectFilePath); } DeleteFile(publishFilePath); } } break; } }
internal void ProjectManager_Changed(object sender, OmniSharpProjectChangeEventArgs args) { switch (args.Kind) { case OmniSharpProjectChangeKind.DocumentRemoved: case OmniSharpProjectChangeKind.DocumentAdded: case OmniSharpProjectChangeKind.ProjectChanged: // These changes can come in bursts so we don't want to overload the publishing system. Therefore, // we enqueue publishes and then publish the latest project after a delay. if (args.Newer.ProjectWorkspaceState != null) { EnqueuePublish(args.Newer); } break; case OmniSharpProjectChangeKind.ProjectRemoved: RemovePublishingData(args.Older); break; // We don't care about ProjectAdded scenarios because a newly added project does not have a workspace state associated with it meaning // it isn't interesting for us to serialize quite yet. } }
private void ProjectSnapshotManager_Changed(object sender, ProjectChangeEventArgs args) { var convertedArgs = new OmniSharpProjectChangeEventArgs(args); Changed?.Invoke(this, convertedArgs); }