Skip to content

Commit 3492b48

Browse files
committed
Swift: extract types for patterns
1 parent fefc02d commit 3492b48

File tree

8 files changed

+68
-17
lines changed

8 files changed

+68
-17
lines changed

swift/extractor/translators/PatternTranslator.cpp

+13-11
Original file line numberDiff line numberDiff line change
@@ -3,62 +3,64 @@
33
namespace codeql {
44

55
codeql::NamedPattern PatternTranslator::translateNamedPattern(const swift::NamedPattern& pattern) {
6-
auto entry = dispatcher.createEntry(pattern);
6+
7+
auto entry = createPatternEntry(pattern);
8+
entry.name = pattern.getNameStr().str();
79
entry.var_decl = dispatcher.fetchLabel(pattern.getDecl());
810
return entry;
911
}
1012

1113
codeql::TypedPattern PatternTranslator::translateTypedPattern(const swift::TypedPattern& pattern) {
12-
auto entry = dispatcher.createEntry(pattern);
14+
auto entry = createPatternEntry(pattern);
1315
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
1416
entry.type_repr = dispatcher.fetchOptionalLabel(pattern.getTypeRepr(), pattern.getType());
1517
return entry;
1618
}
1719

1820
codeql::TuplePattern PatternTranslator::translateTuplePattern(const swift::TuplePattern& pattern) {
19-
auto entry = dispatcher.createEntry(pattern);
21+
auto entry = createPatternEntry(pattern);
2022
for (const auto& p : pattern.getElements()) {
2123
entry.elements.push_back(dispatcher.fetchLabel(p.getPattern()));
2224
}
2325
return entry;
2426
}
2527
codeql::AnyPattern PatternTranslator::translateAnyPattern(const swift::AnyPattern& pattern) {
26-
auto entry = dispatcher.createEntry(pattern);
28+
auto entry = createPatternEntry(pattern);
2729
return entry;
2830
}
2931

3032
codeql::BindingPattern PatternTranslator::translateBindingPattern(
3133
const swift::BindingPattern& pattern) {
32-
auto entry = dispatcher.createEntry(pattern);
34+
auto entry = createPatternEntry(pattern);
3335
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
3436
return entry;
3537
}
3638

3739
codeql::EnumElementPattern PatternTranslator::translateEnumElementPattern(
3840
const swift::EnumElementPattern& pattern) {
39-
auto entry = dispatcher.createEntry(pattern);
41+
auto entry = createPatternEntry(pattern);
4042
entry.element = dispatcher.fetchLabel(pattern.getElementDecl());
4143
entry.sub_pattern = dispatcher.fetchOptionalLabel(pattern.getSubPattern());
4244
return entry;
4345
}
4446

4547
codeql::OptionalSomePattern PatternTranslator::translateOptionalSomePattern(
4648
const swift::OptionalSomePattern& pattern) {
47-
auto entry = dispatcher.createEntry(pattern);
49+
auto entry = createPatternEntry(pattern);
4850
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
4951
return entry;
5052
}
5153

5254
codeql::IsPattern PatternTranslator::translateIsPattern(const swift::IsPattern& pattern) {
53-
auto entry = dispatcher.createEntry(pattern);
55+
auto entry = createPatternEntry(pattern);
5456
entry.cast_type_repr =
5557
dispatcher.fetchOptionalLabel(pattern.getCastTypeRepr(), pattern.getCastType());
5658
entry.sub_pattern = dispatcher.fetchOptionalLabel(pattern.getSubPattern());
5759
return entry;
5860
}
5961

6062
codeql::ExprPattern PatternTranslator::translateExprPattern(const swift::ExprPattern& pattern) {
61-
auto entry = dispatcher.createEntry(pattern);
63+
auto entry = createPatternEntry(pattern);
6264
if (auto match = pattern.getMatchExpr()) {
6365
entry.sub_expr = dispatcher.fetchLabel(match);
6466
} else {
@@ -68,13 +70,13 @@ codeql::ExprPattern PatternTranslator::translateExprPattern(const swift::ExprPat
6870
}
6971

7072
codeql::ParenPattern PatternTranslator::translateParenPattern(const swift::ParenPattern& pattern) {
71-
auto entry = dispatcher.createEntry(pattern);
73+
auto entry = createPatternEntry(pattern);
7274
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
7375
return entry;
7476
}
7577

7678
codeql::BoolPattern PatternTranslator::translateBoolPattern(const swift::BoolPattern& pattern) {
77-
auto entry = dispatcher.createEntry(pattern);
79+
auto entry = createPatternEntry(pattern);
7880
entry.value = pattern.getValue();
7981
return entry;
8082
}

swift/extractor/translators/PatternTranslator.h

+8
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,13 @@ class PatternTranslator : public AstTranslatorBase<PatternTranslator> {
2323
codeql::ExprPattern translateExprPattern(const swift::ExprPattern& pattern);
2424
codeql::ParenPattern translateParenPattern(const swift::ParenPattern& pattern);
2525
codeql::BoolPattern translateBoolPattern(const swift::BoolPattern& pattern);
26+
27+
private:
28+
template <typename T>
29+
TrapClassOf<T> createPatternEntry(const T& pattern) {
30+
auto entry = dispatcher.createEntry(pattern);
31+
entry.type = dispatcher.fetchOptionalLabel(pattern.getType());
32+
return entry;
33+
}
2634
};
2735
} // namespace codeql

swift/ql/.generated.list

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swift/ql/lib/codeql/swift/generated/Raw.qll

+6-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swift/ql/lib/codeql/swift/generated/pattern/Pattern.qll

+27-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

swift/ql/lib/swift.dbscheme

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<dbstats>
2+
<typesizes />
3+
<stats />
4+
</dbstats>

swift/schema.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class Expr(AstNode):
103103
@group("pattern")
104104
@ql.hideable
105105
class Pattern(AstNode):
106-
pass
106+
type: optional[Type]
107107

108108
@group("stmt")
109109
class Stmt(AstNode):

0 commit comments

Comments
 (0)