コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
 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)));
     }
 }