@@ -25,6 +25,12 @@ class DependencyTracker;
25
25
26
26
namespace swift {
27
27
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
+
28
34
// / A dependency scanning worker which performs filesystem lookup
29
35
// / of a named module dependency.
30
36
class ModuleDependencyScanningWorker {
@@ -39,43 +45,60 @@ class ModuleDependencyScanningWorker {
39
45
llvm::PrefixMapper *mapper, DiagnosticEngine &diags);
40
46
41
47
private:
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
43
59
std::optional<clang::tooling::dependencies::TranslationUnitDeps>
44
60
scanFilesystemForClangModuleDependency (
45
61
Identifier moduleName,
62
+ LookupModuleOutputCallback lookupModuleCallback,
46
63
const llvm::DenseSet<clang::tooling::dependencies::ModuleID>
47
64
&alreadySeenModules);
48
65
49
- // / Retrieve the module dependencies for the Swift module with the given name.
50
- SwiftModuleScannerQueryResult scanFilesystemForSwiftModuleDependency (
51
- Identifier moduleName, bool isTestableImport = false );
52
-
53
66
// / Query dependency information for header dependencies
54
67
// / of a binary Swift module.
55
68
// /
56
69
// / \param moduleID the name of the Swift module whose dependency
57
70
// / information will be augmented with information about the given
58
71
// / textual header inputs.
59
72
// /
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.
61
76
// /
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.
63
79
// /
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
66
82
// /
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 (
70
86
ModuleDependencyID moduleID, std::optional<StringRef> headerPath,
71
87
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);
78
91
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 );
79
102
80
103
// / Store cache entry for include tree.
81
104
llvm::Error
@@ -93,16 +116,9 @@ class ModuleDependencyScanningWorker {
93
116
// Swift and Clang module loaders acting as scanners.
94
117
std::unique_ptr<SwiftModuleScanner> swiftModuleScannerLoader;
95
118
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
-
101
119
// CAS instance.
102
120
std::shared_ptr<llvm::cas::ObjectStore> CAS;
103
121
std::shared_ptr<llvm::cas::ActionCache> ActionCache;
104
- // / File prefix mapper.
105
- llvm::PrefixMapper *PrefixMapper;
106
122
107
123
// Base command line invocation for clang scanner queries (both module and header)
108
124
std::vector<std::string> clangScanningBaseCommandLineArgs;
@@ -223,11 +239,7 @@ class ModuleDependencyScanner {
223
239
return PrefixMapper && !PrefixMapper->getMappings ().empty ();
224
240
}
225
241
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 ;
231
243
232
244
// / CAS options.
233
245
llvm::cas::ObjectStore &getCAS () const {
@@ -294,11 +306,22 @@ class ModuleDependencyScanner {
294
306
ModuleDependenciesCache &cache,
295
307
ModuleDependencyIDSetVector &allModules);
296
308
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
+
297
315
// / Perform an operation utilizing one of the Scanning workers
298
316
// / available to this scanner.
299
317
template <typename Function, typename ... Args>
300
318
auto withDependencyScanningWorker (Function &&F, Args &&...ArgList);
301
319
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
+
302
325
// / Use the scanner's ASTContext to construct an `Identifier`
303
326
// / for a given module name.
304
327
Identifier getModuleImportIdentifier (StringRef moduleName);
@@ -318,6 +341,11 @@ class ModuleDependencyScanner {
318
341
ASTContext &ScanASTContext;
319
342
ModuleDependencyIssueReporter IssueReporter;
320
343
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
+
321
349
// / The available pool of workers for filesystem module search
322
350
unsigned NumThreads;
323
351
std::list<std::unique_ptr<ModuleDependencyScanningWorker>> Workers;
0 commit comments