Skip to content

Commit 7f3e722

Browse files
committed
Swift: introduce type mangling
1 parent 4aeff0f commit 7f3e722

File tree

4 files changed

+32
-12
lines changed

4 files changed

+32
-12
lines changed

swift/extractor/mangler/SwiftMangler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,11 @@ std::string SwiftMangler::mangledName(const swift::Decl& decl) {
3030
}
3131
return ret.str();
3232
}
33+
34+
std::optional<std::string> SwiftMangler::mangleType(const swift::ModuleType& type) {
35+
auto key = type.getModule()->getRealName().str().str();
36+
if (type.getModule()->isNonSwiftModule()) {
37+
key += "|clang";
38+
}
39+
return key;
40+
}

swift/extractor/mangler/SwiftMangler.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
#pragma once
22

3-
#include <vector>
4-
#include <unordered_set>
5-
#include <filesystem>
6-
73
#include <swift/AST/ASTMangler.h>
4+
#include <swift/AST/Types.h>
85

96
namespace codeql {
107
class SwiftMangler {
118
public:
129
std::string mangledName(const swift::Decl& decl);
1310

11+
template <typename T>
12+
std::optional<std::string> mangleType(const T& type) {
13+
return std::nullopt;
14+
}
15+
16+
std::optional<std::string> mangleType(const swift::ModuleType& type);
17+
1418
private:
1519
swift::Mangle::ASTMangler mangler;
1620
};

swift/extractor/translators/TypeTranslator.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,7 @@ codeql::OpenedArchetypeType TypeTranslator::translateOpenedArchetypeType(
242242
}
243243

244244
codeql::ModuleType TypeTranslator::translateModuleType(const swift::ModuleType& type) {
245-
auto key = type.getModule()->getRealName().str().str();
246-
if (type.getModule()->isNonSwiftModule()) {
247-
key += "|clang";
248-
}
249-
auto entry = createTypeEntry(type, key);
245+
auto entry = createTypeEntry(type);
250246
entry.module = dispatcher.fetchLabel(type.getModule());
251247
return entry;
252248
}

swift/extractor/translators/TypeTranslator.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "swift/extractor/translators/TranslatorBase.h"
44
#include "swift/extractor/trap/generated/type/TrapClasses.h"
5+
#include "swift/extractor/mangler/SwiftMangler.h"
56

67
namespace codeql {
78
class TypeTranslator : public TypeTranslatorBase<TypeTranslator> {
@@ -87,12 +88,23 @@ class TypeTranslator : public TypeTranslatorBase<TypeTranslator> {
8788
void fillBoundGenericType(const swift::BoundGenericType& type, codeql::BoundGenericType& entry);
8889
void fillAnyGenericType(const swift::AnyGenericType& type, codeql::AnyGenericType& entry);
8990

90-
template <typename T, typename... Args>
91-
auto createTypeEntry(const T& type, const Args&... args) {
92-
auto entry = dispatcher.createEntry(type, args...);
91+
template <typename T>
92+
auto createMangledTypeEntry(const T& type) {
93+
auto mangledName = mangler.mangleType(type);
94+
if (mangledName) {
95+
return dispatcher.createEntry(type, mangledName.value());
96+
}
97+
return dispatcher.createEntry(type);
98+
}
99+
100+
template <typename T>
101+
auto createTypeEntry(const T& type) {
102+
auto entry = createMangledTypeEntry(type);
93103
fillType(type, entry);
94104
return entry;
95105
}
106+
107+
SwiftMangler mangler;
96108
};
97109

98110
} // namespace codeql

0 commit comments

Comments
 (0)