提交 a47ea905 编写于 作者: C CyrusNajmabadi

Move methods.

上级 4b890cc4
......@@ -556,7 +556,6 @@
<Compile Include="Implementation\NavigateTo\NavigateToItemProvider.NavigateToItemDisplay.cs" />
<Compile Include="Implementation\NavigateTo\NavigateToItemProvider.Searcher.cs" />
<Compile Include="Implementation\NavigateTo\NavigateToItemProviderFactory.cs" />
<Compile Include="Implementation\NavigateTo\NavigateToSymbolFinder.cs" />
<Compile Include="Implementation\NavigationBar\NavigationBarController.cs" />
<Compile Include="Implementation\NavigationBar\NavigationBarController_ModelComputation.cs" />
<Compile Include="Implementation\NavigationBar\NavigationBarControllerFactoryService.cs" />
......@@ -804,4 +803,4 @@
<ImportGroup Label="Targets">
<Import Project="..\..\..\build\Targets\VSL.Imports.targets" />
</ImportGroup>
</Project>
</Project>
\ No newline at end of file
......@@ -7,6 +7,7 @@
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.VisualStudio.Language.NavigateTo.Interfaces;
using Roslyn.Utilities;
......@@ -18,11 +19,52 @@ internal sealed partial class NavigateToSearchResultProvider : INavigateToSearch
{
public async Task<IEnumerable<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, CancellationToken cancellationToken)
{
var results = await NavigateToSymbolFinder.FindNavigableDeclaredSymbolInfos(project, searchPattern, cancellationToken).ConfigureAwait(false);
var results = await FindNavigableDeclaredSymbolInfos(project, searchPattern, cancellationToken).ConfigureAwait(false);
var containsDots = searchPattern.IndexOf('.') >= 0;
return results.Select(r => ConvertResult(containsDots, r));
}
private static async Task<IEnumerable<ValueTuple<DeclaredSymbolInfo, Document, IEnumerable<PatternMatch>>>> FindNavigableDeclaredSymbolInfos(Project project, string pattern, CancellationToken cancellationToken)
{
var patternMatcher = new PatternMatcher(pattern);
var result = new List<ValueTuple<DeclaredSymbolInfo, Document, IEnumerable<PatternMatch>>>();
foreach (var document in project.Documents)
{
cancellationToken.ThrowIfCancellationRequested();
var declarationInfo = await document.GetDeclarationInfoAsync(cancellationToken).ConfigureAwait(false);
foreach (var declaredSymbolInfo in declarationInfo.DeclaredSymbolInfos)
{
cancellationToken.ThrowIfCancellationRequested();
var patternMatches = patternMatcher.GetMatches(
GetSearchName(declaredSymbolInfo),
declaredSymbolInfo.FullyQualifiedContainerName,
includeMatchSpans: false);
if (patternMatches != null)
{
result.Add(ValueTuple.Create(declaredSymbolInfo, document, patternMatches));
}
}
}
return result;
}
private static string GetSearchName(DeclaredSymbolInfo declaredSymbolInfo)
{
if (declaredSymbolInfo.Kind == DeclaredSymbolInfoKind.Indexer && declaredSymbolInfo.Name == WellKnownMemberNames.Indexer)
{
return "this";
}
else
{
return declaredSymbolInfo.Name;
}
}
private INavigateToSearchResult ConvertResult(bool containsDots, ValueTuple<DeclaredSymbolInfo, Document, IEnumerable<PatternMatch>> result)
{
var declaredSymbolInfo = result.Item1;
......
// 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.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Editor.Implementation.NavigateTo
{
internal static class NavigateToSymbolFinder
{
internal static async Task<IEnumerable<ValueTuple<DeclaredSymbolInfo, Document, IEnumerable<PatternMatch>>>> FindNavigableDeclaredSymbolInfos(Project project, string pattern, CancellationToken cancellationToken)
{
var patternMatcher = new PatternMatcher(pattern);
var result = new List<ValueTuple<DeclaredSymbolInfo, Document, IEnumerable<PatternMatch>>>();
foreach (var document in project.Documents)
{
cancellationToken.ThrowIfCancellationRequested();
var declarationInfo = await document.GetDeclarationInfoAsync(cancellationToken).ConfigureAwait(false);
foreach (var declaredSymbolInfo in declarationInfo.DeclaredSymbolInfos)
{
cancellationToken.ThrowIfCancellationRequested();
var patternMatches = patternMatcher.GetMatches(
GetSearchName(declaredSymbolInfo),
declaredSymbolInfo.FullyQualifiedContainerName,
includeMatchSpans: false);
if (patternMatches != null)
{
result.Add(ValueTuple.Create(declaredSymbolInfo, document, patternMatches));
}
}
}
return result;
}
private static string GetSearchName(DeclaredSymbolInfo declaredSymbolInfo)
{
if (declaredSymbolInfo.Kind == DeclaredSymbolInfoKind.Indexer && declaredSymbolInfo.Name == WellKnownMemberNames.Indexer)
{
return "this";
}
else
{
return declaredSymbolInfo.Name;
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册