提交 0133ac24 编写于 作者: C CyrusNajmabadi

Use the new window for showing Go-to-impl results.

上级 0b6dfcf4
......@@ -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<Lazy<INavigableItemsPresenter>> _navigableItemPresenters;
private readonly IEnumerable<Lazy<IStreamingFindUsagesPresenter>> _streamingPresenters;
public AbstractGoToImplementationService(
IEnumerable<Lazy<INavigableItemsPresenter>> navigableItemPresenters)
IEnumerable<Lazy<INavigableItemsPresenter>> navigableItemPresenters,
IEnumerable<Lazy<IStreamingFindUsagesPresenter>> 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<ISymbol> 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<ISymbol> 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<ISymbol> 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<INavigableItem> CreateItemsForImplementation(ISymbol implementation, Solution solution)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册