Beispiel #1
0
        private async Task SearchAsync(Solution solution, string query, int searchId, CancellationToken cancellationToken)
        {
            var tasks = solution.Projects.Select(p => SearchProjectAsync(p, cancellationToken)).ToArray();
            await Task.WhenAll(tasks).ConfigureAwait(false);

            return;

            async Task SearchProjectAsync(Project project, CancellationToken cancellationToken)
            {
                cancellationToken.ThrowIfCancellationRequested();

                var results = await AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync(
                    project,
                    ImmutableArray <Document> .Empty,
                    query,
                    s_supportedKinds,
                    cancellationToken).ConfigureAwait(false);

                var convertedResults = await ConvertAsync(results, cancellationToken).ConfigureAwait(false);

                await EndPoint.InvokeAsync(
                    VSSymbolMethods.WorkspacePublishSymbolName,
                    new object[] { new VSPublishSymbolParams()
                                   {
                                       SearchId = searchId, Symbols = convertedResults
                                   } },
                    cancellationToken).ConfigureAwait(false);
            }
        }
        public async Task <SerializableNavigateToSearchResult[]> SearchProjectAsync(
            SerializableProjectId projectId, string searchPattern)
        {
            var solution = await GetSolutionAsync().ConfigureAwait(false);

            var project = solution.GetProject(projectId.Rehydrate());
            var result  = await AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync(
                project, searchPattern, CancellationToken).ConfigureAwait(false);

            return(Convert(result));
        }
Beispiel #3
0
        private static async Task <ImmutableArray <SymbolInformation> > SearchDocumentAsync(Document document, string query, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var results = await AbstractNavigateToSearchService.SearchDocumentInCurrentProcessAsync(
                document,
                query,
                s_supportedKinds,
                cancellationToken).ConfigureAwait(false);

            return(await ConvertAsync(results, cancellationToken).ConfigureAwait(false));
        }
Beispiel #4
0
        public async Task <SerializableNavigateToSearchResult[]> SearchDocumentAsync(
            SerializableDocumentId documentId, string searchPattern, byte[] solutionChecksum)
        {
            var solution = await RoslynServices.SolutionService.GetSolutionAsync(
                new Checksum(solutionChecksum), CancellationToken).ConfigureAwait(false);

            var project = solution.GetDocument(documentId.Rehydrate());
            var result  = await AbstractNavigateToSearchService.SearchDocumentInCurrentProcessAsync(
                project, searchPattern, CancellationToken).ConfigureAwait(false);

            return(Convert(result));
        }
        public async Task <ImmutableArray <SerializableNavigateToSearchResult> > SearchProjectAsync(
            ProjectId projectId, string searchPattern, CancellationToken cancellationToken)
        {
            using (UserOperationBooster.Boost())
            {
                var solution = await GetSolutionAsync(cancellationToken).ConfigureAwait(false);

                var project = solution.GetProject(projectId);
                var result  = await AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync(
                    project, searchPattern, cancellationToken).ConfigureAwait(false);

                return(Convert(result));
            }
        }
Beispiel #6
0
        public Task <IList <SerializableNavigateToSearchResult> > SearchDocumentAsync(
            DocumentId documentId, string searchPattern, string[] kinds, CancellationToken cancellationToken)
        {
            return(RunServiceAsync(async() =>
            {
                using (UserOperationBooster.Boost())
                {
                    var solution = await GetSolutionAsync(cancellationToken).ConfigureAwait(false);

                    var project = solution.GetDocument(documentId);
                    var result = await AbstractNavigateToSearchService.SearchDocumentInCurrentProcessAsync(
                        project, searchPattern, kinds.ToImmutableHashSet(), cancellationToken).ConfigureAwait(false);

                    return Convert(result);
                }
            }, cancellationToken));
        }
        public Task <IList <SerializableNavigateToSearchResult> > SearchProjectAsync(
            PinnedSolutionInfo solutionInfo, ProjectId projectId, DocumentId[] priorityDocumentIds, string searchPattern, string[] kinds, CancellationToken cancellationToken)
        {
            return(RunServiceAsync(async() =>
            {
                using (UserOperationBooster.Boost())
                {
                    var solution = await GetSolutionAsync(solutionInfo, cancellationToken).ConfigureAwait(false);

                    var project = solution.GetProject(projectId);
                    var priorityDocuments = priorityDocumentIds.Select(d => solution.GetDocument(d))
                                            .ToImmutableArray();

                    var result = await AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync(
                        project, priorityDocuments, searchPattern, kinds.ToImmutableHashSet(), cancellationToken).ConfigureAwait(false);

                    return Convert(result);
                }
            }, cancellationToken));
        }
Beispiel #8
0
        public override Task GetResults(ISearchResultCallback searchResultCallback, SearchPopupSearchPattern searchPattern, CancellationToken token)
        {
            return(Task.Run(async delegate {
                if (searchPattern.Tag != null && !tags.Contains(searchPattern.Tag) || searchPattern.HasLineNumber)
                {
                    return;
                }
                try {
                    // Maybe use language services instead of AbstractNavigateToSearchService
                    var aggregatedResults = await Task.WhenAll(TypeSystemService.AllWorkspaces
                                                               .Select(ws => ws.CurrentSolution)
                                                               .SelectMany(s => s.Projects)
                                                               .Select(proj => AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync(
                                                                           proj,
                                                                           searchPattern.Pattern,
                                                                           token))
                                                               ).ConfigureAwait(false);

                    foreach (var results in aggregatedResults)
                    {
                        foreach (var result in results)
                        {
                            if (!MatchesTag(searchPattern.Tag, result))
                            {
                                continue;
                            }

                            int laneLength = result.NameMatchSpans.Length;
                            int index = laneLength > 0 ? result.NameMatchSpans [0].Start : -1;

                            int rank = 0;
                            if (result.MatchKind == NavigateToMatchKind.Exact)
                            {
                                rank = int.MaxValue;
                            }
                            else
                            {
                                int patternLength = searchPattern.Pattern.Length;
                                rank = searchPattern.Pattern.Length - result.Name.Length;
                                rank -= index;

                                rank -= laneLength * 100;

                                // Favor matches with less splits. That is, 'abc def' is better than 'ab c def'.
                                int baseRank = (patternLength - laneLength - 1) * 5000;

                                // First matching letter close to the begining is better
                                // The more matched letters the better
                                rank = baseRank - (index + (laneLength - patternLength));

                                // rank up matches which start with a filter substring
                                if (index == 0)
                                {
                                    rank += result.NameMatchSpans [0].Length * 50;
                                }
                            }

                            if (!result.IsCaseSensitive)
                            {
                                rank /= 2;
                            }

                            searchResultCallback.ReportResult(new DeclaredSymbolInfoResult(
                                                                  searchPattern.Pattern,
                                                                  result.Name,
                                                                  rank,
                                                                  result
                                                                  ));
                        }
                    }
                } catch {
                    token.ThrowIfCancellationRequested();
                    throw;
                }
            }, token));
        }