// 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;
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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.
            }
        }
예제 #6
0
        private void ProjectSnapshotManager_Changed(object sender, ProjectChangeEventArgs args)
        {
            var convertedArgs = new OmniSharpProjectChangeEventArgs(args);

            Changed?.Invoke(this, convertedArgs);
        }