@@ -74,29 +74,44 @@ enum class ModuleDependencyKind : int8_t {
74
74
LastKind = SwiftPlaceholder + 1
75
75
};
76
76
77
+ using ModuleDependencyID = std::pair<std::string, ModuleDependencyKind>;
78
+ using ModuleDependencyIDSetVector =
79
+ llvm::SetVector<ModuleDependencyID, std::vector<ModuleDependencyID>,
80
+ std::set<ModuleDependencyID>>;
81
+
77
82
struct ModuleDependencyKindHash {
78
83
std::size_t operator ()(ModuleDependencyKind k) const {
79
84
using UnderlyingType = std::underlying_type<ModuleDependencyKind>::type;
80
85
return std::hash<UnderlyingType>{}(static_cast <UnderlyingType>(k));
81
86
}
82
87
};
83
88
89
+ namespace dependencies {
90
+ std::string createEncodedModuleKindAndName (ModuleDependencyID id);
91
+ }
92
+
84
93
// / Base class for the variant storage of ModuleDependencyInfo.
85
94
// /
86
95
// / This class is mostly an implementation detail for \c ModuleDependencyInfo.
87
96
class ModuleDependencyInfoStorageBase {
88
97
public:
89
98
const ModuleDependencyKind dependencyKind;
90
99
91
- ModuleDependencyInfoStorageBase (ModuleDependencyKind dependencyKind)
92
- : dependencyKind(dependencyKind) { }
100
+ ModuleDependencyInfoStorageBase (ModuleDependencyKind dependencyKind,
101
+ bool resolved = false )
102
+ : dependencyKind(dependencyKind), resolved(resolved) { }
93
103
94
104
virtual ModuleDependencyInfoStorageBase *clone () const = 0;
95
105
96
106
virtual ~ModuleDependencyInfoStorageBase ();
97
107
98
108
// / The set of modules on which this module depends.
99
- std::vector<std::string> moduleDependencies;
109
+ std::vector<std::string> moduleImports;
110
+
111
+ // / The set of modules on which this module depends, resolved
112
+ // / to Module IDs, qualified by module kind: Swift, Clang, etc.
113
+ ModuleDependencyIDSetVector resolvedModuleDependencies;
114
+ bool resolved;
100
115
};
101
116
102
117
struct CommonSwiftTextualModuleDependencyDetails {
@@ -400,9 +415,41 @@ class ModuleDependencyInfo {
400
415
compiledModulePath, moduleDocPath, sourceInfoPath));
401
416
}
402
417
403
- // / Retrieve the module-level dependencies.
404
- ArrayRef<std::string> getModuleDependencies () const {
405
- return storage->moduleDependencies ;
418
+ // / Retrieve the module-level imports.
419
+ ArrayRef<std::string> getModuleImports () const {
420
+ return storage->moduleImports ;
421
+ }
422
+
423
+ // / Retreive the module-level dependencies.
424
+ const ModuleDependencyIDSetVector &getModuleDependencies () const {
425
+ assert (storage->resolved );
426
+ return storage->resolvedModuleDependencies ;
427
+ }
428
+
429
+ // / Resolve a dependency's set of `imports` with qualified Module IDs
430
+ void resolveDependencies (ModuleDependencyIDSetVector dependencyIDs) {
431
+ #ifndef NDEBUG
432
+ // Sanity check against the identified imports for this module
433
+ for (auto importedModuleName : storage->moduleImports ) {
434
+ auto matchingModuleIDIt =
435
+ std::find_if (dependencyIDs.begin (), dependencyIDs.end (),
436
+ [&](ModuleDependencyID dependencyID) {
437
+ return dependencyID.first == importedModuleName;
438
+ });
439
+ assert (matchingModuleIDIt != dependencyIDs.end () &&
440
+ " Imported module not found in resolved module dependency set" );
441
+ }
442
+ #endif
443
+ assert (!storage->resolved && " Resolving an already-resolved dependency" );
444
+ storage->resolved = true ;
445
+ storage->resolvedModuleDependencies = dependencyIDs;
446
+ }
447
+
448
+ bool isResolved () const {
449
+ return storage->resolved ;
450
+ }
451
+ void setIsResolved (bool isResolved) {
452
+ storage->resolved = isResolved;
406
453
}
407
454
408
455
// / Whether the dependencies are for a Swift module: either Textual, Source, Binary, or Placeholder.
@@ -444,19 +491,22 @@ class ModuleDependencyInfo {
444
491
getAsPlaceholderDependencyModule () const ;
445
492
446
493
// / Add a dependency on the given module, if it was not already in the set.
447
- void addModuleDependency (StringRef module ,
448
- llvm::StringSet<> *alreadyAddedModules = nullptr );
494
+ void addModuleImport (StringRef module ,
495
+ llvm::StringSet<> *alreadyAddedModules = nullptr );
449
496
450
497
// / Add a dependency on the given module, if it was not already in the set.
451
- void addModuleDependency (ImportPath::Module module ,
452
- llvm::StringSet<> *alreadyAddedModules = nullptr ) {
453
- addModuleDependency (module .front ().Item .str (), alreadyAddedModules);
498
+ void addModuleImport (ImportPath::Module module ,
499
+ llvm::StringSet<> *alreadyAddedModules = nullptr ) {
500
+ addModuleImport (module .front ().Item .str (), alreadyAddedModules);
454
501
}
455
502
456
- // / Add all of the module dependencies for the imports in the given source
457
- // / file to the set of module dependencies.
458
- void addModuleDependencies (const SourceFile &sf,
459
- llvm::StringSet<> &alreadyAddedModules);
503
+ // / Add all of the module imports in the given source
504
+ // / file to the set of module imports.
505
+ void addModuleImport (const SourceFile &sf,
506
+ llvm::StringSet<> &alreadyAddedModules);
507
+ // / Add a kind-qualified module dependency ID to the set of
508
+ // / module dependencies.
509
+ void addModuleDependency (ModuleDependencyID dependencyID);
460
510
461
511
// / Get the bridging header.
462
512
Optional<std::string> getBridgingHeader () const ;
@@ -480,8 +530,6 @@ class ModuleDependencyInfo {
480
530
collectCrossImportOverlayNames (ASTContext &ctx, StringRef moduleName);
481
531
};
482
532
483
- using ModuleDependencyID = std::pair<std::string, ModuleDependencyKind>;
484
- using ModuleDependenciesVector = llvm::SmallVector<ModuleDependencyInfo, 1 >;
485
533
using ModuleNameToDependencyMap = llvm::StringMap<ModuleDependencyInfo>;
486
534
using ModuleDependenciesKindMap =
487
535
std::unordered_map<ModuleDependencyKind,
@@ -587,8 +635,8 @@ class SwiftDependencyScanningService {
587
635
}
588
636
589
637
// / Whether we have cached dependency information for the given module.
590
- bool hasDependencies (StringRef moduleName,
591
- Optional<ModuleDependencyKind> kind) const ;
638
+ bool hasDependency (StringRef moduleName,
639
+ Optional<ModuleDependencyKind> kind) const ;
592
640
593
641
// / Return a pointer to the context-specific cache state of the current
594
642
// / scanning action.
@@ -606,15 +654,15 @@ class SwiftDependencyScanningService {
606
654
// /
607
655
// / \returns the cached result, or \c None if there is no cached entry.
608
656
Optional<ModuleDependencyInfo>
609
- findDependencies (StringRef moduleName,
610
- Optional<ModuleDependencyKind> kind) const ;
657
+ findDependency (StringRef moduleName,
658
+ Optional<ModuleDependencyKind> kind) const ;
611
659
612
660
// / Record dependencies for the given module.
613
- const ModuleDependencyInfo *recordDependencies (StringRef moduleName,
661
+ const ModuleDependencyInfo *recordDependency (StringRef moduleName,
614
662
ModuleDependencyInfo dependencies);
615
663
616
664
// / Update stored dependencies for the given module.
617
- const ModuleDependencyInfo *updateDependencies (ModuleDependencyID moduleID,
665
+ const ModuleDependencyInfo *updateDependency (ModuleDependencyID moduleID,
618
666
ModuleDependencyInfo dependencies);
619
667
620
668
// / Reference the list of all module dependencies that are not source-based
@@ -658,7 +706,7 @@ class ModuleDependenciesCache {
658
706
// / The Clang dependency scanner tool
659
707
clang::tooling::dependencies::DependencyScanningTool clangScanningTool;
660
708
// / Discovered Clang modules are only cached locally.
661
- llvm::StringMap<ModuleDependenciesVector > clangModuleDependencies;
709
+ llvm::StringMap<ModuleDependencyInfo > clangModuleDependencies;
662
710
663
711
// / Retrieve the dependencies map that corresponds to the given dependency
664
712
// / kind.
@@ -669,8 +717,8 @@ class ModuleDependenciesCache {
669
717
670
718
// / Local cache results lookup, only for modules which were discovered during
671
719
// / the current scanner invocation.
672
- bool hasDependenciesLocalOnly (StringRef moduleName,
673
- Optional<ModuleDependencyKind> kind) const ;
720
+ bool hasDependencyLocalOnly (StringRef moduleName,
721
+ Optional<ModuleDependencyKind> kind) const ;
674
722
675
723
// / Local cache results lookup, only for modules which were discovered during
676
724
// / the current scanner invocation.
@@ -687,8 +735,8 @@ class ModuleDependenciesCache {
687
735
688
736
public:
689
737
// / Whether we have cached dependency information for the given module.
690
- bool hasDependencies (StringRef moduleName,
691
- Optional<ModuleDependencyKind> kind) const ;
738
+ bool hasDependency (StringRef moduleName,
739
+ Optional<ModuleDependencyKind> kind) const ;
692
740
693
741
// / Produce a reference to the Clang scanner tool associated with this cache
694
742
clang::tooling::dependencies::DependencyScanningTool& getClangScannerTool () {
@@ -702,16 +750,21 @@ class ModuleDependenciesCache {
702
750
// /
703
751
// / \returns the cached result, or \c None if there is no cached entry.
704
752
Optional<ModuleDependencyInfo>
705
- findDependencies (StringRef moduleName,
706
- Optional<ModuleDependencyKind> kind) const ;
753
+ findDependency (StringRef moduleName,
754
+ Optional<ModuleDependencyKind> kind) const ;
707
755
708
756
// / Record dependencies for the given module.
709
- void recordDependencies (StringRef moduleName,
710
- ModuleDependencyInfo dependencies);
757
+ void recordDependency (StringRef moduleName,
758
+ ModuleDependencyInfo dependencies);
711
759
712
760
// / Update stored dependencies for the given module.
713
- void updateDependencies (ModuleDependencyID moduleID,
714
- ModuleDependencyInfo dependencies);
761
+ void updateDependency (ModuleDependencyID moduleID,
762
+ ModuleDependencyInfo dependencies);
763
+
764
+ // / Resolve a dependency module's set of imports
765
+ // / to a kind-qualified set of module IDs.
766
+ void resolveDependencyImports (ModuleDependencyID moduleID,
767
+ ModuleDependencyIDSetVector dependencyIDs);
715
768
716
769
const std::vector<ModuleDependencyID> &getAllSourceModules () const {
717
770
return globalScanningService.getAllSourceModules ();
0 commit comments