提交 1867b5e1 编写于 作者: C CyrusNajmabadi

Refactor the FindRefsService to make it easier for it to provide streaming support.

上级 9aaed4d6
......@@ -14,7 +14,8 @@
namespace Microsoft.CodeAnalysis.Editor.Implementation.FindReferences
{
internal abstract class AbstractFindReferencesService : IFindReferencesService
internal abstract class AbstractFindReferencesService :
IFindReferencesService
{
private readonly IEnumerable<IReferencedSymbolsPresenter> _referenceSymbolPresenters;
private readonly IEnumerable<INavigableItemsPresenter> _navigableItemPresenters;
......@@ -30,10 +31,9 @@ internal abstract class AbstractFindReferencesService : IFindReferencesService
_externalReferencesProviders = externalReferencesProviders;
}
private async Task<Tuple<IEnumerable<ReferencedSymbol>, Solution>> FindReferencedSymbolsAsync(Document document, int position, IWaitContext waitContext)
private async Task<Tuple<ISymbol, Solution>> GetRelevantSymbolAndSolutionAtPositionAsync(
Document document, int position, CancellationToken cancellationToken)
{
var cancellationToken = waitContext.CancellationToken;
var symbol = await SymbolFinder.FindSymbolAtPositionAsync(document, position, cancellationToken: cancellationToken).ConfigureAwait(false);
if (symbol != null)
{
......@@ -45,14 +45,7 @@ internal abstract class AbstractFindReferencesService : IFindReferencesService
var mapping = await mappingService.MapSymbolAsync(document, symbol, cancellationToken).ConfigureAwait(false);
if (mapping != null)
{
var displayName = mapping.Symbol.IsConstructor() ? mapping.Symbol.ContainingType.Name : mapping.Symbol.Name;
waitContext.Message = string.Format(EditorFeaturesResources.Finding_references_of_0, displayName);
var result = await SymbolFinder.FindReferencesAsync(mapping.Symbol, mapping.Solution, cancellationToken).ConfigureAwait(false);
var searchSolution = mapping.Solution;
return Tuple.Create(result, searchSolution);
return Tuple.Create(mapping.Symbol, mapping.Solution);
}
}
......@@ -75,6 +68,30 @@ private async Task AddExternalReferencesAsync(Document document, int position, A
}
}
private async Task<Tuple<IEnumerable<ReferencedSymbol>, Solution>> FindReferencedSymbolsAsync(
Document document, int position, IWaitContext waitContext)
{
var cancellationToken = waitContext.CancellationToken;
var symbolAndSolution = await GetRelevantSymbolAndSolutionAtPositionAsync(document, position, cancellationToken).ConfigureAwait(false);
if (symbolAndSolution != null)
{
var symbol = symbolAndSolution.Item1;
var solution = symbolAndSolution.Item2;
var displayName = symbol.IsConstructor() ? symbol.ContainingType.Name : symbol.Name;
waitContext.Message = string.Format(
EditorFeaturesResources.Finding_references_of_0, displayName);
var result = await SymbolFinder.FindReferencesAsync(symbol, solution, cancellationToken).ConfigureAwait(false);
return Tuple.Create(result, solution);
}
return null;
}
/// <summary>
/// Finds references using <see cref="SymbolFinder.FindReferencesAsync(ISymbol, Solution, CancellationToken)"/>
/// </summary>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册