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
This commit is contained in:
N. Taylor Mullen 2017-11-13 10:27:25 -08:00
parent 82247fbb09
commit 44a47182b2
12 changed files with 104 additions and 16 deletions

View File

@ -5,14 +5,14 @@ using System;
namespace Microsoft.CodeAnalysis.Razor.Editor namespace Microsoft.CodeAnalysis.Razor.Editor
{ {
internal class DefaultEditorSettingsManager : EditorSettingsManager internal class DefaultEditorSettingsManagerInternal : EditorSettingsManagerInternal
{ {
public override event EventHandler<EditorSettingsChangedEventArgs> Changed; public override event EventHandler<EditorSettingsChangedEventArgs> Changed;
private readonly object SettingsAccessorLock = new object(); private readonly object SettingsAccessorLock = new object();
private EditorSettings _settings; private EditorSettings _settings;
public DefaultEditorSettingsManager() public DefaultEditorSettingsManagerInternal()
{ {
_settings = EditorSettings.Default; _settings = EditorSettings.Default;
} }

View File

@ -9,8 +9,8 @@ using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.Razor.Editor namespace Microsoft.CodeAnalysis.Razor.Editor
{ {
[Shared] [Shared]
[ExportLanguageServiceFactory(typeof(EditorSettingsManager), RazorLanguage.Name)] [ExportLanguageServiceFactory(typeof(EditorSettingsManagerInternal), RazorLanguage.Name)]
internal class DefaultEditorSettingsManagerFactory : ILanguageServiceFactory internal class DefaultEditorSettingsManagerInternalFactory : ILanguageServiceFactory
{ {
public ILanguageService CreateLanguageService(HostLanguageServices languageServices) public ILanguageService CreateLanguageService(HostLanguageServices languageServices)
{ {
@ -19,7 +19,7 @@ namespace Microsoft.CodeAnalysis.Razor.Editor
throw new ArgumentNullException(nameof(languageServices)); throw new ArgumentNullException(nameof(languageServices));
} }
return new DefaultEditorSettingsManager(); return new DefaultEditorSettingsManagerInternal();
} }
} }
} }

View File

@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis.Host;
namespace Microsoft.CodeAnalysis.Razor.Editor namespace Microsoft.CodeAnalysis.Razor.Editor
{ {
public abstract class EditorSettingsManager : ILanguageService internal abstract class EditorSettingsManagerInternal : ILanguageService
{ {
public abstract event EventHandler<EditorSettingsChangedEventArgs> Changed; public abstract event EventHandler<EditorSettingsChangedEventArgs> Changed;

View File

@ -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<EditorSettingsManagerInternal>();
}
public override event EventHandler<EditorSettingsChangedEventArgs> Changed
{
add => _editorSettingsManager.Changed += value;
remove => _editorSettingsManager.Changed -= value;
}
public override EditorSettings Current => _editorSettingsManager.Current;
public override void Update(EditorSettings updateSettings)
{
_editorSettingsManager.Update(updateSettings);
}
}
}

View File

@ -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<EditorSettingsChangedEventArgs> Changed;
public abstract EditorSettings Current { get; }
public abstract void Update(EditorSettings updateSettings);
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -18,7 +18,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
{ {
private readonly string _filePath; private readonly string _filePath;
private readonly ProjectSnapshotManager _projectManager; private readonly ProjectSnapshotManager _projectManager;
private readonly EditorSettingsManager _editorSettingsManager; private readonly EditorSettingsManagerInternal _editorSettingsManager;
private readonly TextBufferProjectService _projectService; private readonly TextBufferProjectService _projectService;
private readonly ITextBuffer _textBuffer; private readonly ITextBuffer _textBuffer;
private readonly List<ITextView> _textViews; private readonly List<ITextView> _textViews;
@ -33,7 +33,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
string filePath, string filePath,
ProjectSnapshotManager projectManager, ProjectSnapshotManager projectManager,
TextBufferProjectService projectService, TextBufferProjectService projectService,
EditorSettingsManager editorSettingsManager, EditorSettingsManagerInternal editorSettingsManager,
Workspace workspace, Workspace workspace,
ITextBuffer textBuffer) ITextBuffer textBuffer)
{ {

View File

@ -22,7 +22,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
private readonly Workspace _workspace; private readonly Workspace _workspace;
private readonly ForegroundDispatcher _foregroundDispatcher; private readonly ForegroundDispatcher _foregroundDispatcher;
private readonly ProjectSnapshotManager _projectManager; private readonly ProjectSnapshotManager _projectManager;
private readonly EditorSettingsManager _editorSettingsManager; private readonly EditorSettingsManagerInternal _editorSettingsManager;
[ImportingConstructor] [ImportingConstructor]
public DefaultVisualStudioDocumentTrackerFactory( public DefaultVisualStudioDocumentTrackerFactory(
@ -52,7 +52,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
_foregroundDispatcher = workspace.Services.GetRequiredService<ForegroundDispatcher>(); _foregroundDispatcher = workspace.Services.GetRequiredService<ForegroundDispatcher>();
var razorLanguageServices = workspace.Services.GetLanguageServices(RazorLanguage.Name); var razorLanguageServices = workspace.Services.GetLanguageServices(RazorLanguage.Name);
_projectManager = razorLanguageServices.GetRequiredService<ProjectSnapshotManager>(); _projectManager = razorLanguageServices.GetRequiredService<ProjectSnapshotManager>();
_editorSettingsManager = razorLanguageServices.GetRequiredService<EditorSettingsManager>(); _editorSettingsManager = razorLanguageServices.GetRequiredService<EditorSettingsManagerInternal>();
} }
public override VisualStudioDocumentTracker Create(ITextBuffer textBuffer) public override VisualStudioDocumentTracker Create(ITextBuffer textBuffer)

View File

@ -5,13 +5,13 @@ using Xunit;
namespace Microsoft.CodeAnalysis.Razor.Editor namespace Microsoft.CodeAnalysis.Razor.Editor
{ {
public class DefaultEditorSettingsManagerTest public class DefaultEditorSettingsManagerInternalTest
{ {
[Fact] [Fact]
public void InitialSettingsAreDefault() public void InitialSettingsAreDefault()
{ {
// Act // Act
var manager = new DefaultEditorSettingsManager(); var manager = new DefaultEditorSettingsManagerInternal();
// Assert // Assert
Assert.Equal(EditorSettings.Default, manager.Current); Assert.Equal(EditorSettings.Default, manager.Current);
@ -21,7 +21,7 @@ namespace Microsoft.CodeAnalysis.Razor.Editor
public void Update_TriggersChangedIfEditorSettingsAreDifferent() public void Update_TriggersChangedIfEditorSettingsAreDifferent()
{ {
// Arrange // Arrange
var manager = new DefaultEditorSettingsManager(); var manager = new DefaultEditorSettingsManagerInternal();
var called = false; var called = false;
manager.Changed += (caller, args) => manager.Changed += (caller, args) =>
{ {
@ -41,7 +41,7 @@ namespace Microsoft.CodeAnalysis.Razor.Editor
public void Update_DoesNotTriggerChangedIfEditorSettingsAreSame() public void Update_DoesNotTriggerChangedIfEditorSettingsAreSame()
{ {
// Arrange // Arrange
var manager = new DefaultEditorSettingsManager(); var manager = new DefaultEditorSettingsManagerInternal();
var called = false; var called = false;
manager.Changed += (caller, args) => manager.Changed += (caller, args) =>
{ {

View File

@ -30,7 +30,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
s.IsSupportedProject(It.IsAny<IVsHierarchy>()) == true && s.IsSupportedProject(It.IsAny<IVsHierarchy>()) == true &&
s.GetProjectPath(It.IsAny<IVsHierarchy>()) == "C:/Some/Path/TestProject.csproj"); s.GetProjectPath(It.IsAny<IVsHierarchy>()) == "C:/Some/Path/TestProject.csproj");
private EditorSettingsManager EditorSettingsManager => new DefaultEditorSettingsManager(); private EditorSettingsManagerInternal EditorSettingsManager => new DefaultEditorSettingsManagerInternal();
private Workspace Workspace => new AdhocWorkspace(); private Workspace Workspace => new AdhocWorkspace();

View File

@ -26,7 +26,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
s.IsSupportedProject(It.IsAny<IVsHierarchy>()) == true && s.IsSupportedProject(It.IsAny<IVsHierarchy>()) == true &&
s.GetProjectPath(It.IsAny<IVsHierarchy>()) == "C:/Some/Path/TestProject.csproj"); s.GetProjectPath(It.IsAny<IVsHierarchy>()) == "C:/Some/Path/TestProject.csproj");
private EditorSettingsManager EditorSettingsManager => new DefaultEditorSettingsManager(); private EditorSettingsManagerInternal EditorSettingsManager => new DefaultEditorSettingsManagerInternal();
private Workspace Workspace { get; } = new AdhocWorkspace(); private Workspace Workspace { get; } = new AdhocWorkspace();