Skip to content

Commit 45e14c9

Browse files
committed
Swift: extract ModuleType
1 parent 593ce01 commit 45e14c9

File tree

13 files changed

+46
-9
lines changed

13 files changed

+46
-9
lines changed

swift/codegen/schema.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ LValueType:
112112

113113
ModuleType:
114114
_extends: Type
115+
module: ModuleDecl
115116

116117
PlaceholderType:
117118
_extends: Type

swift/extractor/visitors/TypeVisitor.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,4 +381,14 @@ codeql::OpenedArchetypeType TypeVisitor::translateOpenedArchetypeType(
381381
fillArchetypeType(type, entry);
382382
return entry;
383383
}
384+
385+
codeql::ModuleType TypeVisitor::translateModuleType(const swift::ModuleType& type) {
386+
auto key = type.getModule()->getRealName().str().str();
387+
if (type.getModule()->isNonSwiftModule()) {
388+
key += "|clang";
389+
}
390+
auto entry = createTypeEntry(type, key);
391+
entry.module = dispatcher_.fetchLabel(type.getModule());
392+
return entry;
393+
}
384394
} // namespace codeql

swift/extractor/visitors/TypeVisitor.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class TypeVisitor : public TypeVisitorBase<TypeVisitor> {
7171
const swift::BuiltinUnsafeValueBufferType& type);
7272
codeql::BuiltinVectorType translateBuiltinVectorType(const swift::BuiltinVectorType& type);
7373
codeql::OpenedArchetypeType translateOpenedArchetypeType(const swift::OpenedArchetypeType& type);
74+
codeql::ModuleType translateModuleType(const swift::ModuleType& type);
7475

7576
private:
7677
void fillType(const swift::TypeBase& type, codeql::Type& entry);
@@ -83,9 +84,9 @@ class TypeVisitor : public TypeVisitorBase<TypeVisitor> {
8384
void emitBoundGenericType(swift::BoundGenericType* type, TrapLabel<BoundGenericTypeTag> label);
8485
void emitAnyGenericType(swift::AnyGenericType* type, TrapLabel<AnyGenericTypeTag> label);
8586

86-
template <typename T>
87-
auto createTypeEntry(const T& type) {
88-
auto entry = dispatcher_.createEntry(type);
87+
template <typename T, typename... Args>
88+
auto createTypeEntry(const T& type, const Args&... args) {
89+
auto entry = dispatcher_.createEntry(type, args...);
8990
fillType(type, entry);
9091
return entry;
9192
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
// generated by codegen/codegen.py
2+
import codeql.swift.elements.decl.ModuleDecl
23
import codeql.swift.elements.type.Type
34

45
class ModuleTypeBase extends @module_type, Type {
56
override string getAPrimaryQlClass() { result = "ModuleType" }
7+
8+
ModuleDecl getModule() {
9+
exists(ModuleDecl x |
10+
module_types(this, x) and
11+
result = x.resolve()
12+
)
13+
}
614
}

swift/ql/lib/swift.dbscheme

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ l_value_types( //dir=type
264264
);
265265

266266
module_types( //dir=type
267-
unique int id: @module_type
267+
unique int id: @module_type,
268+
int module: @module_decl ref
268269
);
269270

270271
placeholder_types( //dir=type

swift/ql/test/TestUtils.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ cached
44
predicate toBeTested(Element e) {
55
e instanceof File
66
or
7-
exists(ModuleDecl m | m = e and not m.isBuiltinModule() and not m.isSystemModule())
7+
exists(ModuleDecl m |
8+
not m.isBuiltinModule() and
9+
not m.isSystemModule() and
10+
(m = e or m.getInterfaceType() = e)
11+
)
812
or
913
exists(Locatable loc |
1014
loc.getLocation().getFile().getName().matches("%swift/ql/test%") and
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
| file://:0:0:0:0 | Foo | getInterfaceType: | module<Foo> | getName: | Foo | isBuiltinModule: | no | isSystemModule: | no |
2+
| file://:0:0:0:0 | default_module_name | getInterfaceType: | module<default_module_name> | getName: | default_module_name | isBuiltinModule: | no | isSystemModule: | no |

swift/ql/test/extractor-tests/generated/decl/ModuleDecl/default_module_name.swift

Whitespace-only changes.

swift/ql/test/extractor-tests/generated/type/ModuleType/MISSING_SOURCE.txt

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
| module<Foo> | getName: | module<Foo> | getCanonicalType: | module<Foo> | getModule: | file://:0:0:0:0 | Foo |
2+
| module<default_module_name> | getName: | module<default_module_name> | getCanonicalType: | module<default_module_name> | getModule: | file://:0:0:0:0 | default_module_name |

0 commit comments

Comments
 (0)