@@ -25,6 +25,12 @@ class DependencyTracker;
2525
2626namespace swift {
2727
28+ // / A callback to lookup module outputs for "-fmodule-file=", "-o" etc.
29+ using LookupModuleOutputCallback = llvm::function_ref<std::string(
30+ const clang::tooling::dependencies::ModuleDeps &,
31+ clang::tooling::dependencies::ModuleOutputKind)>;
32+ using RemapPathCallback = llvm::function_ref<std::string(StringRef)>;
33+
2834// / A dependency scanning worker which performs filesystem lookup
2935// / of a named module dependency.
3036class ModuleDependencyScanningWorker {
@@ -39,43 +45,60 @@ class ModuleDependencyScanningWorker {
3945 llvm::PrefixMapper *mapper, DiagnosticEngine &diags);
4046
4147private:
42- // / Retrieve the module dependencies for the Clang module with the given name.
48+ // / Query dependency information for a named Clang module
49+ // /
50+ // / \param moduleName moduel identifier for the query
51+ // /
52+ // / \param lookupModuleCallback a callback to compute a client-specific
53+ // / module-cache-relative output path for discovered Clang module dependencies.
54+ // /
55+ // / \param alreadySeenModules a set of module dependencies previously seen
56+ // / by the scanner, as to avoid processing them all over again
57+ // /
58+ // / \returns Clang dependency scanner's \c TranslationUnitDeps result
4359 std::optional<clang::tooling::dependencies::TranslationUnitDeps>
4460 scanFilesystemForClangModuleDependency (
4561 Identifier moduleName,
62+ LookupModuleOutputCallback lookupModuleCallback,
4663 const llvm::DenseSet<clang::tooling::dependencies::ModuleID>
4764 &alreadySeenModules);
4865
49- // / Retrieve the module dependencies for the Swift module with the given name.
50- SwiftModuleScannerQueryResult scanFilesystemForSwiftModuleDependency (
51- Identifier moduleName, bool isTestableImport = false );
52-
5366 // / Query dependency information for header dependencies
5467 // / of a binary Swift module.
5568 // /
5669 // / \param moduleID the name of the Swift module whose dependency
5770 // / information will be augmented with information about the given
5871 // / textual header inputs.
5972 // /
60- // / \param headerPath the path to the header to be scanned.
73+ // / \param headerPath optional path to the header to be scanned.
74+ // /
75+ // / \param sourceBuffer optional in-memory buffer of a header to be scanned.
6176 // /
62- // / \param clangScanningTool The clang dependency scanner.
77+ // / \param lookupModuleCallback a callback to compute a client-specific
78+ // / module-cache-relative output path for discovered Clang module dependencies.
6379 // /
64- // / \param cache The module dependencies cache to update, with information
65- // / about new Clang modules discovered along the way.
80+ // / \param alreadySeenModules a set of module dependencies previously seen
81+ // / by the scanner, as to avoid processing them all over again
6682 // /
67- // / \returns \c true if an error occurred, \c false otherwise
68- bool scanHeaderDependenciesOfSwiftModule (
69- const ASTContext &ctx,
83+ // / \returns Clang dependency scanner's \c TranslationUnitDeps result
84+ std::optional<clang::tooling::dependencies::TranslationUnitDeps>
85+ scanHeaderDependenciesOfSwiftModule (
7086 ModuleDependencyID moduleID, std::optional<StringRef> headerPath,
7187 std::optional<llvm::MemoryBufferRef> sourceBuffer,
72- ModuleDependenciesCache &cache,
73- ModuleDependencyIDSetVector &headerClangModuleDependencies,
74- std::vector<std::string> &headerFileInputs,
75- std::vector<std::string> &bridgingHeaderCommandLine,
76- std::vector<std::string> &visibleClangModules,
77- std::optional<std::string> &includeTreeID);
88+ LookupModuleOutputCallback lookupModuleCallback,
89+ const llvm::DenseSet<clang::tooling::dependencies::ModuleID>
90+ &alreadySeenModules);
7891
92+ // / Query dependency information for a named Swift module
93+ // /
94+ // / \param moduleName moduel identifier for the query
95+ // /
96+ // / \param isTestableImport a boolean flag which indicates whether
97+ // / this is an @testable dependency
98+ // /
99+ // / \returns a struct containing query results
100+ SwiftModuleScannerQueryResult scanFilesystemForSwiftModuleDependency (
101+ Identifier moduleName, bool isTestableImport = false );
79102
80103 // / Store cache entry for include tree.
81104 llvm::Error
@@ -93,16 +116,9 @@ class ModuleDependencyScanningWorker {
93116 // Swift and Clang module loaders acting as scanners.
94117 std::unique_ptr<SwiftModuleScanner> swiftModuleScannerLoader;
95118
96- // / The location of where the explicitly-built modules will be output to
97- std::string moduleOutputPath;
98- // / The location of where the explicitly-built SDK modules will be output to
99- std::string sdkModuleOutputPath;
100-
101119 // CAS instance.
102120 std::shared_ptr<llvm::cas::ObjectStore> CAS;
103121 std::shared_ptr<llvm::cas::ActionCache> ActionCache;
104- // / File prefix mapper.
105- llvm::PrefixMapper *PrefixMapper;
106122
107123 // Base command line invocation for clang scanner queries (both module and header)
108124 std::vector<std::string> clangScanningBaseCommandLineArgs;
@@ -223,11 +239,7 @@ class ModuleDependencyScanner {
223239 return PrefixMapper && !PrefixMapper->getMappings ().empty ();
224240 }
225241 llvm::PrefixMapper *getPrefixMapper () const { return PrefixMapper.get (); }
226- std::string remapPath (StringRef Path) const {
227- if (!PrefixMapper)
228- return Path.str ();
229- return PrefixMapper->mapToString (Path);
230- }
242+ std::string remapPath (StringRef Path) const ;
231243
232244 // / CAS options.
233245 llvm::cas::ObjectStore &getCAS () const {
@@ -294,11 +306,22 @@ class ModuleDependencyScanner {
294306 ModuleDependenciesCache &cache,
295307 ModuleDependencyIDSetVector &allModules);
296308
309+ // / Bridge Clang dependency scanner's dependency node
310+ // / to the Swift scanner's `ModuleDependencyInfo`.
311+ ModuleDependencyInfo
312+ bridgeClangModuleDependency (
313+ const clang::tooling::dependencies::ModuleDeps &clangDependency);
314+
297315 // / Perform an operation utilizing one of the Scanning workers
298316 // / available to this scanner.
299317 template <typename Function, typename ... Args>
300318 auto withDependencyScanningWorker (Function &&F, Args &&...ArgList);
301319
320+ // / Determine cache-relative output path for a given Clang module
321+ std::string clangModuleOutputPathLookup (
322+ const clang::tooling::dependencies::ModuleDeps &clangDep,
323+ clang::tooling::dependencies::ModuleOutputKind moduleOutputKind) const ;
324+
302325 // / Use the scanner's ASTContext to construct an `Identifier`
303326 // / for a given module name.
304327 Identifier getModuleImportIdentifier (StringRef moduleName);
@@ -318,6 +341,11 @@ class ModuleDependencyScanner {
318341 ASTContext &ScanASTContext;
319342 ModuleDependencyIssueReporter IssueReporter;
320343
344+ // / The location of where the explicitly-built modules will be output to
345+ std::string ModuleOutputPath;
346+ // / The location of where the explicitly-built SDK modules will be output to
347+ std::string SDKModuleOutputPath;
348+
321349 // / The available pool of workers for filesystem module search
322350 unsigned NumThreads;
323351 std::list<std::unique_ptr<ModuleDependencyScanningWorker>> Workers;
0 commit comments