From fb68a31ad5ec921935f6eca12eaa151f03f1d064 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Mon, 11 Dec 2017 12:30:48 -0800 Subject: [PATCH] Moved RazorCodeDocumentProvider from Mef to ILanguageService --- .../DefaultCodeDocumentProvider.cs | 24 ----------- .../DefaultCodeDocumentProviderFactory.cs | 41 +++++++++++++++++++ .../RazorCodeDocumentProvider.cs | 3 +- .../RazorDirectiveCompletionProvider.cs | 18 +++++++- 4 files changed, 60 insertions(+), 26 deletions(-) create mode 100644 src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProviderFactory.cs diff --git a/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProvider.cs b/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProvider.cs index 5ec01ee4c8..f512a4e3f2 100644 --- a/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProvider.cs +++ b/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProvider.cs @@ -2,41 +2,17 @@ // 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.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.Razor; namespace Microsoft.VisualStudio.Editor.Razor { - [System.Composition.Shared] - [Export(typeof(RazorCodeDocumentProvider))] internal class DefaultCodeDocumentProvider : RazorCodeDocumentProvider { private readonly RazorTextBufferProvider _bufferProvider; private readonly TextBufferCodeDocumentProvider _codeDocumentProvider; - [ImportingConstructor] public DefaultCodeDocumentProvider( - RazorTextBufferProvider bufferProvider, - VisualStudioWorkspaceAccessor workspaceAccessor) - { - if (bufferProvider == null) - { - throw new ArgumentNullException(nameof(bufferProvider)); - } - - if (workspaceAccessor == null) - { - throw new ArgumentNullException(nameof(workspaceAccessor)); - } - - _bufferProvider = bufferProvider; - _codeDocumentProvider = workspaceAccessor.Workspace.Services.GetLanguageServices(RazorLanguage.Name).GetRequiredService(); - } - - // Internal for testing - internal DefaultCodeDocumentProvider( RazorTextBufferProvider bufferProvider, TextBufferCodeDocumentProvider codeDocumentProvider) { diff --git a/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProviderFactory.cs b/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProviderFactory.cs new file mode 100644 index 0000000000..d98e88133b --- /dev/null +++ b/src/Microsoft.VisualStudio.Editor.Razor/DefaultCodeDocumentProviderFactory.cs @@ -0,0 +1,41 @@ +// 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.Composition; +using Microsoft.CodeAnalysis.Host; +using Microsoft.CodeAnalysis.Host.Mef; +using Microsoft.CodeAnalysis.Razor; + +namespace Microsoft.VisualStudio.Editor.Razor +{ + [Shared] + [ExportLanguageServiceFactory(typeof(RazorCodeDocumentProvider), RazorLanguage.Name)] + internal class DefaultCodeDocumentProviderFactory : ILanguageServiceFactory + { + private readonly RazorTextBufferProvider _textBufferProvider; + + [ImportingConstructor] + public DefaultCodeDocumentProviderFactory(RazorTextBufferProvider bufferProvider) + { + if (bufferProvider == null) + { + throw new ArgumentNullException(nameof(bufferProvider)); + } + + _textBufferProvider = bufferProvider; + } + + public ILanguageService CreateLanguageService(HostLanguageServices languageServices) + { + if (languageServices == null) + { + throw new ArgumentNullException(nameof(languageServices)); + } + + var textBufferCodeDocumentProvider = languageServices.GetRequiredService(); + + return new DefaultCodeDocumentProvider(_textBufferProvider, textBufferCodeDocumentProvider); + } + } +} diff --git a/src/Microsoft.VisualStudio.Editor.Razor/RazorCodeDocumentProvider.cs b/src/Microsoft.VisualStudio.Editor.Razor/RazorCodeDocumentProvider.cs index be30691363..517d9914d9 100644 --- a/src/Microsoft.VisualStudio.Editor.Razor/RazorCodeDocumentProvider.cs +++ b/src/Microsoft.VisualStudio.Editor.Razor/RazorCodeDocumentProvider.cs @@ -3,10 +3,11 @@ using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Host; namespace Microsoft.VisualStudio.Editor.Razor { - internal abstract class RazorCodeDocumentProvider + internal abstract class RazorCodeDocumentProvider : ILanguageService { public abstract bool TryGetFromDocument(TextDocument document, out RazorCodeDocument codeDocument); } diff --git a/src/Microsoft.VisualStudio.Editor.Razor/RazorDirectiveCompletionProvider.cs b/src/Microsoft.VisualStudio.Editor.Razor/RazorDirectiveCompletionProvider.cs index 88e94fe035..cf2c7a0a57 100644 --- a/src/Microsoft.VisualStudio.Editor.Razor/RazorDirectiveCompletionProvider.cs +++ b/src/Microsoft.VisualStudio.Editor.Razor/RazorDirectiveCompletionProvider.cs @@ -37,7 +37,23 @@ namespace Microsoft.VisualStudio.Editor.Razor private readonly Lazy _codeDocumentProvider; [ImportingConstructor] - public RazorDirectiveCompletionProvider([Import(typeof(RazorCodeDocumentProvider))] Lazy codeDocumentProvider) + public RazorDirectiveCompletionProvider(VisualStudioWorkspaceAccessor workspaceAccessor) + { + if (workspaceAccessor == null) + { + throw new ArgumentNullException(nameof(workspaceAccessor)); + } + + // Lazy because we don't want Microsoft.AspNetCore.Razor.Language assembly getting loaded for non Razor scenarios. + _codeDocumentProvider = new Lazy(() => + { + var languageServices = workspaceAccessor.Workspace.Services.GetLanguageServices(RazorLanguage.Name); + return languageServices.GetRequiredService(); + }); + } + + // Internal for testing + internal RazorDirectiveCompletionProvider(Lazy codeDocumentProvider) { if (codeDocumentProvider == null) {