39
39
#include " llvm/Support/VirtualFileSystem.h"
40
40
#include < string>
41
41
#include < unordered_map>
42
+ #include < unordered_set>
42
43
#include < vector>
43
44
44
45
namespace swift {
@@ -86,17 +87,38 @@ enum class ModuleDependencyKind : int8_t {
86
87
LastKind = SwiftPlaceholder + 1
87
88
};
88
89
89
- using ModuleDependencyID = std::pair<std::string, ModuleDependencyKind>;
90
- using ModuleDependencyIDSetVector =
91
- llvm::SetVector<ModuleDependencyID, std::vector<ModuleDependencyID>,
92
- std::set<ModuleDependencyID>>;
90
+ // / This is used to identify a specific module.
91
+ struct ModuleDependencyID {
92
+ std::string ModuleName;
93
+ ModuleDependencyKind Kind;
94
+ bool operator ==(const ModuleDependencyID &Other) const {
95
+ return std::tie (ModuleName, Kind) ==
96
+ std::tie (Other.ModuleName , Other.Kind );
97
+ }
98
+ bool operator <(const ModuleDependencyID& Other) const {
99
+ return std::tie (ModuleName, Kind) <
100
+ std::tie (Other.ModuleName , Other.Kind );
101
+ }
102
+ };
93
103
94
104
struct ModuleDependencyKindHash {
95
105
std::size_t operator ()(ModuleDependencyKind k) const {
96
106
using UnderlyingType = std::underlying_type<ModuleDependencyKind>::type;
97
107
return std::hash<UnderlyingType>{}(static_cast <UnderlyingType>(k));
98
108
}
99
109
};
110
+ struct ModuleDependencyIDHash {
111
+ std::size_t operator ()(ModuleDependencyID id) const {
112
+ return llvm::hash_combine (id.ModuleName , id.Kind );
113
+ }
114
+ };
115
+
116
+ using ModuleDependencyIDSet =
117
+ std::unordered_set<ModuleDependencyID,
118
+ ModuleDependencyIDHash>;
119
+ using ModuleDependencyIDSetVector =
120
+ llvm::SetVector<ModuleDependencyID, std::vector<ModuleDependencyID>,
121
+ std::set<ModuleDependencyID>>;
100
122
101
123
namespace dependencies {
102
124
std::string createEncodedModuleKindAndName (ModuleDependencyID id);
@@ -645,6 +667,9 @@ class ModuleDependencyInfo {
645
667
// / Whether the dependencies are for a Swift module: either Textual, Source, Binary, or Placeholder.
646
668
bool isSwiftModule () const ;
647
669
670
+ // / Whether the dependencies are for a textual interface Swift module or a Source Swift module.
671
+ bool isTextualSwiftModule () const ;
672
+
648
673
// / Whether the dependencies are for a textual Swift module.
649
674
bool isSwiftInterfaceModule () const ;
650
675
@@ -750,6 +775,7 @@ class ModuleDependencyInfo {
750
775
collectCrossImportOverlayNames (ASTContext &ctx, StringRef moduleName) const ;
751
776
};
752
777
778
+ using ModuleDependencyVector = llvm::SmallVector<std::pair<ModuleDependencyID, ModuleDependencyInfo>, 1 >;
753
779
using ModuleNameToDependencyMap = llvm::StringMap<ModuleDependencyInfo>;
754
780
using ModuleDependenciesKindMap =
755
781
std::unordered_map<ModuleDependencyKind,
@@ -861,6 +887,7 @@ class SwiftDependencyScanningService {
861
887
}
862
888
863
889
bool usingCachingFS () const { return !UseClangIncludeTree && (bool )CacheFS; }
890
+ llvm::IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> getCachingFS () const { return CacheFS; }
864
891
865
892
llvm::cas::CachingOnDiskFileSystem &getSharedCachingFS () const {
866
893
assert (CacheFS && " Expect CachingOnDiskFileSystem" );
@@ -895,9 +922,10 @@ class SwiftDependencyScanningService {
895
922
// / Enforce clients not being allowed to query this cache directly, it must be
896
923
// / wrapped in an instance of `ModuleDependenciesCache`.
897
924
friend class ModuleDependenciesCache ;
925
+ friend class ModuleDependencyScanner ;
926
+ friend class ModuleDependencyScanningWorker ;
898
927
friend class ModuleDependenciesCacheDeserializer ;
899
928
friend class ModuleDependenciesCacheSerializer ;
900
- friend class DependencyScanningTool ;
901
929
902
930
// / Configure the current state of the cache to respond to queries
903
931
// / for the specified scanning context hash.
@@ -964,8 +992,6 @@ class ModuleDependenciesCache {
964
992
std::string scannerContextHash;
965
993
// / The location of where the built modules will be output to
966
994
std::string moduleOutputPath;
967
- // / The Clang dependency scanner tool
968
- clang::tooling::dependencies::DependencyScanningTool clangScanningTool;
969
995
970
996
// / Retrieve the dependencies map that corresponds to the given dependency
971
997
// / kind.
@@ -983,38 +1009,60 @@ class ModuleDependenciesCache {
983
1009
ModuleDependenciesCache &operator =(const ModuleDependenciesCache &) = delete ;
984
1010
985
1011
public:
1012
+ // / Whether we have cached dependency information for the given module.
1013
+ bool hasDependency (const ModuleDependencyID &moduleID) const ;
986
1014
// / Whether we have cached dependency information for the given module.
987
1015
bool hasDependency (StringRef moduleName,
988
1016
llvm::Optional<ModuleDependencyKind> kind) const ;
1017
+ // / Whether we have cached dependency information for the given module Name.
1018
+ bool hasDependency (StringRef moduleName) const ;
989
1019
990
- // / Produce a reference to the Clang scanner tool associated with this cache
991
- clang::tooling::dependencies::DependencyScanningTool& getClangScannerTool () {
992
- return clangScanningTool;
993
- }
994
1020
SwiftDependencyScanningService &getScanService () {
995
1021
return globalScanningService;
996
1022
}
997
- llvm::DenseSet<clang::tooling::dependencies::ModuleID>& getAlreadySeenClangModules () {
1023
+ const SwiftDependencyScanningService &getScanService () const {
1024
+ return globalScanningService;
1025
+ }
1026
+ const llvm::DenseSet<clang::tooling::dependencies::ModuleID>& getAlreadySeenClangModules () const {
998
1027
return alreadySeenClangModules;
999
1028
}
1000
1029
void addSeenClangModule (clang::tooling::dependencies::ModuleID newModule) {
1001
1030
alreadySeenClangModules.insert (newModule);
1002
1031
}
1003
- std::string getModuleOutputPath () {
1032
+ std::string getModuleOutputPath () const {
1004
1033
return moduleOutputPath;
1005
1034
}
1006
1035
1036
+ // / Query all dependencies, direct and Swift overlay.
1037
+ std::vector<ModuleDependencyID>
1038
+ getAllDependencies (const ModuleDependencyID &moduleID) const ;
1039
+
1040
+ // / Look for module dependencies for a module with the given ID
1041
+ // /
1042
+ // / \returns the cached result, or \c None if there is no cached entry.
1043
+ llvm::Optional<const ModuleDependencyInfo *>
1044
+ findDependency (const ModuleDependencyID moduleID) const ;
1045
+
1007
1046
// / Look for module dependencies for a module with the given name
1008
1047
// /
1009
1048
// / \returns the cached result, or \c None if there is no cached entry.
1010
1049
llvm::Optional<const ModuleDependencyInfo *>
1011
1050
findDependency (StringRef moduleName,
1012
1051
llvm::Optional<ModuleDependencyKind> kind) const ;
1013
1052
1053
+ // / Look for module dependencies for a module with the given name
1054
+ // /
1055
+ // / \returns the cached result, or \c None if there is no cached entry.
1056
+ llvm::Optional<const ModuleDependencyInfo *>
1057
+ findDependency (StringRef moduleName) const ;
1058
+
1014
1059
// / Record dependencies for the given module.
1015
1060
void recordDependency (StringRef moduleName,
1016
1061
ModuleDependencyInfo dependencies);
1017
1062
1063
+ // / Record dependencies for the given module collection.
1064
+ void recordDependencies (ModuleDependencyVector moduleDependencies);
1065
+
1018
1066
// / Update stored dependencies for the given module.
1019
1067
void updateDependency (ModuleDependencyID moduleID,
1020
1068
ModuleDependencyInfo dependencies);
@@ -1039,12 +1087,8 @@ class ModuleDependenciesCache {
1039
1087
namespace std {
1040
1088
template <>
1041
1089
struct hash <swift::ModuleDependencyID> {
1042
- using UnderlyingKindType = std::underlying_type<swift::ModuleDependencyKind>::type;
1043
1090
std::size_t operator ()(const swift::ModuleDependencyID &id) const {
1044
- auto underlyingKindValue = static_cast <UnderlyingKindType>(id.second );
1045
-
1046
- return (hash<string>()(id.first ) ^
1047
- (hash<UnderlyingKindType>()(underlyingKindValue)));
1091
+ return llvm::hash_combine (id.ModuleName , id.Kind );
1048
1092
}
1049
1093
};
1050
1094
} // namespace std
0 commit comments