protected async Task NavigateToSymbolItemAsync( Document document, RoslynNavigationBarItem.SymbolItem item, CancellationToken cancellationToken) { Contract.ThrowIfFalse(item.Kind == RoslynNavigationBarItemKind.Symbol); var symbolNavigationService = document.Project.Solution.Workspace.Services.GetRequiredService <ISymbolNavigationService>(); var compilation = await document.Project.GetRequiredCompilationAsync(cancellationToken).ConfigureAwait(false); var symbolInfo = item.NavigationSymbolId.Resolve(compilation, ignoreAssemblyKey: true, cancellationToken: cancellationToken); var symbol = symbolInfo.GetAnySymbol(); // Do not allow third party navigation to types or constructors if (symbol != null && symbol is not ITypeSymbol && !symbol.IsConstructor() && await symbolNavigationService.TrySymbolNavigationNotifyAsync(symbol, document.Project, cancellationToken).ConfigureAwait(false)) { return; } var navigationPoint = await this.GetSymbolItemNavigationPointAsync(document, item, cancellationToken).ConfigureAwait(false); if (navigationPoint.HasValue) { await this.ThreadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); NavigateToVirtualTreePoint(document.Project.Solution, navigationPoint.Value, cancellationToken); } }
protected void NavigateToSymbolItem( Document document, RoslynNavigationBarItem.SymbolItem item, CancellationToken cancellationToken) { Contract.ThrowIfFalse(item.Kind == RoslynNavigationBarItemKind.Symbol); var symbolNavigationService = document.Project.Solution.Workspace.Services.GetRequiredService <ISymbolNavigationService>(); var symbolInfo = item.NavigationSymbolId.Resolve(document.Project.GetRequiredCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken), ignoreAssemblyKey: true, cancellationToken: cancellationToken); var symbol = symbolInfo.GetAnySymbol(); // Do not allow third party navigation to types or constructors if (symbol != null && !(symbol is ITypeSymbol) && !symbol.IsConstructor() && symbolNavigationService.TrySymbolNavigationNotify(symbol, document.Project, cancellationToken)) { return; } var navigationPoint = this.GetSymbolItemNavigationPoint(document, item, cancellationToken); if (navigationPoint.HasValue) { NavigateToVirtualTreePoint(document.Project.Solution, navigationPoint.Value, cancellationToken); } }
public async Task <VirtualTreePoint?> GetSymbolItemNavigationPointAsync( Document document, RoslynNavigationBarItem.SymbolItem item, CancellationToken cancellationToken ) { Contract.ThrowIfFalse(item.Kind == RoslynNavigationBarItemKind.Symbol); var compilation = await document.Project .GetRequiredCompilationAsync(cancellationToken) .ConfigureAwait(false); var symbols = item.NavigationSymbolId.Resolve( compilation, cancellationToken: cancellationToken ); var symbol = symbols.Symbol; if (symbol == null) { if (item.NavigationSymbolIndex < symbols.CandidateSymbols.Length) { symbol = symbols.CandidateSymbols[item.NavigationSymbolIndex]; } else { return(null); } } return(await GetSymbolNavigationPointAsync(document, symbol, cancellationToken) .ConfigureAwait(false)); }
protected async Task NavigateToSymbolItemAsync( Document document, NavigationBarItem item, RoslynNavigationBarItem.SymbolItem symbolItem, ITextSnapshot textSnapshot, CancellationToken cancellationToken) { var workspace = document.Project.Solution.Workspace; var(documentId, position, virtualSpace) = await GetNavigationLocationAsync(document, item, symbolItem, textSnapshot, cancellationToken).ConfigureAwait(false); // Ensure we're back on the UI thread before either navigating or showing a failure message. await this.ThreadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); NavigateToPosition(workspace, documentId, position, virtualSpace, cancellationToken); }
internal virtual Task <(DocumentId documentId, int position, int virtualSpace)> GetNavigationLocationAsync( Document document, NavigationBarItem item, RoslynNavigationBarItem.SymbolItem symbolItem, ITextSnapshot textSnapshot, CancellationToken cancellationToken) { // If the item points to a location in this document, then just determine the current location // of that item and go directly to it. if (item.NavigationTrackingSpan != null) { return(Task.FromResult((document.Id, item.NavigationTrackingSpan.GetSpan(textSnapshot).Start.Position, 0))); } else { // Otherwise, the item pointed to a location in another document. Just return the position we // computed and stored for it. Contract.ThrowIfNull(symbolItem.Location.OtherDocumentInfo); var(documentId, navigationSpan) = symbolItem.Location.OtherDocumentInfo.Value; return(Task.FromResult((documentId, navigationSpan.Start, 0))); } }