[Dependency Scanning] Pull optional dependencies from the adjacent binary module for direct interface dependencies

For a `@Testable` import in program source, if a Swift interface dependency is discovered, and has an adjacent binary `.swiftmodule`, open up the module, and pull in its optional dependencies. If an optional dependency cannot be resolved on the filesystem, fail silently without raising a diagnostic.
This commit is contained in:
Artem Chikin
2023-04-17 12:15:55 -07:00
parent 10fb324d1f
commit 6fcd8be072
17 changed files with 140 additions and 48 deletions

View File

@@ -86,7 +86,8 @@ protected:
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
bool skipBuildingInterface, bool &isFramework, bool &isSystemModule);
bool skipBuildingInterface, bool isTestableDependencyLookup,
bool &isFramework, bool &isSystemModule);
/// Attempts to search the provided directory for a loadable serialized
/// .swiftmodule with the provided `ModuleFilename`. Subclasses must
@@ -107,7 +108,8 @@ protected:
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
bool skipBuildingInterface, bool IsFramework) = 0;
bool SkipBuildingInterface, bool IsFramework,
bool isTestableDependencyLookup = false) = 0;
std::error_code
openModuleFile(
@@ -191,7 +193,8 @@ public:
/// If a non-null \p versionInfo is provided, the module version will be
/// parsed and populated.
virtual bool canImportModule(ImportPath::Module named,
ModuleVersionInfo *versionInfo) override;
ModuleVersionInfo *versionInfo,
bool isTestableDependencyLookup = false) override;
/// Import a module with the given module path.
///
@@ -226,7 +229,8 @@ public:
virtual Optional<const ModuleDependencyInfo*> getModuleDependencies(
StringRef moduleName, ModuleDependenciesCache &cache,
InterfaceSubContextDelegate &delegate) override;
InterfaceSubContextDelegate &delegate,
bool isTestableImport) override;
};
/// Imports serialized Swift modules into an ASTContext.
@@ -244,7 +248,8 @@ class ImplicitSerializedModuleLoader : public SerializedModuleLoaderBase {
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
bool skipBuildingInterface, bool IsFramework) override;
bool SkipBuildingInterface, bool IsFramework,
bool isTestableDependencyLookup = false) override;
bool maybeDiagnoseTargetMismatch(
SourceLoc sourceLocation,
@@ -298,7 +303,8 @@ class MemoryBufferSerializedModuleLoader : public SerializedModuleLoaderBase {
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
bool skipBuildingInterface, bool IsFramework) override;
bool SkipBuildingInterface, bool IsFramework,
bool IsTestableDependencyLookup = false) override;
bool maybeDiagnoseTargetMismatch(
SourceLoc sourceLocation,
@@ -310,7 +316,8 @@ public:
virtual ~MemoryBufferSerializedModuleLoader();
bool canImportModule(ImportPath::Module named,
ModuleVersionInfo *versionInfo) override;
ModuleVersionInfo *versionInfo,
bool isTestableDependencyLookup = false) override;
ModuleDecl *
loadModule(SourceLoc importLoc,