public Task FindReferencesAsync( PinnedSolutionInfo solutionInfo, SerializableSymbolAndProjectId symbolAndProjectIdArg, SerializableFindReferencesSearchOptions options, CancellationToken cancellationToken) { return(RunServiceAsync(async() => { using (UserOperationBooster.Boost()) { var solution = await GetSolutionAsync(solutionInfo, cancellationToken).ConfigureAwait(false); var project = solution.GetProject(symbolAndProjectIdArg.ProjectId); var symbol = await symbolAndProjectIdArg.TryRehydrateAsync( solution, cancellationToken).ConfigureAwait(false); if (symbol == null) { return; } var context = new RemoteFindUsageContext(solution, EndPoint, cancellationToken); await AbstractFindUsagesService.FindReferencesAsync( context, symbol, project, options.Rehydrate()).ConfigureAwait(false); } }, cancellationToken)); }
public Task FindReferencesAsync( PinnedSolutionInfo solutionInfo, SerializableSymbolAndProjectId symbolAndProjectIdArg, DocumentId[] documentArgs, SerializableFindReferencesSearchOptions options, CancellationToken cancellationToken) { return(RunServiceAsync(async() => { using (UserOperationBooster.Boost()) { var solution = await GetSolutionAsync(solutionInfo, cancellationToken).ConfigureAwait(false); var symbolAndProjectId = await symbolAndProjectIdArg.TryRehydrateAsync( solution, cancellationToken).ConfigureAwait(false); var progressCallback = new FindReferencesProgressCallback(EndPoint, cancellationToken); if (!symbolAndProjectId.HasValue) { await progressCallback.OnStartedAsync().ConfigureAwait(false); await progressCallback.OnCompletedAsync().ConfigureAwait(false); return; } // NOTE: In projection scenarios, we might get a set of documents to search // that are not all the same language and might not exist in the OOP process // (like the JS parts of a .cshtml file). Filter them out here. This will // need to be revisited if we someday support FAR between these languages. var documents = documentArgs?.Select(solution.GetDocument) .WhereNotNull() .ToImmutableHashSet(); await SymbolFinder.FindReferencesInCurrentProcessAsync( symbolAndProjectId.Value, solution, progressCallback, documents, options.Rehydrate(), cancellationToken).ConfigureAwait(false); } }, cancellationToken)); }