未验证 提交 87753710 编写于 作者: S Sam Harwell 提交者: GitHub

Merge pull request #19599 from CyrusNajmabadi/removeOldApi

Remove old IDocumentHIghlightsService.
// 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;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.Editor
{
internal enum HighlightSpanKind
{
None,
Definition,
Reference,
WrittenReference,
}
internal struct HighlightSpan
{
public TextSpan TextSpan { get; }
public HighlightSpanKind Kind { get; }
public HighlightSpan(TextSpan textSpan, HighlightSpanKind kind) : this()
{
this.TextSpan = textSpan;
this.Kind = kind;
}
}
internal struct DocumentHighlights
{
public Document Document { get; }
public ImmutableArray<HighlightSpan> HighlightSpans { get; }
public DocumentHighlights(Document document, ImmutableArray<HighlightSpan> highlightSpans)
{
this.Document = document;
this.HighlightSpans = highlightSpans;
}
}
/// <summary>
/// Note: kept around for back compat until F# and TypeScript move over to
/// <see cref="Microsoft.CodeAnalysis.DocumentHighlighting.IDocumentHighlightsService"/>.
/// </summary>
internal interface IDocumentHighlightsService : ILanguageService
{
Task<ImmutableArray<DocumentHighlights>> GetDocumentHighlightsAsync(
Document document, int position, IImmutableSet<Document> documentsToSearch, CancellationToken cancellationToken);
}
}
......@@ -5,13 +5,11 @@
using System.Collections.Immutable;
using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.DocumentHighlighting;
using Microsoft.CodeAnalysis.Editor.Shared.Options;
using Microsoft.CodeAnalysis.Editor.Shared.Tagging;
using Microsoft.CodeAnalysis.Editor.Tagging;
using Microsoft.CodeAnalysis.Host;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.Notification;
using Microsoft.CodeAnalysis.Options;
......@@ -133,73 +131,27 @@ protected override Task ProduceTagsAsync(TaggerContext<NavigableHighlightTag> co
{
if (document != null)
{
// As we transition to the new API (defined at the Features layer) we support
// calling into both it and the old API (defined at the EditorFeatures layer).
//
// Once TypeScript and F# can move over, then we can remove the calls to the old
// API.
await TryNewServiceAsync(context, position, document).ConfigureAwait(false);
await TryOldServiceAsync(context, position, document).ConfigureAwait(false);
}
}
}
private Task TryOldServiceAsync(TaggerContext<NavigableHighlightTag> context, SnapshotPoint position, Document document)
{
return TryServiceAsync<IDocumentHighlightsService>(
context, position, document,
(s, d, p, ds, c) => s.GetDocumentHighlightsAsync(d, p, ds, c));
}
private Task TryNewServiceAsync(
TaggerContext<NavigableHighlightTag> context, SnapshotPoint position, Document document)
{
return TryServiceAsync<DocumentHighlighting.IDocumentHighlightsService>(
context, position, document,
async (service, doc, point, documents, cancellation) =>
{
// Call into the new service.
var newHighlights = await service.GetDocumentHighlightsAsync(doc, point, documents, cancellation).ConfigureAwait(false);
// then convert the result to the form the old service would return.
return ConvertHighlights(newHighlights);
});
}
private async Task TryServiceAsync<T>(
TaggerContext<NavigableHighlightTag> context, SnapshotPoint position, Document document,
Func<T, Document, SnapshotPoint, ImmutableHashSet<Document>, CancellationToken, Task<ImmutableArray<DocumentHighlights>>> getDocumentHighlightsAsync)
where T : class, ILanguageService
{
var cancellationToken = context.CancellationToken;
var documentHighlightsService = document.GetLanguageService<T>();
if (documentHighlightsService != null)
{
// We only want to search inside documents that correspond to the snapshots
// we're looking at
var documentsToSearch = ImmutableHashSet.CreateRange(context.SpansToTag.Select(vt => vt.Document).WhereNotNull());
var documentHighlightsList = await getDocumentHighlightsAsync(
documentHighlightsService, document, position, documentsToSearch, cancellationToken).ConfigureAwait(false);
if (documentHighlightsList != null)
{
foreach (var documentHighlights in documentHighlightsList)
var service = document.GetLanguageService<IDocumentHighlightsService>();
if (service != null)
{
await AddTagSpansAsync(
context, document.Project.Solution, documentHighlights).ConfigureAwait(false);
// We only want to search inside documents that correspond to the snapshots
// we're looking at
var documentsToSearch = ImmutableHashSet.CreateRange(context.SpansToTag.Select(vt => vt.Document).WhereNotNull());
var documentHighlightsList = await service.GetDocumentHighlightsAsync(
document, position, documentsToSearch, cancellationToken).ConfigureAwait(false);
if (documentHighlightsList != null)
{
foreach (var documentHighlights in documentHighlightsList)
{
await AddTagSpansAsync(
context, document.Project.Solution, documentHighlights).ConfigureAwait(false);
}
}
}
}
}
}
private ImmutableArray<DocumentHighlights> ConvertHighlights(ImmutableArray<DocumentHighlighting.DocumentHighlights> newHighlights)
=> newHighlights.SelectAsArray(
documentHighlights => new DocumentHighlights(
documentHighlights.Document,
documentHighlights.HighlightSpans.SelectAsArray(
highlightSpan => new HighlightSpan(
highlightSpan.TextSpan,
(HighlightSpanKind)highlightSpan.Kind))));
private async Task AddTagSpansAsync(
TaggerContext<NavigableHighlightTag> context,
Solution solution,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册