From 1867b5e1ac2c11ced3ce425dadcb83e2a95c41b4 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Wed, 20 Jul 2016 16:40:07 -0700 Subject: [PATCH] Refactor the FindRefsService to make it easier for it to provide streaming support. --- .../AbstractFindReferencesService.cs | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/EditorFeatures/Core/Implementation/FindReferences/AbstractFindReferencesService.cs b/src/EditorFeatures/Core/Implementation/FindReferences/AbstractFindReferencesService.cs index a4c2ae7a367..929ead326c5 100644 --- a/src/EditorFeatures/Core/Implementation/FindReferences/AbstractFindReferencesService.cs +++ b/src/EditorFeatures/Core/Implementation/FindReferences/AbstractFindReferencesService.cs @@ -14,7 +14,8 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.FindReferences { - internal abstract class AbstractFindReferencesService : IFindReferencesService + internal abstract class AbstractFindReferencesService : + IFindReferencesService { private readonly IEnumerable _referenceSymbolPresenters; private readonly IEnumerable _navigableItemPresenters; @@ -30,10 +31,9 @@ internal abstract class AbstractFindReferencesService : IFindReferencesService _externalReferencesProviders = externalReferencesProviders; } - private async Task, Solution>> FindReferencedSymbolsAsync(Document document, int position, IWaitContext waitContext) + private async Task> 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, 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; + } + /// /// Finds references using /// -- GitLab