示例#1
0
        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;
            }
        }
示例#2
0
        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));
示例#5
0
 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));
        }
示例#7
0
        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));
        }
示例#8
0
        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));
        }
示例#11
0
        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;
            }
        }
示例#12
0
        /// <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);
        }