@@ -307,12 +307,12 @@ resolveExplicitModuleInputs(ModuleDependencyID moduleID,
307307
308308// / Resolve the direct dependencies of the given module.
309309static ArrayRef<ModuleDependencyID>
310- resolveDirectDependencies (CompilerInstance &instance, ModuleDependencyID module ,
310+ resolveDirectDependencies (CompilerInstance &instance, ModuleDependencyID moduleID ,
311311 ModuleDependenciesCache &cache,
312312 InterfaceSubContextDelegate &ASTDelegate) {
313- PrettyStackTraceStringAction trace (" Resolving direct dependencies of: " , module .first );
313+ PrettyStackTraceStringAction trace (" Resolving direct dependencies of: " , moduleID .first );
314314 auto &ctx = instance.getASTContext ();
315- auto optionalKnownDependencies = cache.findDependency (module .first , module .second );
315+ auto optionalKnownDependencies = cache.findDependency (moduleID .first , moduleID .second );
316316 assert (optionalKnownDependencies.has_value ());
317317 auto knownDependencies = optionalKnownDependencies.value ();
318318
@@ -329,18 +329,31 @@ resolveDirectDependencies(CompilerInstance &instance, ModuleDependencyID module,
329329 ModuleDependencyIDSetVector result;
330330 for (auto dependsOn : knownDependencies->getModuleImports ()) {
331331 // Figure out what kind of module we need.
332- bool onlyClangModule = !isSwift || module .first == dependsOn;
332+ bool onlyClangModule = !isSwift || moduleID .first == dependsOn;
333333 if (onlyClangModule) {
334334 if (auto found =
335335 ctx.getClangModuleDependencies (dependsOn, cache, ASTDelegate))
336336 result.insert ({dependsOn, ModuleDependencyKind::Clang});
337337 } else {
338338 if (auto found =
339- ctx.getModuleDependencies (dependsOn, cache, ASTDelegate, module ))
339+ ctx.getModuleDependencies (dependsOn, cache, ASTDelegate,
340+ /* optionalDependencyLookup */ false ,
341+ moduleID))
340342 result.insert ({dependsOn, found.value ()->getKind ()});
341343 }
342344 }
343345
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+
344357 if (isSwiftInterfaceOrSource) {
345358 // A record of all of the Clang modules referenced from this Swift module.
346359 std::vector<std::string> allClangModules;
@@ -350,11 +363,11 @@ resolveDirectDependencies(CompilerInstance &instance, ModuleDependencyID module,
350363 if (knownDependencies->getBridgingHeader ()) {
351364 auto clangImporter =
352365 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)) {
355368 // Grab the updated module dependencies.
356369 // FIXME: This is such a hack.
357- knownDependencies = *cache.findDependency (module .first , module .second );
370+ knownDependencies = *cache.findDependency (moduleID .first , moduleID .second );
358371
359372 // Add the Clang modules referenced from the bridging header to the
360373 // set of Clang modules we know about.
@@ -389,15 +402,15 @@ resolveDirectDependencies(CompilerInstance &instance, ModuleDependencyID module,
389402 for (const auto &clangDep : allClangModules) {
390403 if (auto found =
391404 ctx.getSwiftModuleDependencies (clangDep, cache, ASTDelegate)) {
392- if (clangDep != module .first )
405+ if (clangDep != moduleID .first )
393406 result.insert ({clangDep, found.value ()->getKind ()});
394407 }
395408 }
396409 }
397410
398411 // 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 ();
401414}
402415
403416static void discoverCrossImportOverlayDependencies (
0 commit comments