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)); }
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)); } }
public Task <IList <SerializableNavigateToSearchResult> > SearchProjectAsync( ProjectId projectId, string searchPattern, string[] kinds, CancellationToken cancellationToken) { return(RunServiceAsync(async token => { using (UserOperationBooster.Boost()) { var solution = await GetSolutionAsync(token).ConfigureAwait(false); var project = solution.GetProject(projectId); var result = await AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync( project, searchPattern, kinds.ToImmutableHashSet(), token).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)); }
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)); }