@@ -193,7 +193,8 @@ updateModuleCacheKey(ModuleDependencyInfo &depInfo,
193193static llvm::Error resolveExplicitModuleInputs (
194194 ModuleDependencyID moduleID, const ModuleDependencyInfo &resolvingDepInfo,
195195 const std::set<ModuleDependencyID> &dependencies,
196- ModuleDependenciesCache &cache, CompilerInstance &instance) {
196+ ModuleDependenciesCache &cache, CompilerInstance &instance,
197+ std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps) {
197198 // Only need to resolve dependency for following dependencies.
198199 if (moduleID.Kind == ModuleDependencyKind::SwiftPlaceholder)
199200 return llvm::Error::success ();
@@ -359,13 +360,11 @@ static llvm::Error resolveExplicitModuleInputs(
359360 dependencyInfoCopy.updateCommandLine (newCommandLine);
360361 }
361362
362- if (auto *sourceDep = resolvingDepInfo. getAsSwiftSourceModule () ) {
363+ if (bridgingHeaderDeps ) {
363364 std::vector<std::string> newCommandLine =
364365 dependencyInfoCopy.getBridgingHeaderCommandline ();
365- for (auto bridgingDep :
366- sourceDep->textualModuleDetails .bridgingModuleDependencies ) {
367- auto dep =
368- cache.findDependency (bridgingDep, ModuleDependencyKind::Clang);
366+ for (auto bridgingDep : *bridgingHeaderDeps) {
367+ auto dep = cache.findDependency (bridgingDep);
369368 assert (dep && " unknown clang dependency" );
370369 auto *clangDep = (*dep)->getAsClangModule ();
371370 assert (clangDep && " wrong module dependency kind" );
@@ -377,8 +376,8 @@ static llvm::Error resolveExplicitModuleInputs(
377376 newCommandLine.push_back (" -Xcc" );
378377 newCommandLine.push_back (clangDep->moduleCacheKey );
379378 }
380- dependencyInfoCopy.updateBridgingHeaderCommandLine (newCommandLine);
381379 }
380+ dependencyInfoCopy.updateBridgingHeaderCommandLine (newCommandLine);
382381 }
383382
384383 if (resolvingDepInfo.isClangModule () ||
@@ -1336,6 +1335,27 @@ computeTransitiveClosureOfExplicitDependencies(
13361335 return result;
13371336}
13381337
1338+ static std::set<ModuleDependencyID> computeBridgingHeaderTransitiveDependencies (
1339+ const ModuleDependencyInfo *dep,
1340+ const std::unordered_map<ModuleDependencyID, std::set<ModuleDependencyID>>
1341+ &transitiveClosures,
1342+ const ModuleDependenciesCache &cache) {
1343+ std::set<ModuleDependencyID> result;
1344+ auto *sourceDep = dep->getAsSwiftSourceModule ();
1345+ if (!sourceDep)
1346+ return result;
1347+
1348+ for (auto &dep : sourceDep->textualModuleDetails .bridgingModuleDependencies ) {
1349+ ModuleDependencyID modID{dep, ModuleDependencyKind::Clang};
1350+ result.insert (modID);
1351+ auto succDeps = transitiveClosures.find (modID);
1352+ assert (succDeps != transitiveClosures.end () && " unknown dependency" );
1353+ llvm::set_union (result, succDeps->second );
1354+ }
1355+
1356+ return result;
1357+ }
1358+
13391359static std::vector<ModuleDependencyID>
13401360findClangDepPath (const ModuleDependencyID &from, const ModuleDependencyID &to,
13411361 ModuleDependenciesCache &cache) {
@@ -1763,8 +1783,14 @@ static void resolveDependencyCommandLineArguments(
17631783 auto optionalDeps = cache.findDependency (modID);
17641784 assert (optionalDeps.has_value ());
17651785 auto deps = optionalDeps.value ();
1766- if (auto E = resolveExplicitModuleInputs (modID, *deps, dependencyClosure,
1767- cache, instance))
1786+ std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps;
1787+ if (modID.Kind == ModuleDependencyKind::SwiftSource)
1788+ bridgingHeaderDeps = computeBridgingHeaderTransitiveDependencies (
1789+ deps, moduleTransitiveClosures, cache);
1790+
1791+ if (auto E =
1792+ resolveExplicitModuleInputs (modID, *deps, dependencyClosure, cache,
1793+ instance, bridgingHeaderDeps))
17681794 instance.getDiags ().diagnose (SourceLoc (), diag::error_cas,
17691795 toString (std::move (E)));
17701796
0 commit comments