private static async Task <ISet <ProjectId> > GetProjectsThatCouldReferenceTypeAsync( INamedTypeSymbol type, Solution solution, bool searchInMetadata, CancellationToken cancellationToken) { var dependencyGraph = solution.GetProjectDependencyGraph(); if (searchInMetadata) { // For a metadata type, find all projects that refer to the metadata assembly that // the type is defined in. Note: we pass 'null' for projects intentionally. We // Need to find all the possible projects that contain this metadata. var projectsThatReferenceMetadataAssembly = await DependentProjectsFinder.GetDependentProjectsAsync( type, solution, projects : null, cancellationToken : cancellationToken).ConfigureAwait(false); // Now collect all the dependent projects as well. var projectsThatCouldReferenceType = projectsThatReferenceMetadataAssembly.SelectMany( p => GetProjectsThatCouldReferenceType(dependencyGraph, p)).ToSet(); return(projectsThatCouldReferenceType); } else { // For a source project, find the project that that type was defined in. var sourceProject = solution.GetProject(type.ContainingAssembly); if (sourceProject == null) { return(SpecializedCollections.EmptySet <ProjectId>()); } // Now find all the dependent of those projects. var projectsThatCouldReferenceType = GetProjectsThatCouldReferenceType( dependencyGraph, sourceProject).ToSet(); return(projectsThatCouldReferenceType); } }
internal static async Task <Tuple <IEnumerable <RenameLocation>, IEnumerable <RenameLocation> > > GetRenamableLocationsInStringsAndCommentsAsync( ISymbol originalSymbol, Solution solution, bool renameInStrings, bool renameInComments, CancellationToken cancellationToken) { if (!renameInStrings && !renameInComments) { return(new Tuple <IEnumerable <RenameLocation>, IEnumerable <RenameLocation> >(null, null)); } var renameText = originalSymbol.Name; List <RenameLocation> stringLocations = renameInStrings ? new List <RenameLocation>() : null; List <RenameLocation> commentLocations = renameInComments ? new List <RenameLocation>() : null; var dependentProjects = await DependentProjectsFinder.GetDependentProjectsAsync(originalSymbol, solution, projects : null, cancellationToken : cancellationToken).ConfigureAwait(false); foreach (var project in dependentProjects) { foreach (var document in project.Documents) { var syntaxFactsLanguageService = document.Project.LanguageServices.GetService <ISyntaxFactsService>(); if (renameInStrings) { await AddLocationsToRenameInStringsAsync(document, renameText, syntaxFactsLanguageService, stringLocations, cancellationToken).ConfigureAwait(false); } if (renameInComments) { await AddLocationsToRenameInCommentsAsync(document, renameText, commentLocations, cancellationToken).ConfigureAwait(false); } } } return(new Tuple <IEnumerable <RenameLocation>, IEnumerable <RenameLocation> >(stringLocations, commentLocations)); }
protected virtual Task <ImmutableArray <Project> > DetermineProjectsToSearchAsync( TSymbol symbol, Solution solution, IImmutableSet <Project> projects, CancellationToken cancellationToken) { return(DependentProjectsFinder.GetDependentProjectsAsync( symbol, solution, projects, cancellationToken)); }