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

Use immutable sets in Navigate To abstraction

上级 23732845
// 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.Linq;
using System.Threading;
......@@ -26,7 +25,7 @@ private class Searcher
private readonly INavigateToCallback _callback;
private readonly string _searchPattern;
private readonly bool _searchCurrentDocument;
private readonly ISet<string> _kinds;
private readonly IImmutableSet<string> _kinds;
private readonly Document _currentDocument;
private readonly ProgressTracker _progress;
private readonly IAsynchronousOperationListener _asyncListener;
......@@ -39,7 +38,7 @@ private class Searcher
INavigateToCallback callback,
string searchPattern,
bool searchCurrentDocument,
ISet<string> kinds,
IImmutableSet<string> kinds,
CancellationToken cancellationToken)
{
_solution = solution;
......@@ -215,14 +214,14 @@ public ShimNavigateToSearchService(INavigateToSearchService navigateToSearchServ
_navigateToSearchService = navigateToSearchService;
}
public IImmutableSet<string> KindsProvided => ImmutableHashSet<string>.Empty;
public IImmutableSet<string> KindsProvided => ImmutableHashSet.Create<string>(StringComparer.Ordinal);
public bool CanFilter => false;
public Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
public Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
=> _navigateToSearchService.SearchDocumentAsync(document, searchPattern, cancellationToken);
public Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
public Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
=> _navigateToSearchService.SearchProjectAsync(project, searchPattern, cancellationToken);
}
}
......
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.VisualStudio.Language.NavigateTo.Interfaces;
......@@ -31,17 +32,19 @@ internal partial class NavigateToItemProvider : INavigateToItemProvider2
_displayFactory = new NavigateToItemDisplayFactory();
}
public ISet<string> KindsProvided
ISet<string> INavigateToItemProvider2.KindsProvided => KindsProvided;
public ImmutableHashSet<string> KindsProvided
{
get
{
var result = new HashSet<string>(StringComparer.Ordinal);
var result = ImmutableHashSet.Create<string>(StringComparer.Ordinal);
foreach (var project in _workspace.CurrentSolution.Projects)
{
var navigateToSearchService = project.LanguageServices.GetService<INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate>();
if (navigateToSearchService != null)
{
result.UnionWith(navigateToSearchService.KindsProvided);
result = result.Union(navigateToSearchService.KindsProvided);
continue;
}
}
......@@ -125,10 +128,10 @@ private bool GetSearchCurrentDocumentOptionWorker(INavigateToCallback callback)
public void StartSearch(INavigateToCallback callback, string searchValue, INavigateToFilterParameters filter)
{
StartSearch(callback, searchValue, filter.Kinds);
StartSearch(callback, searchValue, filter.Kinds.ToImmutableHashSet(StringComparer.Ordinal));
}
private void StartSearch(INavigateToCallback callback, string searchValue, ISet<string> kinds)
private void StartSearch(INavigateToCallback callback, string searchValue, IImmutableSet<string> kinds)
{
this.StopSearch();
......
......@@ -23,21 +23,21 @@ internal abstract partial class AbstractNavigateToSearchService
new ConditionalWeakTable<Project, Tuple<string, ImmutableArray<SearchResult>>>();
public static Task<ImmutableArray<INavigateToSearchResult>> SearchProjectInCurrentProcessAsync(
Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
return FindSearchResultsAsync(
project, searchDocument: null, pattern: searchPattern, kinds, cancellationToken: cancellationToken);
}
public static Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentInCurrentProcessAsync(
Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
return FindSearchResultsAsync(
document.Project, document, searchPattern, kinds, cancellationToken);
}
private static async Task<ImmutableArray<INavigateToSearchResult>> FindSearchResultsAsync(
Project project, Document searchDocument, string pattern, ISet<string> kinds, CancellationToken cancellationToken)
Project project, Document searchDocument, string pattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
// If the user created a dotted pattern then we'll grab the last part of the name
var (patternName, patternContainerOpt) = PatternMatcher.GetNameAndContainer(pattern);
......
......@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Remote;
......@@ -12,25 +13,25 @@ namespace Microsoft.CodeAnalysis.NavigateTo
internal abstract partial class AbstractNavigateToSearchService
{
private async Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentInRemoteProcessAsync(
RemoteHostClient client, Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
RemoteHostClient client, Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var solution = document.Project.Solution;
var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>(
solution, nameof(IRemoteNavigateToSearchService.SearchDocumentAsync),
new object[] { document.Id, searchPattern, kinds }, cancellationToken).ConfigureAwait(false);
new object[] { document.Id, searchPattern, kinds.ToArray() }, cancellationToken).ConfigureAwait(false);
return serializableResults.SelectAsArray(r => r.Rehydrate(solution));
}
private async Task<ImmutableArray<INavigateToSearchResult>> SearchProjectInRemoteProcessAsync(
RemoteHostClient client, Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
RemoteHostClient client, Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var solution = project.Solution;
var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>(
solution, nameof(IRemoteNavigateToSearchService.SearchProjectAsync),
new object[] { project.Id, searchPattern, kinds }, cancellationToken).ConfigureAwait(false);
new object[] { project.Id, searchPattern, kinds.ToArray() }, cancellationToken).ConfigureAwait(false);
return serializableResults.SelectAsArray(r => r.Rehydrate(solution));
}
......
......@@ -26,7 +26,7 @@ internal abstract partial class AbstractNavigateToSearchService : INavigateToSea
public bool CanFilter => true;
public async Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(
Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var client = await TryGetRemoteHostClientAsync(document.Project, cancellationToken).ConfigureAwait(false);
if (client == null)
......@@ -42,7 +42,7 @@ internal abstract partial class AbstractNavigateToSearchService : INavigateToSea
}
public async Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(
Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var client = await TryGetRemoteHostClientAsync(project, cancellationToken).ConfigureAwait(false);
if (client == null)
......
// 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;
using System.Threading.Tasks;
......@@ -28,7 +27,7 @@ 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);
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册