提交 65a5b468 编写于 作者: S Sam Harwell

Fix layering of IEmbeddedLanguagesProvider

上级 22286daa
......@@ -4,15 +4,15 @@
using Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.CSharp.Features.EmbeddedLanguages;
using Microsoft.CodeAnalysis.Editor.EmbeddedLanguages;
using Microsoft.CodeAnalysis.Features.EmbeddedLanguages;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.CSharp.Editor.EmbeddedLanguages
{
[ExportLanguageService(typeof(IEmbeddedLanguageEditorFeaturesProvider), LanguageNames.CSharp), Shared]
[ExportLanguageService(typeof(IEmbeddedLanguagesProvider), LanguageNames.CSharp, ServiceLayer.Editor), Shared]
internal class CSharpEmbeddedLanguageEditorFeaturesProvider : AbstractEmbeddedLanguageEditorFeaturesProvider
{
public static IEmbeddedLanguageFeaturesProvider Instance = new CSharpEmbeddedLanguageEditorFeaturesProvider();
public static IEmbeddedLanguagesProvider Instance = new CSharpEmbeddedLanguageEditorFeaturesProvider();
public CSharpEmbeddedLanguageEditorFeaturesProvider() : base(CSharpEmbeddedLanguagesProvider.Info)
{
......
......@@ -11,17 +11,15 @@ namespace Microsoft.CodeAnalysis.Editor.EmbeddedLanguages
/// Abstract implementation of the C# and VB embedded language providers.
/// </summary>
internal abstract class AbstractEmbeddedLanguageEditorFeaturesProvider
: AbstractEmbeddedLanguageFeaturesProvider, IEmbeddedLanguageEditorFeaturesProvider
: AbstractEmbeddedLanguageFeaturesProvider
{
new public ImmutableArray<IEmbeddedLanguageEditorFeatures> Languages { get; }
public override ImmutableArray<IEmbeddedLanguage> Languages { get; }
protected AbstractEmbeddedLanguageEditorFeaturesProvider(EmbeddedLanguageInfo info) : base(info)
{
// No 'Fallback' language added here. That's because the Fallback language doesn't
// support any of the IEmbeddedLanguageFeatures or IEmbeddedLanguageEditorFeatures
// capabilities.
Languages = ImmutableArray.Create<IEmbeddedLanguageEditorFeatures>(
new RegexEmbeddedLanguageEditorFeatures(this, info));
Languages = ImmutableArray.Create<IEmbeddedLanguage>(
new RegexEmbeddedLanguageEditorFeatures(this, info),
new FallbackEmbeddedLanguage(info));
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Features.EmbeddedLanguages;
namespace Microsoft.CodeAnalysis.Editor.EmbeddedLanguages
{
/// <summary>
/// Service that returns all the embedded languages supported. Each embedded language can expose
/// individual language services through the <see cref="IEmbeddedLanguageEditorFeatures"/> interface.
/// </summary>
internal interface IEmbeddedLanguageEditorFeaturesProvider : IEmbeddedLanguageFeaturesProvider
{
new ImmutableArray<IEmbeddedLanguageEditorFeatures> Languages { get; }
}
}
......@@ -16,12 +16,12 @@ internal abstract class AbstractEmbeddedLanguageBraceMatcher : IBraceMatcher
public async Task<BraceMatchingResult?> FindBracesAsync(
Document document, int position, CancellationToken cancellationToken)
{
var languagesProvider = document.GetLanguageService<IEmbeddedLanguageEditorFeaturesProvider>();
var languagesProvider = document.GetLanguageService<IEmbeddedLanguagesProvider>();
if (languagesProvider != null)
{
foreach (var language in languagesProvider.Languages)
{
var braceMatcher = language.BraceMatcher;
var braceMatcher = (language as IEmbeddedLanguageEditorFeatures)?.BraceMatcher;
if (braceMatcher != null)
{
var result = await braceMatcher.FindBracesAsync(
......
......@@ -2,11 +2,12 @@
Imports System.Composition
Imports Microsoft.CodeAnalysis.Editor.EmbeddedLanguages
Imports Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
Namespace Microsoft.CodeAnalysis.VisualBasic.Features.EmbeddedLanguages
<ExportLanguageService(GetType(IEmbeddedLanguageEditorFeaturesProvider), LanguageNames.VisualBasic), [Shared]>
<ExportLanguageService(GetType(IEmbeddedLanguagesProvider), LanguageNames.VisualBasic, ServiceLayer.Editor), [Shared]>
Friend Class VisualBasicEmbeddedLanguageEditorFeaturesProvider
Inherits AbstractEmbeddedLanguageEditorFeaturesProvider
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Composition;
using System.Diagnostics;
using Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Features.EmbeddedLanguages;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.CSharp.Features.EmbeddedLanguages
{
[ExportLanguageService(typeof(IEmbeddedLanguageFeaturesProvider), LanguageNames.CSharp), Shared]
[ExportLanguageService(typeof(IEmbeddedLanguagesProvider), LanguageNames.CSharp, ServiceLayer.Desktop), Shared]
internal class CSharpEmbeddedLanguageFeaturesProvider : AbstractEmbeddedLanguageFeaturesProvider
{
public static IEmbeddedLanguageFeaturesProvider Instance = new CSharpEmbeddedLanguageFeaturesProvider();
public static IEmbeddedLanguagesProvider Instance = new CSharpEmbeddedLanguageFeaturesProvider();
public CSharpEmbeddedLanguageFeaturesProvider() : base(CSharpEmbeddedLanguagesProvider.Info)
{
......
......@@ -4,6 +4,7 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Features.EmbeddedLanguages;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Text;
......@@ -21,18 +22,18 @@ internal class EmbeddedLanguageCompletionProvider : CompletionProvider
{
public const string EmbeddedProviderName = "EmbeddedProvider";
private readonly ImmutableArray<IEmbeddedLanguageFeatures> _languageProviders;
private readonly ImmutableArray<IEmbeddedLanguage> _languageProviders;
public EmbeddedLanguageCompletionProvider(IEmbeddedLanguageFeaturesProvider languagesProvider)
public EmbeddedLanguageCompletionProvider(IEmbeddedLanguagesProvider languagesProvider)
{
_languageProviders = languagesProvider?.Languages ?? ImmutableArray<IEmbeddedLanguageFeatures>.Empty;
_languageProviders = languagesProvider?.Languages ?? ImmutableArray<IEmbeddedLanguage>.Empty;
}
public override bool ShouldTriggerCompletion(SourceText text, int caretPosition, CompletionTrigger trigger, OptionSet options)
{
foreach (var language in _languageProviders)
{
var completionProvider = language.CompletionProvider;
var completionProvider = (language as IEmbeddedLanguageFeatures)?.CompletionProvider;
if (completionProvider != null)
{
if (completionProvider.ShouldTriggerCompletion(
......@@ -50,7 +51,7 @@ public override async Task ProvideCompletionsAsync(CompletionContext context)
{
foreach (var language in _languageProviders)
{
var completionProvider = language.CompletionProvider;
var completionProvider = (language as IEmbeddedLanguageFeatures)?.CompletionProvider;
if (completionProvider != null)
{
var count = context.Items.Count;
......@@ -71,6 +72,6 @@ public override Task<CompletionDescription> GetDescriptionAsync(Document documen
=> GetLanguage(item).CompletionProvider.GetDescriptionAsync(document, item, cancellationToken);
private IEmbeddedLanguageFeatures GetLanguage(CompletionItem item)
=> _languageProviders.Single(lang => lang.CompletionProvider?.Name == item.Properties[EmbeddedProviderName]);
=> (IEmbeddedLanguageFeatures)_languageProviders.Single(lang => (lang as IEmbeddedLanguageFeatures)?.CompletionProvider?.Name == item.Properties[EmbeddedProviderName]);
}
}
......@@ -95,12 +95,12 @@ internal abstract partial class AbstractDocumentHighlightsService : IDocumentHig
private async Task<ImmutableArray<DocumentHighlights>> TryGetEmbeddedLanguageHighlightsAsync(
Document document, int position, IImmutableSet<Document> documentsToSearch, CancellationToken cancellationToken)
{
var languagesProvider = document.GetLanguageService<IEmbeddedLanguageFeaturesProvider>();
var languagesProvider = document.GetLanguageService<IEmbeddedLanguagesProvider>();
if (languagesProvider != null)
{
foreach (var language in languagesProvider.Languages)
{
var highlighter = language.DocumentHighlightsService;
var highlighter = (language as IEmbeddedLanguageFeatures)?.DocumentHighlightsService;
if (highlighter != null)
{
var highlights = await highlighter.GetDocumentHighlightsAsync(
......
......@@ -6,6 +6,7 @@
using System.Linq;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.PooledObjects;
namespace Microsoft.CodeAnalysis.Features.EmbeddedLanguages
......@@ -17,8 +18,7 @@ internal abstract class AbstractEmbeddedLanguageDiagnosticAnalyzer : DiagnosticA
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; }
protected AbstractEmbeddedLanguageDiagnosticAnalyzer(
IEmbeddedLanguageFeaturesProvider languagesProvider)
protected AbstractEmbeddedLanguageDiagnosticAnalyzer(IEmbeddedLanguagesProvider languagesProvider)
{
var supportedDiagnostics = ArrayBuilder<DiagnosticDescriptor>.GetInstance();
......@@ -28,7 +28,7 @@ internal abstract class AbstractEmbeddedLanguageDiagnosticAnalyzer : DiagnosticA
Debug.Assert(languagesProvider.Languages.Length > 0);
foreach (var language in languagesProvider.Languages)
{
var analyzer = language.DiagnosticAnalyzer;
var analyzer = (language as IEmbeddedLanguageFeatures)?.DiagnosticAnalyzer;
if (analyzer != null)
{
analyzers.Add(analyzer);
......
......@@ -9,17 +9,15 @@ namespace Microsoft.CodeAnalysis.Features.EmbeddedLanguages
/// <summary>
/// Abstract implementation of the C# and VB embedded language providers.
/// </summary>
internal abstract class AbstractEmbeddedLanguageFeaturesProvider : AbstractEmbeddedLanguagesProvider, IEmbeddedLanguageFeaturesProvider
internal abstract class AbstractEmbeddedLanguageFeaturesProvider : AbstractEmbeddedLanguagesProvider
{
new public ImmutableArray<IEmbeddedLanguageFeatures> Languages { get; }
public override ImmutableArray<IEmbeddedLanguage> Languages { get; }
protected AbstractEmbeddedLanguageFeaturesProvider(EmbeddedLanguageInfo info) : base(info)
{
// No 'Fallback' language added here. That's because the Fallback language doesn't
// support any of the IEmbeddedLanguageFeatures or IEmbeddedLanguageEditorFeatures
// capabilities.
Languages = ImmutableArray.Create<IEmbeddedLanguageFeatures>(
new RegexEmbeddedLanguageFeatures(this, info));
Languages = ImmutableArray.Create<IEmbeddedLanguage>(
new RegexEmbeddedLanguageFeatures(this, info),
new FallbackEmbeddedLanguage(info));
}
/// <summary>Escapes <paramref name="text"/> appropriately so it can be inserted into
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Host;
namespace Microsoft.CodeAnalysis.Features.EmbeddedLanguages
{
/// <summary>
/// Service that returns all the embedded languages supported. Each embedded language can expose
/// individual language services through the <see cref="IEmbeddedLanguageFeatures"/> interface.
/// </summary>
internal interface IEmbeddedLanguageFeaturesProvider : IEmbeddedLanguagesProvider
{
new ImmutableArray<IEmbeddedLanguageFeatures> Languages { get; }
}
}
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Composition
Imports Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
Imports Microsoft.CodeAnalysis.Features.EmbeddedLanguages
Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
Namespace Microsoft.CodeAnalysis.VisualBasic.Features.EmbeddedLanguages
<ExportLanguageService(GetType(IEmbeddedLanguageFeaturesProvider), LanguageNames.VisualBasic), [Shared]>
<ExportLanguageService(GetType(IEmbeddedLanguagesProvider), LanguageNames.VisualBasic, ServiceLayer.Desktop), [Shared]>
Friend Class VisualBasicEmbeddedLanguageFeaturesProvider
Inherits AbstractEmbeddedLanguageFeaturesProvider
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Composition;
using System.Diagnostics;
using Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.VirtualChars;
using Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.CSharp.EmbeddedLanguages.LanguageServices
{
[ExportLanguageService(typeof(IEmbeddedLanguagesProvider), LanguageNames.CSharp), Shared]
[ExportLanguageService(typeof(IEmbeddedLanguagesProvider), LanguageNames.CSharp, ServiceLayer.Default), Shared]
internal class CSharpEmbeddedLanguagesProvider : AbstractEmbeddedLanguagesProvider
{
public static EmbeddedLanguageInfo Info = new EmbeddedLanguageInfo(
......
......@@ -10,7 +10,7 @@ namespace Microsoft.CodeAnalysis.EmbeddedLanguages.LanguageServices
/// </summary>
internal abstract class AbstractEmbeddedLanguagesProvider : IEmbeddedLanguagesProvider
{
public ImmutableArray<IEmbeddedLanguage> Languages { get; }
public virtual ImmutableArray<IEmbeddedLanguage> Languages { get; }
protected AbstractEmbeddedLanguagesProvider(EmbeddedLanguageInfo info)
{
......
......@@ -6,7 +6,7 @@ Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.VirtualChars
Namespace Microsoft.CodeAnalysis.VisualBasic.EmbeddedLanguages.LanguageServices
<ExportLanguageService(GetType(IEmbeddedLanguagesProvider), LanguageNames.VisualBasic), [Shared]>
<ExportLanguageService(GetType(IEmbeddedLanguagesProvider), LanguageNames.VisualBasic, ServiceLayer.Default), [Shared]>
Friend Class VisualBasicEmbeddedLanguagesProvider
Inherits AbstractEmbeddedLanguagesProvider
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册