From 0133ac2469c80a52d358293949aa53a24f809381 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Thu, 17 Nov 2016 16:24:32 -0800 Subject: [PATCH] Use the new window for showing Go-to-impl results. --- .../AbstractGoToImplementationService.cs | 71 ++++++++++++++++--- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/src/EditorFeatures/Core/Implementation/GoToImplementation/AbstractGoToImplementationService.cs b/src/EditorFeatures/Core/Implementation/GoToImplementation/AbstractGoToImplementationService.cs index 91f7585d305..082cea10888 100644 --- a/src/EditorFeatures/Core/Implementation/GoToImplementation/AbstractGoToImplementationService.cs +++ b/src/EditorFeatures/Core/Implementation/GoToImplementation/AbstractGoToImplementationService.cs @@ -7,6 +7,7 @@ using Microsoft.CodeAnalysis.Editor.Host; using Microsoft.CodeAnalysis.Editor.SymbolMapping; using Microsoft.CodeAnalysis.FindSymbols; +using Microsoft.CodeAnalysis.FindUsages; using Microsoft.CodeAnalysis.LanguageServices; using Microsoft.CodeAnalysis.Navigation; using Microsoft.CodeAnalysis.Shared.Extensions; @@ -17,11 +18,14 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.GoToImplementation internal abstract class AbstractGoToImplementationService : IGoToImplementationService { private readonly IEnumerable> _navigableItemPresenters; + private readonly IEnumerable> _streamingPresenters; public AbstractGoToImplementationService( - IEnumerable> navigableItemPresenters) + IEnumerable> navigableItemPresenters, + IEnumerable> streamingPresenters) { _navigableItemPresenters = navigableItemPresenters; + _streamingPresenters = streamingPresenters; } public bool TryGoToImplementation(Document document, int position, CancellationToken cancellationToken, out string message) @@ -125,18 +129,67 @@ private bool TryGoToImplementations(IEnumerable candidateImplementation } else { - // We have multiple symbols, so we'll build a list of all preferred locations for all the symbols - var navigableItems = implementations.SelectMany( - implementation => CreateItemsForImplementation(implementation, mapping.Solution)); + return TryPresentInFindUsagesPresenter(mapping, implementations, cancellationToken, out message) || + TryPresentInNavigableItemsPresenter(mapping, implementations, out message); + } + } - var presenter = _navigableItemPresenters.First(); + private bool TryPresentInFindUsagesPresenter( + SymbolMappingResult mapping, List implementations, CancellationToken cancellationToken, out string message) + { + message = null; - var taggedParts = NavigableItemFactory.GetSymbolDisplayTaggedParts(mapping.Project, mapping.Symbol); + var presenter = GetFindUsagesPresenter(); + if (presenter == null) + { + return false; + } - presenter.Value.DisplayResult(taggedParts.JoinText(), navigableItems); - message = null; - return true; + var definitionItems = implementations.Select(s => + s.ToDefinitionItem(mapping.Solution)).ToImmutableArrayOrEmpty(); + + var context = presenter.StartSearch(EditorFeaturesResources.Go_To_Implementation); + try + { + foreach (var item in definitionItems) + { + context.OnDefinitionFoundAsync(item).Wait(cancellationToken); + } + } + finally + { + context.OnCompletedAsync().Wait(cancellationToken); } + + return true; + } + + private IStreamingFindUsagesPresenter GetFindUsagesPresenter() + { + try + { + return _streamingPresenters.FirstOrDefault()?.Value; + } + catch + { + return null; + } + } + + private bool TryPresentInNavigableItemsPresenter( + SymbolMappingResult mapping, List implementations, out string message) + { + // We have multiple symbols, so we'll build a list of all preferred locations for all the symbols + var navigableItems = implementations.SelectMany( + implementation => CreateItemsForImplementation(implementation, mapping.Solution)); + + var presenter = _navigableItemPresenters.First(); + + var taggedParts = NavigableItemFactory.GetSymbolDisplayTaggedParts(mapping.Project, mapping.Symbol); + + presenter.Value.DisplayResult(taggedParts.JoinText(), navigableItems); + message = null; + return true; } private static IEnumerable CreateItemsForImplementation(ISymbol implementation, Solution solution) -- GitLab