@@ -193,7 +193,8 @@ updateModuleCacheKey(ModuleDependencyInfo &depInfo,
193
193
static llvm::Error resolveExplicitModuleInputs (
194
194
ModuleDependencyID moduleID, const ModuleDependencyInfo &resolvingDepInfo,
195
195
const std::set<ModuleDependencyID> &dependencies,
196
- ModuleDependenciesCache &cache, CompilerInstance &instance) {
196
+ ModuleDependenciesCache &cache, CompilerInstance &instance,
197
+ std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps) {
197
198
// Only need to resolve dependency for following dependencies.
198
199
if (moduleID.Kind == ModuleDependencyKind::SwiftPlaceholder)
199
200
return llvm::Error::success ();
@@ -359,13 +360,11 @@ static llvm::Error resolveExplicitModuleInputs(
359
360
dependencyInfoCopy.updateCommandLine (newCommandLine);
360
361
}
361
362
362
- if (auto *sourceDep = resolvingDepInfo. getAsSwiftSourceModule () ) {
363
+ if (bridgingHeaderDeps ) {
363
364
std::vector<std::string> newCommandLine =
364
365
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);
369
368
assert (dep && " unknown clang dependency" );
370
369
auto *clangDep = (*dep)->getAsClangModule ();
371
370
assert (clangDep && " wrong module dependency kind" );
@@ -377,8 +376,8 @@ static llvm::Error resolveExplicitModuleInputs(
377
376
newCommandLine.push_back (" -Xcc" );
378
377
newCommandLine.push_back (clangDep->moduleCacheKey );
379
378
}
380
- dependencyInfoCopy.updateBridgingHeaderCommandLine (newCommandLine);
381
379
}
380
+ dependencyInfoCopy.updateBridgingHeaderCommandLine (newCommandLine);
382
381
}
383
382
384
383
if (resolvingDepInfo.isClangModule () ||
@@ -1336,6 +1335,27 @@ computeTransitiveClosureOfExplicitDependencies(
1336
1335
return result;
1337
1336
}
1338
1337
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
+
1339
1359
static std::vector<ModuleDependencyID>
1340
1360
findClangDepPath (const ModuleDependencyID &from, const ModuleDependencyID &to,
1341
1361
ModuleDependenciesCache &cache) {
@@ -1763,8 +1783,14 @@ static void resolveDependencyCommandLineArguments(
1763
1783
auto optionalDeps = cache.findDependency (modID);
1764
1784
assert (optionalDeps.has_value ());
1765
1785
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))
1768
1794
instance.getDiags ().diagnose (SourceLoc (), diag::error_cas,
1769
1795
toString (std::move (E)));
1770
1796
0 commit comments