From 44a47182b229ef998c9e520eb5d3a4f5d8c7fae1 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 13 Nov 2017 10:27:25 -0800 Subject: [PATCH] Add EditorSettingsManager as an exported MEF component. - Internalized the core implementation of `EditorSettingsManagerInternal`. - Added a `VisualStudioWorkspaceAccessor` to enable the `Microsoft.VisualStudio.Editor.Razor` project to have access to the current workspace. Only added the Windows specific implementation of this type since the VS for mac implementation will require infrastructural work to make happen. #1762 --- ...> DefaultEditorSettingsManagerInternal.cs} | 4 +- ...ltEditorSettingsManagerInternalFactory.cs} | 6 +-- ...er.cs => EditorSettingsManagerInternal.cs} | 2 +- .../DefaultEditorSettingsManager.cs | 37 +++++++++++++++++++ .../EditorSettingsManager.cs | 17 +++++++++ .../VisualStudioWorkspaceAccessor.cs | 12 ++++++ .../DefaultVisualStudioWorkspaceAccessor.cs | 22 +++++++++++ .../DefaultVisualStudioDocumentTracker.cs | 4 +- ...faultVisualStudioDocumentTrackerFactory.cs | 4 +- ...faultEditorSettingsManagerInternalTest.cs} | 8 ++-- .../DefaultVisualStudioDocumentTrackerTest.cs | 2 +- .../RazorTextViewConnectionListenerTest.cs | 2 +- 12 files changed, 104 insertions(+), 16 deletions(-) rename src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/{DefaultEditorSettingsManager.cs => DefaultEditorSettingsManagerInternal.cs} (90%) rename src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/{DefaultEditorSettingsManagerFactory.cs => DefaultEditorSettingsManagerInternalFactory.cs} (71%) rename src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/{EditorSettingsManager.cs => EditorSettingsManagerInternal.cs} (86%) create mode 100644 src/Microsoft.VisualStudio.Editor.Razor/DefaultEditorSettingsManager.cs create mode 100644 src/Microsoft.VisualStudio.Editor.Razor/EditorSettingsManager.cs create mode 100644 src/Microsoft.VisualStudio.Editor.Razor/VisualStudioWorkspaceAccessor.cs create mode 100644 src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultVisualStudioWorkspaceAccessor.cs rename test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/{DefaultEditorSettingsManagerTest.cs => DefaultEditorSettingsManagerInternalTest.cs} (84%) diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManager.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerInternal.cs similarity index 90% rename from src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManager.cs rename to src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerInternal.cs index ad87e77c7d..092da5f62c 100644 --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManager.cs +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerInternal.cs @@ -5,14 +5,14 @@ using System; namespace Microsoft.CodeAnalysis.Razor.Editor { - internal class DefaultEditorSettingsManager : EditorSettingsManager + internal class DefaultEditorSettingsManagerInternal : EditorSettingsManagerInternal { public override event EventHandler Changed; private readonly object SettingsAccessorLock = new object(); private EditorSettings _settings; - public DefaultEditorSettingsManager() + public DefaultEditorSettingsManagerInternal() { _settings = EditorSettings.Default; } diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerFactory.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerInternalFactory.cs similarity index 71% rename from src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerFactory.cs rename to src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerInternalFactory.cs index 85f6af0536..84f49a95c8 100644 --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerFactory.cs +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/DefaultEditorSettingsManagerInternalFactory.cs @@ -9,8 +9,8 @@ using Microsoft.CodeAnalysis.Host.Mef; namespace Microsoft.CodeAnalysis.Razor.Editor { [Shared] - [ExportLanguageServiceFactory(typeof(EditorSettingsManager), RazorLanguage.Name)] - internal class DefaultEditorSettingsManagerFactory : ILanguageServiceFactory + [ExportLanguageServiceFactory(typeof(EditorSettingsManagerInternal), RazorLanguage.Name)] + internal class DefaultEditorSettingsManagerInternalFactory : ILanguageServiceFactory { public ILanguageService CreateLanguageService(HostLanguageServices languageServices) { @@ -19,7 +19,7 @@ namespace Microsoft.CodeAnalysis.Razor.Editor throw new ArgumentNullException(nameof(languageServices)); } - return new DefaultEditorSettingsManager(); + return new DefaultEditorSettingsManagerInternal(); } } } diff --git a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/EditorSettingsManager.cs b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/EditorSettingsManagerInternal.cs similarity index 86% rename from src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/EditorSettingsManager.cs rename to src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/EditorSettingsManagerInternal.cs index 41ad1f3985..9dd5a4f5aa 100644 --- a/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/EditorSettingsManager.cs +++ b/src/Microsoft.CodeAnalysis.Razor.Workspaces/Editor/EditorSettingsManagerInternal.cs @@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis.Host; namespace Microsoft.CodeAnalysis.Razor.Editor { - public abstract class EditorSettingsManager : ILanguageService + internal abstract class EditorSettingsManagerInternal : ILanguageService { public abstract event EventHandler Changed; diff --git a/src/Microsoft.VisualStudio.Editor.Razor/DefaultEditorSettingsManager.cs b/src/Microsoft.VisualStudio.Editor.Razor/DefaultEditorSettingsManager.cs new file mode 100644 index 0000000000..389aff0b77 --- /dev/null +++ b/src/Microsoft.VisualStudio.Editor.Razor/DefaultEditorSettingsManager.cs @@ -0,0 +1,37 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.ComponentModel.Composition; +using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.Editor; + +namespace Microsoft.VisualStudio.Editor.Razor +{ + [System.Composition.Shared] + [Export(typeof(EditorSettingsManager))] + internal class DefaultEditorSettingsManager : EditorSettingsManager + { + private readonly EditorSettingsManagerInternal _editorSettingsManager; + + [ImportingConstructor] + public DefaultEditorSettingsManager(VisualStudioWorkspaceAccessor workspaceAccessor) + { + var razorLanguageServices = workspaceAccessor.Workspace.Services.GetLanguageServices(RazorLanguage.Name); + _editorSettingsManager = razorLanguageServices.GetRequiredService(); + } + + public override event EventHandler Changed + { + add => _editorSettingsManager.Changed += value; + remove => _editorSettingsManager.Changed -= value; + } + + public override EditorSettings Current => _editorSettingsManager.Current; + + public override void Update(EditorSettings updateSettings) + { + _editorSettingsManager.Update(updateSettings); + } + } +} diff --git a/src/Microsoft.VisualStudio.Editor.Razor/EditorSettingsManager.cs b/src/Microsoft.VisualStudio.Editor.Razor/EditorSettingsManager.cs new file mode 100644 index 0000000000..c3e0399bde --- /dev/null +++ b/src/Microsoft.VisualStudio.Editor.Razor/EditorSettingsManager.cs @@ -0,0 +1,17 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.CodeAnalysis.Razor.Editor; + +namespace Microsoft.VisualStudio.Editor.Razor +{ + public abstract class EditorSettingsManager + { + public abstract event EventHandler Changed; + + public abstract EditorSettings Current { get; } + + public abstract void Update(EditorSettings updateSettings); + } +} diff --git a/src/Microsoft.VisualStudio.Editor.Razor/VisualStudioWorkspaceAccessor.cs b/src/Microsoft.VisualStudio.Editor.Razor/VisualStudioWorkspaceAccessor.cs new file mode 100644 index 0000000000..2e84e16ec8 --- /dev/null +++ b/src/Microsoft.VisualStudio.Editor.Razor/VisualStudioWorkspaceAccessor.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.CodeAnalysis; + +namespace Microsoft.VisualStudio.Editor.Razor +{ + internal abstract class VisualStudioWorkspaceAccessor + { + public abstract Workspace Workspace { get; } + } +} diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultVisualStudioWorkspaceAccessor.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultVisualStudioWorkspaceAccessor.cs new file mode 100644 index 0000000000..4749c44f5b --- /dev/null +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultVisualStudioWorkspaceAccessor.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.ComponentModel.Composition; +using Microsoft.CodeAnalysis; +using Microsoft.VisualStudio.Editor.Razor; + +namespace Microsoft.VisualStudio.LanguageServices.Razor +{ + [System.Composition.Shared] + [Export(typeof(VisualStudioWorkspaceAccessor))] + internal class DefaultVisualStudioWorkspaceAccessor : VisualStudioWorkspaceAccessor + { + [ImportingConstructor] + public DefaultVisualStudioWorkspaceAccessor([Import(typeof(VisualStudioWorkspace))] Workspace workspace) + { + Workspace = workspace; + } + + public override Workspace Workspace { get; } + } +} diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTracker.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTracker.cs index c5808dcf3d..e68c049d8b 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTracker.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTracker.cs @@ -18,7 +18,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor { private readonly string _filePath; private readonly ProjectSnapshotManager _projectManager; - private readonly EditorSettingsManager _editorSettingsManager; + private readonly EditorSettingsManagerInternal _editorSettingsManager; private readonly TextBufferProjectService _projectService; private readonly ITextBuffer _textBuffer; private readonly List _textViews; @@ -33,7 +33,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor string filePath, ProjectSnapshotManager projectManager, TextBufferProjectService projectService, - EditorSettingsManager editorSettingsManager, + EditorSettingsManagerInternal editorSettingsManager, Workspace workspace, ITextBuffer textBuffer) { diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTrackerFactory.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTrackerFactory.cs index eaacbc06df..53c2c074a2 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTrackerFactory.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/Editor/DefaultVisualStudioDocumentTrackerFactory.cs @@ -22,7 +22,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor private readonly Workspace _workspace; private readonly ForegroundDispatcher _foregroundDispatcher; private readonly ProjectSnapshotManager _projectManager; - private readonly EditorSettingsManager _editorSettingsManager; + private readonly EditorSettingsManagerInternal _editorSettingsManager; [ImportingConstructor] public DefaultVisualStudioDocumentTrackerFactory( @@ -52,7 +52,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor _foregroundDispatcher = workspace.Services.GetRequiredService(); var razorLanguageServices = workspace.Services.GetLanguageServices(RazorLanguage.Name); _projectManager = razorLanguageServices.GetRequiredService(); - _editorSettingsManager = razorLanguageServices.GetRequiredService(); + _editorSettingsManager = razorLanguageServices.GetRequiredService(); } public override VisualStudioDocumentTracker Create(ITextBuffer textBuffer) diff --git a/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/DefaultEditorSettingsManagerTest.cs b/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/DefaultEditorSettingsManagerInternalTest.cs similarity index 84% rename from test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/DefaultEditorSettingsManagerTest.cs rename to test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/DefaultEditorSettingsManagerInternalTest.cs index cd1c99ac90..d0a85604eb 100644 --- a/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/DefaultEditorSettingsManagerTest.cs +++ b/test/Microsoft.CodeAnalysis.Razor.Workspaces.Test/Editor/DefaultEditorSettingsManagerInternalTest.cs @@ -5,13 +5,13 @@ using Xunit; namespace Microsoft.CodeAnalysis.Razor.Editor { - public class DefaultEditorSettingsManagerTest + public class DefaultEditorSettingsManagerInternalTest { [Fact] public void InitialSettingsAreDefault() { // Act - var manager = new DefaultEditorSettingsManager(); + var manager = new DefaultEditorSettingsManagerInternal(); // Assert Assert.Equal(EditorSettings.Default, manager.Current); @@ -21,7 +21,7 @@ namespace Microsoft.CodeAnalysis.Razor.Editor public void Update_TriggersChangedIfEditorSettingsAreDifferent() { // Arrange - var manager = new DefaultEditorSettingsManager(); + var manager = new DefaultEditorSettingsManagerInternal(); var called = false; manager.Changed += (caller, args) => { @@ -41,7 +41,7 @@ namespace Microsoft.CodeAnalysis.Razor.Editor public void Update_DoesNotTriggerChangedIfEditorSettingsAreSame() { // Arrange - var manager = new DefaultEditorSettingsManager(); + var manager = new DefaultEditorSettingsManagerInternal(); var called = false; manager.Changed += (caller, args) => { diff --git a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/DefaultVisualStudioDocumentTrackerTest.cs b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/DefaultVisualStudioDocumentTrackerTest.cs index 7df72b1190..9a6e4552fe 100644 --- a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/DefaultVisualStudioDocumentTrackerTest.cs +++ b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/DefaultVisualStudioDocumentTrackerTest.cs @@ -30,7 +30,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor s.IsSupportedProject(It.IsAny()) == true && s.GetProjectPath(It.IsAny()) == "C:/Some/Path/TestProject.csproj"); - private EditorSettingsManager EditorSettingsManager => new DefaultEditorSettingsManager(); + private EditorSettingsManagerInternal EditorSettingsManager => new DefaultEditorSettingsManagerInternal(); private Workspace Workspace => new AdhocWorkspace(); diff --git a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/RazorTextViewConnectionListenerTest.cs b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/RazorTextViewConnectionListenerTest.cs index 9a96cc03eb..f543e741f2 100644 --- a/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/RazorTextViewConnectionListenerTest.cs +++ b/test/Microsoft.VisualStudio.LanguageServices.Razor.Test/Editor/RazorTextViewConnectionListenerTest.cs @@ -26,7 +26,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor s.IsSupportedProject(It.IsAny()) == true && s.GetProjectPath(It.IsAny()) == "C:/Some/Path/TestProject.csproj"); - private EditorSettingsManager EditorSettingsManager => new DefaultEditorSettingsManager(); + private EditorSettingsManagerInternal EditorSettingsManager => new DefaultEditorSettingsManagerInternal(); private Workspace Workspace { get; } = new AdhocWorkspace();