@@ -307,12 +307,12 @@ resolveExplicitModuleInputs(ModuleDependencyID moduleID,
307
307
308
308
// / Resolve the direct dependencies of the given module.
309
309
static ArrayRef<ModuleDependencyID>
310
- resolveDirectDependencies (CompilerInstance &instance, ModuleDependencyID module ,
310
+ resolveDirectDependencies (CompilerInstance &instance, ModuleDependencyID moduleID ,
311
311
ModuleDependenciesCache &cache,
312
312
InterfaceSubContextDelegate &ASTDelegate) {
313
- PrettyStackTraceStringAction trace (" Resolving direct dependencies of: " , module .first );
313
+ PrettyStackTraceStringAction trace (" Resolving direct dependencies of: " , moduleID .first );
314
314
auto &ctx = instance.getASTContext ();
315
- auto optionalKnownDependencies = cache.findDependency (module .first , module .second );
315
+ auto optionalKnownDependencies = cache.findDependency (moduleID .first , moduleID .second );
316
316
assert (optionalKnownDependencies.has_value ());
317
317
auto knownDependencies = optionalKnownDependencies.value ();
318
318
@@ -329,18 +329,31 @@ resolveDirectDependencies(CompilerInstance &instance, ModuleDependencyID module,
329
329
ModuleDependencyIDSetVector result;
330
330
for (auto dependsOn : knownDependencies->getModuleImports ()) {
331
331
// Figure out what kind of module we need.
332
- bool onlyClangModule = !isSwift || module .first == dependsOn;
332
+ bool onlyClangModule = !isSwift || moduleID .first == dependsOn;
333
333
if (onlyClangModule) {
334
334
if (auto found =
335
335
ctx.getClangModuleDependencies (dependsOn, cache, ASTDelegate))
336
336
result.insert ({dependsOn, ModuleDependencyKind::Clang});
337
337
} else {
338
338
if (auto found =
339
- ctx.getModuleDependencies (dependsOn, cache, ASTDelegate, module ))
339
+ ctx.getModuleDependencies (dependsOn, cache, ASTDelegate,
340
+ /* optionalDependencyLookup */ false ,
341
+ moduleID))
340
342
result.insert ({dependsOn, found.value ()->getKind ()});
341
343
}
342
344
}
343
345
346
+ // We may have a set of optional dependencies for this module, such as `@_implementationOnly`
347
+ // imports of a `@Testable` import. Attempt to locate those, but do not fail if they
348
+ // cannot be found.
349
+ for (auto optionallyDependsOn : knownDependencies->getOptionalModuleImports ()) {
350
+ if (auto found =
351
+ ctx.getModuleDependencies (optionallyDependsOn, cache, ASTDelegate,
352
+ /* optionalDependencyLookup */ true ,
353
+ moduleID))
354
+ result.insert ({optionallyDependsOn, found.value ()->getKind ()});
355
+ }
356
+
344
357
if (isSwiftInterfaceOrSource) {
345
358
// A record of all of the Clang modules referenced from this Swift module.
346
359
std::vector<std::string> allClangModules;
@@ -350,11 +363,11 @@ resolveDirectDependencies(CompilerInstance &instance, ModuleDependencyID module,
350
363
if (knownDependencies->getBridgingHeader ()) {
351
364
auto clangImporter =
352
365
static_cast <ClangImporter *>(ctx.getClangModuleLoader ());
353
- if (!clangImporter->addBridgingHeaderDependencies (module .first ,
354
- module .second , cache)) {
366
+ if (!clangImporter->addBridgingHeaderDependencies (moduleID .first ,
367
+ moduleID .second , cache)) {
355
368
// Grab the updated module dependencies.
356
369
// FIXME: This is such a hack.
357
- knownDependencies = *cache.findDependency (module .first , module .second );
370
+ knownDependencies = *cache.findDependency (moduleID .first , moduleID .second );
358
371
359
372
// Add the Clang modules referenced from the bridging header to the
360
373
// set of Clang modules we know about.
@@ -389,15 +402,15 @@ resolveDirectDependencies(CompilerInstance &instance, ModuleDependencyID module,
389
402
for (const auto &clangDep : allClangModules) {
390
403
if (auto found =
391
404
ctx.getSwiftModuleDependencies (clangDep, cache, ASTDelegate)) {
392
- if (clangDep != module .first )
405
+ if (clangDep != moduleID .first )
393
406
result.insert ({clangDep, found.value ()->getKind ()});
394
407
}
395
408
}
396
409
}
397
410
398
411
// Resolve the dependnecy info
399
- cache.resolveDependencyImports (module , result.takeVector ());
400
- return cache.findDependency (module .first , module .second ).value ()->getModuleDependencies ();
412
+ cache.resolveDependencyImports (moduleID , result.takeVector ());
413
+ return cache.findDependency (moduleID .first , moduleID .second ).value ()->getModuleDependencies ();
401
414
}
402
415
403
416
static void discoverCrossImportOverlayDependencies (
0 commit comments