public void NavigateToSymbolItem(Document document, NavigationBarSymbolItem item, CancellationToken cancellationToken) { var symbolNavigationService = document.Project.Solution.Workspace.Services.GetService<ISymbolNavigationService>(); var symbolInfo = item.NavigationSymbolId.Resolve(document.Project.GetCompilationAsync(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.Solution)) { return; } var navigationPoint = this.GetSymbolItemNavigationPoint(document, item, cancellationToken); if (navigationPoint.HasValue) { NavigateToVirtualTreePoint(document.Project.Solution, navigationPoint.Value); } }
public void NavigateToSymbolItem(Document document, NavigationBarSymbolItem item, CancellationToken cancellationToken) { var symbolNavigationService = document.Project.Solution.Workspace.Services.GetService <ISymbolNavigationService>(); var symbolInfo = item.NavigationSymbolId.Resolve(document.Project.GetCompilationAsync(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.Solution)) { return; } var navigationPoint = this.GetSymbolItemNavigationPoint(document, item, cancellationToken); if (navigationPoint.HasValue) { NavigateToVirtualTreePoint(document.Project.Solution, navigationPoint.Value); } }
protected internal abstract VirtualTreePoint?GetSymbolItemNavigationPoint(Document document, NavigationBarSymbolItem item, CancellationToken cancellationToken);
protected internal override VirtualTreePoint? GetSymbolItemNavigationPoint(Document document, NavigationBarSymbolItem item, CancellationToken cancellationToken) { var compilation = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken); 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.Value]; } else { return null; } } var syntaxTree = document.GetSyntaxTreeSynchronously(cancellationToken); var location = symbol.Locations.FirstOrDefault(l => l.SourceTree.Equals(syntaxTree)); if (location == null) { location = symbol.Locations.FirstOrDefault(); } if (location == null) { return null; } return new VirtualTreePoint(location.SourceTree, location.SourceTree.GetText(cancellationToken), location.SourceSpan.Start); }
protected internal abstract VirtualTreePoint? GetSymbolItemNavigationPoint(Document document, NavigationBarSymbolItem item, CancellationToken cancellationToken);