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
{
internal class DefaultEditorSettingsManager : EditorSettingsManager
internal class DefaultEditorSettingsManagerInternal : EditorSettingsManagerInternal
{
public override event EventHandler<EditorSettingsChangedEventArgs> Changed;
private readonly object SettingsAccessorLock = new object();
private EditorSettings _settings;
public DefaultEditorSettingsManager()
public DefaultEditorSettingsManagerInternal()
{
_settings = EditorSettings.Default;
}

View File

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

View File

@ -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<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 ProjectSnapshotManager _projectManager;
private readonly EditorSettingsManager _editorSettingsManager;
private readonly EditorSettingsManagerInternal _editorSettingsManager;
private readonly TextBufferProjectService _projectService;
private readonly ITextBuffer _textBuffer;
private readonly List<ITextView> _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)
{

View File

@ -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<ForegroundDispatcher>();
var razorLanguageServices = workspace.Services.GetLanguageServices(RazorLanguage.Name);
_projectManager = razorLanguageServices.GetRequiredService<ProjectSnapshotManager>();
_editorSettingsManager = razorLanguageServices.GetRequiredService<EditorSettingsManager>();
_editorSettingsManager = razorLanguageServices.GetRequiredService<EditorSettingsManagerInternal>();
}
public override VisualStudioDocumentTracker Create(ITextBuffer textBuffer)

View File

@ -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) =>
{

View File

@ -30,7 +30,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
s.IsSupportedProject(It.IsAny<IVsHierarchy>()) == true &&
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();

View File

@ -26,7 +26,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor.Editor
s.IsSupportedProject(It.IsAny<IVsHierarchy>()) == true &&
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();