8
8
#include < swift/AST/ASTContext.h>
9
9
#include < swift/AST/GenericEnvironment.h>
10
10
#include < swift/AST/GenericParamList.h>
11
+ #include < swift/AST/ClangModuleLoader.h>
12
+ #include < clang/Basic/Module.h>
11
13
12
14
using namespace codeql ;
13
15
@@ -17,6 +19,43 @@ Logger& logger() {
17
19
return ret;
18
20
}
19
21
22
+ const swift::ModuleDecl* getRealModuleOf (const swift::Decl* decl) {
23
+ auto * swiftModule = decl->getModuleContext ();
24
+ auto * clangModule = swiftModule->findUnderlyingClangModule ();
25
+
26
+ if (!clangModule) {
27
+ return swiftModule;
28
+ }
29
+
30
+ auto * clangModuleLoader = decl->getASTContext ().getClangModuleLoader ();
31
+
32
+ if (!clangModuleLoader) {
33
+ return swiftModule;
34
+ }
35
+
36
+ static std::unordered_map<const swift::Decl*, const swift::ModuleDecl*> cache;
37
+
38
+ if (auto result = cache.find (decl); result != cache.end ()) {
39
+ return result->second ;
40
+ }
41
+
42
+ for (const auto & submodule : clangModule->submodules ()) {
43
+ if (auto * swiftSubmodule = clangModuleLoader->getWrapperForModule (submodule)) {
44
+ llvm::SmallVector<swift::Decl*> children;
45
+ swiftSubmodule->getTopLevelDecls (children);
46
+ for (const auto child : children) {
47
+ cache[child] = swiftSubmodule;
48
+ }
49
+ }
50
+ }
51
+
52
+ if (auto result = cache.find (decl); result != cache.end ()) {
53
+ return result->second ;
54
+ } else {
55
+ return swiftModule;
56
+ }
57
+ }
58
+
20
59
const swift::Decl* getParent (const swift::Decl* decl) {
21
60
auto context = decl->getDeclContext ();
22
61
if (context->getContextKind () == swift::DeclContextKind::FileUnit) {
@@ -112,7 +151,8 @@ unsigned SwiftMangler::getExtensionIndex(const swift::ExtensionDecl* decl,
112
151
if (auto found = preloadedExtensionIndexes.extract (decl)) {
113
152
return found.mapped ();
114
153
}
115
- if (auto parentModule = llvm::dyn_cast<swift::ModuleDecl>(parent)) {
154
+ if (llvm::isa<swift::ModuleDecl>(parent)) {
155
+ auto * parentModule = getRealModuleOf (decl);
116
156
llvm::SmallVector<swift::Decl*> siblings;
117
157
parentModule->getTopLevelDecls (siblings);
118
158
indexExtensions (siblings);
0 commit comments