@@ -180,7 +180,7 @@ class ModuleDependencyInfoStorageBase {
180
180
ArrayRef<LinkLibrary> linkLibraries,
181
181
StringRef moduleCacheKey = " " )
182
182
: dependencyKind(dependencyKind), linkLibraries(linkLibraries),
183
- moduleCacheKey (moduleCacheKey.str()), resolved( false ),
183
+ moduleCacheKey (moduleCacheKey.str()),
184
184
finalized(false ) {}
185
185
186
186
ModuleDependencyInfoStorageBase (
@@ -191,7 +191,7 @@ class ModuleDependencyInfoStorageBase {
191
191
: dependencyKind(dependencyKind), moduleImports(moduleImports),
192
192
optionalModuleImports(optionalModuleImports),
193
193
linkLibraries(linkLibraries), moduleCacheKey(moduleCacheKey.str()),
194
- resolved( false ), finalized(false ) {}
194
+ finalized(false ) {}
195
195
196
196
virtual ModuleDependencyInfoStorageBase *clone () const = 0;
197
197
@@ -209,11 +209,13 @@ class ModuleDependencyInfoStorageBase {
209
209
// / use this module.
210
210
std::vector<LinkLibrary> linkLibraries;
211
211
212
- // / The set of modules on which this module depends, resolved
213
- // / to Module IDs, qualified by module kind: Swift, Clang, etc.
214
- std::vector<ModuleDependencyID> resolvedDirectModuleDependencies;
215
-
216
- // / Dependencies comprised of Swift overlay modules of direct and
212
+ // / All directly-imported Swift module dependencies.
213
+ std::vector<ModuleDependencyID> importedSwiftModules;
214
+ // / All directly-imported Clang module dependencies.
215
+ std::vector<ModuleDependencyID> importedClangModules;
216
+ // / All cross-import overlay module dependencies.
217
+ std::vector<ModuleDependencyID> crossImportOverlayModules;
218
+ // / All dependencies comprised of Swift overlay modules of direct and
217
219
// / transitive Clang dependencies.
218
220
std::vector<ModuleDependencyID> swiftOverlayDependencies;
219
221
@@ -227,8 +229,6 @@ class ModuleDependencyInfoStorageBase {
227
229
// / The macro dependencies.
228
230
std::map<std::string, MacroPluginDependency> macroDependencies;
229
231
230
- // / The direct dependency of the module is resolved by scanner.
231
- bool resolved;
232
232
// / ModuleDependencyInfo is finalized (with all transitive dependencies
233
233
// / and inputs).
234
234
bool finalized;
@@ -253,8 +253,11 @@ struct CommonSwiftTextualModuleDependencyDetails {
253
253
// / Source files on which the bridging header depends.
254
254
std::vector<std::string> bridgingSourceFiles;
255
255
256
+ // / The macro dependencies.
257
+ std::map<std::string, MacroPluginDependency> macroDependencies;
258
+
256
259
// / (Clang) modules on which the bridging header depends.
257
- std::vector<std::string > bridgingModuleDependencies;
260
+ std::vector<ModuleDependencyID > bridgingModuleDependencies;
258
261
259
262
// / The Swift frontend invocation arguments to build the Swift module from the
260
263
// / interface.
@@ -426,7 +429,7 @@ class SwiftBinaryModuleDependencyStorage
426
429
std::vector<std::string> headerSourceFiles;
427
430
428
431
// / (Clang) modules on which the header inputs depend.
429
- std::vector<std::string > headerModuleDependencies;
432
+ std::vector<ModuleDependencyID > headerModuleDependencies;
430
433
431
434
// / A flag that indicates this dependency is a framework
432
435
const bool isFramework;
@@ -660,42 +663,105 @@ class ModuleDependencyInfo {
660
663
return storage->optionalModuleImports ;
661
664
}
662
665
663
- // / Retreive the module-level dependencies.
664
- const ArrayRef<ModuleDependencyID> getDirectModuleDependencies () const {
665
- assert (storage->resolved );
666
- return storage->resolvedDirectModuleDependencies ;
667
- }
668
-
669
666
std::string getModuleCacheKey () const {
670
- assert (storage->resolved );
671
667
return storage->moduleCacheKey ;
672
668
}
673
669
674
670
void updateModuleCacheKey (const std::string &key) {
675
671
storage->moduleCacheKey = key;
676
672
}
677
673
678
- // / Resolve a dependency's set of `imports` with qualified Module IDs
679
674
void
680
- resolveDirectDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
681
- assert (!storage->resolved && " Resolving an already-resolved dependency" );
682
- storage->resolved = true ;
683
- storage->resolvedDirectModuleDependencies .assign (dependencyIDs.begin (),
684
- dependencyIDs.end ());
675
+ setImportedSwiftDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
676
+ assert (isSwiftModule ());
677
+ storage->importedSwiftModules .assign (dependencyIDs.begin (),
678
+ dependencyIDs.end ());
679
+ }
680
+ const ArrayRef<ModuleDependencyID> getImportedSwiftDependencies () const {
681
+ return storage->importedSwiftModules ;
682
+ }
683
+
684
+ void
685
+ setImportedClangDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
686
+ storage->importedClangModules .assign (dependencyIDs.begin (),
687
+ dependencyIDs.end ());
688
+ }
689
+ const ArrayRef<ModuleDependencyID> getImportedClangDependencies () const {
690
+ return storage->importedClangModules ;
691
+ }
692
+
693
+ void
694
+ setHeaderClangDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
695
+ assert (isSwiftModule ());
696
+ switch (getKind ()) {
697
+ case swift::ModuleDependencyKind::SwiftInterface: {
698
+ auto swiftInterfaceStorage =
699
+ cast<SwiftInterfaceModuleDependenciesStorage>(storage.get ());
700
+ swiftInterfaceStorage->textualModuleDetails .bridgingModuleDependencies .assign (dependencyIDs.begin (),
701
+ dependencyIDs.end ());
702
+ break ;
703
+ }
704
+ case swift::ModuleDependencyKind::SwiftSource: {
705
+ auto swiftSourceStorage =
706
+ cast<SwiftSourceModuleDependenciesStorage>(storage.get ());
707
+ swiftSourceStorage->textualModuleDetails .bridgingModuleDependencies .assign (dependencyIDs.begin (),
708
+ dependencyIDs.end ());
709
+ break ;
710
+ }
711
+ case swift::ModuleDependencyKind::SwiftBinary: {
712
+ auto swiftBinaryStorage =
713
+ cast<SwiftBinaryModuleDependencyStorage>(storage.get ());
714
+ swiftBinaryStorage->headerModuleDependencies .assign (dependencyIDs.begin (),
715
+ dependencyIDs.end ());
716
+ break ;
717
+ }
718
+ default : {
719
+ llvm_unreachable (" Unexpected dependency kind" );
720
+ }
721
+ }
722
+ }
723
+ const ArrayRef<ModuleDependencyID> getHeaderClangDependencies () const {
724
+ switch (getKind ()) {
725
+ case swift::ModuleDependencyKind::SwiftInterface: {
726
+ auto swiftInterfaceStorage =
727
+ cast<SwiftInterfaceModuleDependenciesStorage>(storage.get ());
728
+ return swiftInterfaceStorage->textualModuleDetails .bridgingModuleDependencies ;
729
+ }
730
+ case swift::ModuleDependencyKind::SwiftSource: {
731
+ auto swiftSourceStorage =
732
+ cast<SwiftSourceModuleDependenciesStorage>(storage.get ());
733
+ return swiftSourceStorage->textualModuleDetails .bridgingModuleDependencies ;
734
+ }
735
+ case swift::ModuleDependencyKind::SwiftBinary: {
736
+ auto swiftBinaryStorage =
737
+ cast<SwiftBinaryModuleDependencyStorage>(storage.get ());
738
+ return swiftBinaryStorage->headerModuleDependencies ;
739
+ }
740
+ default :
741
+ return {};
742
+ }
685
743
}
686
744
687
- // / Set this module's set of Swift Overlay dependencies
688
745
void
689
- setOverlayDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
746
+ setSwiftOverlayDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
690
747
assert (isSwiftModule ());
691
748
storage->swiftOverlayDependencies .assign (dependencyIDs.begin (),
692
749
dependencyIDs.end ());
693
750
}
694
-
695
751
const ArrayRef<ModuleDependencyID> getSwiftOverlayDependencies () const {
696
752
return storage->swiftOverlayDependencies ;
697
753
}
698
754
755
+ void
756
+ setCrossImportOverlayDependencies (const ArrayRef<ModuleDependencyID> dependencyIDs) {
757
+ assert (isSwiftModule ());
758
+ storage->crossImportOverlayModules .assign (dependencyIDs.begin (),
759
+ dependencyIDs.end ());
760
+ }
761
+ const ArrayRef<ModuleDependencyID> getCrossImportOverlayDependencies () const {
762
+ return storage->crossImportOverlayModules ;
763
+ }
764
+
699
765
const ArrayRef<LinkLibrary> getLinkLibraries () const {
700
766
return storage->linkLibraries ;
701
767
}
@@ -723,16 +789,6 @@ class ModuleDependencyInfo {
723
789
return {};
724
790
}
725
791
726
- const ArrayRef<std::string> getHeaderDependencies () const {
727
- if (auto *detail = getAsSwiftInterfaceModule ())
728
- return detail->textualModuleDetails .bridgingModuleDependencies ;
729
- if (auto *detail = getAsSwiftSourceModule ())
730
- return detail->textualModuleDetails .bridgingModuleDependencies ;
731
- if (auto *detail = getAsSwiftBinaryModule ())
732
- return detail->headerModuleDependencies ;
733
- return {};
734
- }
735
-
736
792
std::vector<std::string> getCommandline () const {
737
793
if (auto *detail = getAsClangModule ())
738
794
return detail->buildCommandLine ;
@@ -798,9 +854,8 @@ class ModuleDependencyInfo {
798
854
llvm_unreachable (" Unexpected type" );
799
855
}
800
856
801
- bool isResolved () const { return storage->resolved ; }
802
- void setIsResolved (bool isResolved) { storage->resolved = isResolved; }
803
-
857
+ // / Whether explicit input paths of all the module dependencies
858
+ // / have been specified on the command-line recipe for this module.
804
859
bool isFinalized () const { return storage->finalized ; }
805
860
void setIsFinalized (bool isFinalized) { storage->finalized = isFinalized; }
806
861
@@ -876,10 +931,6 @@ class ModuleDependencyInfo {
876
931
const SourceManager *sourceManager = nullptr ,
877
932
SourceLoc sourceLocation = SourceLoc());
878
933
879
- // / Add a kind-qualified module dependency ID to the set of
880
- // / module dependencies.
881
- void addModuleDependency (ModuleDependencyID dependencyID);
882
-
883
934
// / Get the bridging header.
884
935
std::optional<std::string> getBridgingHeader () const ;
885
936
@@ -904,10 +955,6 @@ class ModuleDependencyInfo {
904
955
// / Add source files that the header input depends on.
905
956
void addHeaderSourceFile (StringRef bridgingSourceFile);
906
957
907
- // / Add (Clang) modules on which a non-bridging header input depends.
908
- void addHeaderInputModuleDependency (StringRef module ,
909
- llvm::StringSet<> &alreadyAddedModules);
910
-
911
958
// / Add bridging header include tree.
912
959
void addBridgingHeaderIncludeTree (StringRef ID);
913
960
@@ -1175,6 +1222,8 @@ class ModuleDependenciesCache {
1175
1222
std::optional<ModuleDependencyKind> kind) const ;
1176
1223
// / Whether we have cached dependency information for the given module Name.
1177
1224
bool hasDependency (StringRef moduleName) const ;
1225
+ // / Whether we have cached dependency information for the given Swift module.
1226
+ bool hasSwiftDependency (StringRef moduleName) const ;
1178
1227
1179
1228
SwiftDependencyScanningService &getScanService () {
1180
1229
return globalScanningService;
@@ -1191,17 +1240,29 @@ class ModuleDependenciesCache {
1191
1240
}
1192
1241
std::string getModuleOutputPath () const { return moduleOutputPath; }
1193
1242
1194
- // / Query all dependencies, direct and Swift overlay.
1195
- std::vector<ModuleDependencyID>
1243
+ // / Query all dependencies
1244
+ ModuleDependencyIDSetVector
1196
1245
getAllDependencies (const ModuleDependencyID &moduleID) const ;
1197
-
1198
- // / Query only direct import dependencies
1246
+
1247
+ // / Query all Clang module dependencies.
1248
+ ModuleDependencyIDSetVector
1249
+ getClangDependencies (const ModuleDependencyID &moduleID) const ;
1250
+
1251
+ // / Query all directly-imported Swift dependencies
1199
1252
llvm::ArrayRef<ModuleDependencyID>
1200
- getOnlyDirectDependencies (const ModuleDependencyID &moduleID) const ;
1201
-
1202
- // / Query only Swift overlay dependencies
1253
+ getImportedSwiftDependencies (const ModuleDependencyID &moduleID) const ;
1254
+ // / Query all directly-imported Clang dependencies
1255
+ llvm::ArrayRef<ModuleDependencyID>
1256
+ getImportedClangDependencies (const ModuleDependencyID &moduleID) const ;
1257
+ // / Query all Clang module dependencies of this module's imported (bridging) header
1203
1258
llvm::ArrayRef<ModuleDependencyID>
1204
- getOnlyOverlayDependencies (const ModuleDependencyID &moduleID) const ;
1259
+ getHeaderClangDependencies (const ModuleDependencyID &moduleID) const ;
1260
+ // / Query Swift overlay dependencies
1261
+ llvm::ArrayRef<ModuleDependencyID>
1262
+ getSwiftOverlayDependencies (const ModuleDependencyID &moduleID) const ;
1263
+ // / Query all cross-import overlay dependencies
1264
+ llvm::ArrayRef<ModuleDependencyID>
1265
+ getCrossImportOverlayDependencies (const ModuleDependencyID &moduleID) const ;
1205
1266
1206
1267
// / Look for module dependencies for a module with the given ID
1207
1268
// /
@@ -1222,6 +1283,12 @@ class ModuleDependenciesCache {
1222
1283
std::optional<const ModuleDependencyInfo *>
1223
1284
findDependency (StringRef moduleName) const ;
1224
1285
1286
+ // / Look for Swift module dependencies for a module with the given name
1287
+ // /
1288
+ // / \returns the cached result, or \c None if there is no cached entry.
1289
+ std::optional<const ModuleDependencyInfo *>
1290
+ findSwiftDependency (StringRef moduleName) const ;
1291
+
1225
1292
// / Look for known existing dependencies.
1226
1293
// /
1227
1294
// / \returns the cached result.
@@ -1237,19 +1304,32 @@ class ModuleDependenciesCache {
1237
1304
1238
1305
// / Update stored dependencies for the given module.
1239
1306
void updateDependency (ModuleDependencyID moduleID,
1240
- ModuleDependencyInfo dependencies );
1307
+ ModuleDependencyInfo dependencyInfo );
1241
1308
1242
- // / Resolve a dependency module's set of imports
1243
- // / to a kind-qualified set of module IDs.
1309
+ // / Resolve this module's set of directly-imported Swift module
1310
+ // / dependencies
1244
1311
void
1245
- resolveDependencyImports (ModuleDependencyID moduleID,
1246
- const ArrayRef<ModuleDependencyID> dependencyIDs);
1247
-
1248
- // / Resolve a dependency module's set of Swift module dependencies
1312
+ setImportedSwiftDependencies (ModuleDependencyID moduleID,
1313
+ const ArrayRef<ModuleDependencyID> dependencyIDs);
1314
+ // / Resolve this module's set of directly-imported Clang module
1315
+ // / dependencies
1316
+ void
1317
+ setImportedClangDependencies (ModuleDependencyID moduleID,
1318
+ const ArrayRef<ModuleDependencyID> dependencyIDs);
1319
+ // / Resolve this module's set of Swift module dependencies
1249
1320
// / that are Swift overlays of Clang module dependencies.
1250
1321
void
1251
1322
setSwiftOverlayDependencies (ModuleDependencyID moduleID,
1252
1323
const ArrayRef<ModuleDependencyID> dependencyIDs);
1324
+ // / Resolve this Swift module's imported (bridging) header's
1325
+ // / Clang module dependencies
1326
+ void
1327
+ setHeaderClangDependencies (ModuleDependencyID moduleID,
1328
+ const ArrayRef<ModuleDependencyID> dependencyIDs);
1329
+ // / Resolve this module's cross-import overlay dependencies
1330
+ void
1331
+ setCrossImportOverlayDependencies (ModuleDependencyID moduleID,
1332
+ const ArrayRef<ModuleDependencyID> dependencyIDs);
1253
1333
1254
1334
StringRef getMainModuleName () const { return mainScanModuleName; }
1255
1335
};
0 commit comments