提交 23732845 编写于 作者: S Sam Harwell

Implement INavigateToItemProvider2 without requiring breaking API changes

上级 260e8f90
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
......@@ -108,7 +109,7 @@ private async Task SearchAsyncWorker(Project project)
{
using (cacheService.EnableCaching(project.Id))
{
var service = project.LanguageServices.GetService<INavigateToSearchService>();
var service = TryGetNavigateToSearchService(project);
if (service != null)
{
var searchTask = _currentDocument != null
......@@ -128,6 +129,27 @@ private async Task SearchAsyncWorker(Project project)
}
}
private static INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate TryGetNavigateToSearchService(Project project)
{
var service = project.LanguageServices.GetService<INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate>();
if (service != null)
{
return service;
}
#pragma warning disable CS0618 // Type or member is obsolete
#pragma warning disable CS0612 // Type or member is obsolete
var legacyService = project.LanguageServices.GetService<INavigateToSearchService>();
if (legacyService != null)
{
return new ShimNavigateToSearchService(legacyService);
}
#pragma warning restore CS0612 // Type or member is obsolete
#pragma warning restore CS0618 // Type or member is obsolete
return null;
}
private void ReportMatchResult(Project project, INavigateToSearchResult result)
{
var matchedSpans = result.NameMatchSpans.SelectAsArray(t => t.ToSpan());
......@@ -182,6 +204,27 @@ private static string GetNavigateToLanguage(string languageName)
return languageName;
}
}
[Obsolete]
private class ShimNavigateToSearchService : INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate
{
private readonly INavigateToSearchService _navigateToSearchService;
public ShimNavigateToSearchService(INavigateToSearchService navigateToSearchService)
{
_navigateToSearchService = navigateToSearchService;
}
public IImmutableSet<string> KindsProvided => ImmutableHashSet<string>.Empty;
public bool CanFilter => false;
public Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
=> _navigateToSearchService.SearchDocumentAsync(document, searchPattern, cancellationToken);
public Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
=> _navigateToSearchService.SearchProjectAsync(project, searchPattern, cancellationToken);
}
}
}
}
......@@ -2,11 +2,12 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.VisualStudio.Language.NavigateTo.Interfaces;
using Roslyn.Utilities;
using INavigateToSearchService = Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchService;
using INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate = Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate;
namespace Microsoft.CodeAnalysis.Editor.Implementation.NavigateTo
{
......@@ -30,21 +31,58 @@ internal partial class NavigateToItemProvider : INavigateToItemProvider2
_displayFactory = new NavigateToItemDisplayFactory();
}
public ISet<string> KindsProvided { get; } = ImmutableHashSet.Create(
NavigateToItemKind.Class,
NavigateToItemKind.Constant,
NavigateToItemKind.Delegate,
NavigateToItemKind.Enum,
NavigateToItemKind.EnumItem,
NavigateToItemKind.Event,
NavigateToItemKind.Field,
NavigateToItemKind.Interface,
NavigateToItemKind.Method,
NavigateToItemKind.Module,
NavigateToItemKind.Property,
NavigateToItemKind.Structure);
public bool CanFilter => true;
public ISet<string> KindsProvided
{
get
{
var result = new HashSet<string>(StringComparer.Ordinal);
foreach (var project in _workspace.CurrentSolution.Projects)
{
var navigateToSearchService = project.LanguageServices.GetService<INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate>();
if (navigateToSearchService != null)
{
result.UnionWith(navigateToSearchService.KindsProvided);
continue;
}
}
return result;
}
}
public bool CanFilter
{
get
{
foreach (var project in _workspace.CurrentSolution.Projects)
{
var navigateToSearchService = project.LanguageServices.GetService<INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate>();
if (navigateToSearchService != null)
{
if (!navigateToSearchService.CanFilter)
{
return false;
}
continue;
}
#pragma warning disable CS0618 // Type or member is obsolete
var legacyNavigateToSearchService = project.LanguageServices.GetService<INavigateToSearchService>();
if (legacyNavigateToSearchService != null)
{
return false;
}
#pragma warning restore CS0618 // Type or member is obsolete
// If we reach here, it means the current project does not support Navigate To, which is
// functionally equivalent to supporting filtering.
}
// All projects either support filtering or do not support Navigate To at all
return true;
}
}
public void StopSearch()
{
......
......@@ -6,7 +6,7 @@
namespace Microsoft.CodeAnalysis.CSharp.NavigateTo
{
[ExportLanguageService(typeof(INavigateToSearchService), LanguageNames.CSharp), Shared]
[ExportLanguageService(typeof(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate), LanguageNames.CSharp), Shared]
internal class CSharpNavigateToSearchService : AbstractNavigateToSearchService
{
}
......
......@@ -7,8 +7,24 @@
namespace Microsoft.CodeAnalysis.NavigateTo
{
internal abstract partial class AbstractNavigateToSearchService : INavigateToSearchService
internal abstract partial class AbstractNavigateToSearchService : INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate
{
public IImmutableSet<string> KindsProvided { get; } = ImmutableHashSet.Create(
NavigateToItemKind.Class,
NavigateToItemKind.Constant,
NavigateToItemKind.Delegate,
NavigateToItemKind.Enum,
NavigateToItemKind.EnumItem,
NavigateToItemKind.Event,
NavigateToItemKind.Field,
NavigateToItemKind.Interface,
NavigateToItemKind.Method,
NavigateToItemKind.Module,
NavigateToItemKind.Property,
NavigateToItemKind.Structure);
public bool CanFilter => true;
public async Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(
Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
{
......
// 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.Generic;
using System.Collections.Immutable;
using System.Threading;
......@@ -8,8 +9,25 @@
namespace Microsoft.CodeAnalysis.NavigateTo
{
[Obsolete("Use " + nameof(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate) + " instead.")]
internal interface INavigateToSearchService : ILanguageService
{
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, CancellationToken cancellationToken);
}
internal interface INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate : ILanguageService
{
IImmutableSet<string> KindsProvided
{
get;
}
bool CanFilter
{
get;
}
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken);
}
......
......@@ -5,7 +5,7 @@ Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.NavigateTo
Namespace Microsoft.CodeAnalysis.VisualBasic.NavigateTo
<ExportLanguageService(GetType(INavigateToSearchService), LanguageNames.VisualBasic), [Shared]>
<ExportLanguageService(GetType(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicNavigateToSearchService
Inherits AbstractNavigateToSearchService
End Class
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册