Moved RazorCodeDocumentProvider from Mef to ILanguageService

This commit is contained in:
Ajay Bhargav Baaskaran 2017-12-11 12:30:48 -08:00
parent 3ee6426503
commit fb68a31ad5
4 changed files with 60 additions and 26 deletions

View File

@ -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<TextBufferCodeDocumentProvider>();
}
// Internal for testing
internal DefaultCodeDocumentProvider(
RazorTextBufferProvider bufferProvider,
TextBufferCodeDocumentProvider codeDocumentProvider)
{

View File

@ -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<TextBufferCodeDocumentProvider>();
return new DefaultCodeDocumentProvider(_textBufferProvider, textBufferCodeDocumentProvider);
}
}
}

View File

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

View File

@ -37,7 +37,23 @@ namespace Microsoft.VisualStudio.Editor.Razor
private readonly Lazy<RazorCodeDocumentProvider> _codeDocumentProvider;
[ImportingConstructor]
public RazorDirectiveCompletionProvider([Import(typeof(RazorCodeDocumentProvider))] Lazy<RazorCodeDocumentProvider> 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<RazorCodeDocumentProvider>(() =>
{
var languageServices = workspaceAccessor.Workspace.Services.GetLanguageServices(RazorLanguage.Name);
return languageServices.GetRequiredService<RazorCodeDocumentProvider>();
});
}
// Internal for testing
internal RazorDirectiveCompletionProvider(Lazy<RazorCodeDocumentProvider> codeDocumentProvider)
{
if (codeDocumentProvider == null)
{