@@ -2572,6 +2572,38 @@ SourceFile::setImports(ArrayRef<AttributedImport<ImportedModule>> imports) {
25722572 Imports = getASTContext ().AllocateCopy (imports);
25732573}
25742574
2575+ std::optional<AttributedImport<ImportedModule>>
2576+ SourceFile::findImport (const ModuleDecl *module ) const {
2577+ return evaluateOrDefault (getASTContext ().evaluator ,
2578+ ImportDeclRequest{this , module }, std::nullopt );
2579+ }
2580+
2581+ std::optional<AttributedImport<ImportedModule>>
2582+ ImportDeclRequest::evaluate (Evaluator &evaluator, const SourceFile *sf,
2583+ const ModuleDecl *module ) const {
2584+ auto &ctx = sf->getASTContext ();
2585+ auto imports = sf->getImports ();
2586+
2587+ // Look to see if the owning module was directly imported.
2588+ for (const auto &import : imports) {
2589+ if (import .module .importedModule == module )
2590+ return import ;
2591+ }
2592+
2593+ // Now look for transitive imports.
2594+ auto &importCache = ctx.getImportCache ();
2595+ for (const auto &import : imports) {
2596+ auto &importSet = importCache.getImportSet (import .module .importedModule );
2597+ for (const auto &transitive : importSet.getTransitiveImports ()) {
2598+ if (transitive.importedModule == module ) {
2599+ return import ;
2600+ }
2601+ }
2602+ }
2603+
2604+ return std::nullopt ;
2605+ }
2606+
25752607bool SourceFile::hasImportUsedPreconcurrency (
25762608 AttributedImport<ImportedModule> import ) const {
25772609 return PreconcurrencyImportsUsed.count (import ) != 0 ;
0 commit comments