private static void NavigateToQuickInfoTarget(string navigationTarget, Document document, IStreamingFindUsagesPresenter streamingPresenter) { var navigateToLinkService = document.Project.Solution.Workspace.Services.GetRequiredService <INavigateToLinkService>(); if (Uri.TryCreate(navigationTarget, UriKind.Absolute, out var absoluteUri)) { navigateToLinkService.TryNavigateToLinkAsync(absoluteUri, CancellationToken.None); return; } SymbolKeyResolution resolvedSymbolKey; try { resolvedSymbolKey = SymbolKey.ResolveString(navigationTarget, document.Project.GetCompilationAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None), cancellationToken: CancellationToken.None); } catch { // Ignore symbol resolution failures. It likely is just a badly formed URI. return; } if (resolvedSymbolKey.GetAnySymbol() is { } symbol) { GoToDefinitionHelpers.TryGoToDefinition(symbol, document.Project, streamingPresenter, CancellationToken.None); return; } }
private static void NavigateToQuickInfoTarget( string navigationTarget, Workspace workspace, DocumentId documentId, IThreadingContext threadingContext, IStreamingFindUsagesPresenter streamingPresenter) { var solution = workspace.CurrentSolution; SymbolKeyResolution resolvedSymbolKey; try { var project = solution.GetRequiredProject(documentId.ProjectId); resolvedSymbolKey = SymbolKey.ResolveString(navigationTarget, project.GetRequiredCompilationAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None), cancellationToken: CancellationToken.None); } catch { // Ignore symbol resolution failures. It likely is just a badly formed URI. return; } if (resolvedSymbolKey.GetAnySymbol() is { } symbol) { GoToDefinitionHelpers.TryGoToDefinition(symbol, solution, threadingContext, streamingPresenter, CancellationToken.None); return; } }
public override bool TryGoToDefinition( ISymbol symbol, Project project, CancellationToken cancellationToken ) { if ( !TryResolveSymbol( symbol, project, cancellationToken, out var searchSymbol, out var searchProject ) ) { return(false); } return(GoToDefinitionHelpers.TryGoToDefinition( searchSymbol, searchProject.Solution, _threadingContext, _streamingPresenter.Value, cancellationToken )); }
public void Navigate(INavigableRelationship relationship) => _waitIndicator.Wait( title: EditorFeaturesResources.Go_to_Definition, message: EditorFeaturesResources.Navigating_to_definition, allowCancel: true, showProgress: false, action: context => GoToDefinitionHelpers.TryGoToDefinition( _definitions, _document.Project.Solution, _definitions[0].NameDisplayParts.GetFullText(), _threadingContext, _presenter));
public void Navigate(INavigableRelationship relationship) => _uiThreadOperationExecutor.Execute( title: EditorFeaturesResources.Go_to_Definition, defaultDescription: EditorFeaturesResources.Navigating_to_definition, allowCancellation: true, showProgress: false, action: context => GoToDefinitionHelpers.TryGoToDefinition( _definitions, _document.Project.Solution, _definitions[0].NameDisplayParts.GetFullText(), _threadingContext, _presenter, context.UserCancellationToken));
public override bool TryGoToDefinition(ISymbol symbol, Project project, CancellationToken cancellationToken) { if (!_navigableItemsPresenters.Any()) { return(false); } ISymbol searchSymbol; Project searchProject; if (!TryResolveSymbol(symbol, project, cancellationToken, out searchSymbol, out searchProject)) { return(false); } return(GoToDefinitionHelpers.TryGoToDefinition( searchSymbol, searchProject, _externalDefinitionProviders, _navigableItemsPresenters, cancellationToken: cancellationToken)); }
public override bool TryGoToDefinition(ISymbol symbol, Project project, CancellationToken cancellationToken) { if (!_navigableItemsPresenters.Any()) { return(false); } ISymbol searchSymbol; Project searchProject; if (!TryResolveSymbol(symbol, project, cancellationToken, out searchSymbol, out searchProject)) { return(false); } return(GoToDefinitionHelpers.TryGoToDefinition( searchSymbol, searchProject, _navigableItemsPresenters, containingTypeSymbol: null, throwOnHiddenDefinition: false, cancellationToken: cancellationToken)); }
public override bool TryGoToDefinition( ISymbol symbol, Project project, CancellationToken cancellationToken) { if (!_navigableItemsPresenters.Any() && !_streamingPresenters.Any()) { return(false); } if (!TryResolveSymbol(symbol, project, cancellationToken, out var searchSymbol, out var searchProject)) { return(false); } return(GoToDefinitionHelpers.TryGoToDefinition( searchSymbol, searchProject, _navigableItemsPresenters, _streamingPresenters, cancellationToken)); }
private bool TryGoToImplementations( ISymbol symbol, Project project, ImmutableArray <ISymbol> implementations, CancellationToken cancellationToken, out string message) { if (implementations.Length == 0) { message = EditorFeaturesResources.The_symbol_has_no_implementations; return(false); } else if (implementations.Length == 1) { GoToDefinitionHelpers.TryGoToDefinition( implementations.Single(), project, _navigableItemPresenters, SpecializedCollections.EmptyEnumerable <Lazy <IStreamingFindUsagesPresenter> >(), cancellationToken); message = null; return(true); } else { return(TryPresentInNavigableItemsPresenter(symbol, project, implementations, out message)); } }
public override async Task <bool> TryGoToDefinitionAsync( ISymbol symbol, Project project, CancellationToken cancellationToken) { var currentProject = project.Solution.Workspace.CurrentSolution.GetProject(project.Id); if (currentProject == null) { return(false); } var symbolId = SymbolKey.Create(symbol, cancellationToken); var currentCompilation = await currentProject.GetRequiredCompilationAsync(cancellationToken).ConfigureAwait(false); var symbolInfo = symbolId.Resolve(currentCompilation, cancellationToken: cancellationToken); if (symbolInfo.Symbol == null) { return(false); } return(await GoToDefinitionHelpers.TryNavigateToLocationAsync( symbolInfo.Symbol, currentProject.Solution, _threadingContext, _streamingPresenter.Value, cancellationToken).ConfigureAwait(false)); }
private static void NavigateToQuickInfoTarget( string navigationTarget, Document document, IThreadingContext threadingContext, IStreamingFindUsagesPresenter streamingPresenter) { SymbolKeyResolution resolvedSymbolKey; try { resolvedSymbolKey = SymbolKey.ResolveString(navigationTarget, document.Project.GetCompilationAsync(CancellationToken.None).WaitAndGetResult(CancellationToken.None), cancellationToken: CancellationToken.None); } catch { // Ignore symbol resolution failures. It likely is just a badly formed URI. return; } if (resolvedSymbolKey.GetAnySymbol() is { } symbol) { GoToDefinitionHelpers.TryGoToDefinition(symbol, document.Project.Solution, threadingContext, streamingPresenter, CancellationToken.None); return; } }
/// <summary> /// Internal for testing purposes. /// </summary> internal async Task <ImmutableArray <CodeDefinitionWindowLocation> > GetContextFromPointAsync( Document document, int position, CancellationToken cancellationToken) { var workspace = document.Project.Solution.Workspace; var navigableItems = await GoToDefinitionHelpers.GetDefinitionsAsync(document, position, cancellationToken).ConfigureAwait(false); if (navigableItems?.Any() == true) { var navigationService = workspace.Services.GetRequiredService <IDocumentNavigationService>(); using var _ = PooledObjects.ArrayBuilder <CodeDefinitionWindowLocation> .GetInstance(out var builder); foreach (var item in navigableItems) { if (await navigationService.CanNavigateToSpanAsync(workspace, item.Document.Id, item.SourceSpan, cancellationToken).ConfigureAwait(false)) { var text = await item.Document.GetTextAsync(cancellationToken).ConfigureAwait(false); var linePositionSpan = text.Lines.GetLinePositionSpan(item.SourceSpan); if (item.Document.FilePath != null) { builder.Add(new CodeDefinitionWindowLocation(item.DisplayTaggedParts.JoinText(), item.Document.FilePath, linePositionSpan.Start)); } } } return(builder.ToImmutable()); } // We didn't have regular source references, but possibly: // 1. Another language (like XAML) will take over via ISymbolNavigationService // 2. There are no locations from source, so we'll try to generate a metadata as source file and use that var symbol = await SymbolFinder.FindSymbolAtPositionAsync( document, position, cancellationToken : cancellationToken).ConfigureAwait(false); if (symbol == null) { return(ImmutableArray <CodeDefinitionWindowLocation> .Empty); } var symbolNavigationService = workspace.Services.GetRequiredService <ISymbolNavigationService>(); var definitionItem = symbol.ToNonClassifiedDefinitionItem(document.Project.Solution, includeHiddenLocations: false); var result = await symbolNavigationService.GetExternalNavigationSymbolLocationAsync(definitionItem, cancellationToken).ConfigureAwait(false); if (result != null) { return(ImmutableArray.Create(new CodeDefinitionWindowLocation(symbol.ToDisplayString(), result.Value.filePath, result.Value.linePosition))); } else if (_metadataAsSourceFileService.IsNavigableMetadataSymbol(symbol)) { var allowDecompilation = _globalOptions.GetOption(FeatureOnOffOptions.NavigateToDecompiledSources); var declarationFile = await _metadataAsSourceFileService.GetGeneratedFileAsync(document.Project, symbol, signaturesOnly : false, allowDecompilation, cancellationToken).ConfigureAwait(false); var identifierSpan = declarationFile.IdentifierLocation.GetLineSpan().Span; return(ImmutableArray.Create(new CodeDefinitionWindowLocation(symbol.ToDisplayString(), declarationFile.FilePath, identifierSpan.Start))); } return(ImmutableArray <CodeDefinitionWindowLocation> .Empty); }