Skip to content

Commit faf1029

Browse files
committed
Swift: refactor PatternVisitor to use translations
1 parent 4702271 commit faf1029

File tree

4 files changed

+75
-74
lines changed

4 files changed

+75
-74
lines changed

swift/extractor/infra/SwiftDispatcher.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ class SwiftDispatcher {
329329
virtual void visit(const swift::StmtConditionElement* cond) = 0;
330330
virtual void visit(swift::CaseLabelItem* item) = 0;
331331
virtual void visit(swift::Expr* expr) = 0;
332-
virtual void visit(swift::Pattern* pattern) = 0;
332+
virtual void visit(const swift::Pattern* pattern) = 0;
333333
virtual void visit(swift::TypeRepr* typeRepr, swift::Type type) = 0;
334334
virtual void visit(swift::TypeBase* type) = 0;
335335

swift/extractor/visitors/PatternVisitor.cpp

Lines changed: 54 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,90 +2,83 @@
22

33
namespace codeql {
44

5-
void PatternVisitor::visitNamedPattern(swift::NamedPattern* pattern) {
6-
auto label = dispatcher_.assignNewLabel(pattern);
5+
codeql::NamedPattern PatternVisitor::translateNamedPattern(const swift::NamedPattern& pattern) {
6+
auto entry = dispatcher_.createEntry(pattern);
77
// TODO: in some (but not all) cases, this seems to introduce a duplicate entry
88
// for example the vars listed in a case stmt have a different pointer than then ones in
99
// patterns.
10-
// assert(pattern->getDecl() && "expect NamedPattern to have Decl");
11-
// dispatcher_.emit(NamedPatternsTrap{label, pattern->getNameStr().str(),
12-
// dispatcher_.fetchLabel(pattern->getDecl())});
13-
dispatcher_.emit(NamedPatternsTrap{label, pattern->getNameStr().str()});
10+
// assert(pattern.getDecl() && "expect NamedPattern to have Decl");
11+
// dispatcher_.emit(NamedPatternsTrap{label, pattern.getNameStr().str(),
12+
// dispatcher_.fetchLabel(pattern.getDecl())});
13+
entry.name = pattern.getNameStr().str();
14+
return entry;
1415
}
1516

16-
void PatternVisitor::visitTypedPattern(swift::TypedPattern* pattern) {
17-
auto label = dispatcher_.assignNewLabel(pattern);
18-
assert(pattern->getSubPattern() && "expect TypedPattern to have a SubPattern");
19-
dispatcher_.emit(TypedPatternsTrap{label, dispatcher_.fetchLabel(pattern->getSubPattern())});
20-
if (auto typeRepr = pattern->getTypeRepr()) {
21-
dispatcher_.emit(TypedPatternTypeReprsTrap{
22-
label, dispatcher_.fetchLabel(pattern->getTypeRepr(), pattern->getType())});
23-
}
17+
codeql::TypedPattern PatternVisitor::translateTypedPattern(const swift::TypedPattern& pattern) {
18+
auto entry = dispatcher_.createEntry(pattern);
19+
entry.sub_pattern = dispatcher_.fetchLabel(pattern.getSubPattern());
20+
entry.type_repr = dispatcher_.fetchOptionalLabel(pattern.getTypeRepr(), pattern.getType());
21+
return entry;
2422
}
2523

26-
void PatternVisitor::visitTuplePattern(swift::TuplePattern* pattern) {
27-
auto label = dispatcher_.assignNewLabel(pattern);
28-
dispatcher_.emit(TuplePatternsTrap{label});
29-
auto i = 0u;
30-
for (auto p : pattern->getElements()) {
31-
dispatcher_.emit(TuplePatternElementsTrap{label, i++, dispatcher_.fetchLabel(p.getPattern())});
24+
codeql::TuplePattern PatternVisitor::translateTuplePattern(const swift::TuplePattern& pattern) {
25+
auto entry = dispatcher_.createEntry(pattern);
26+
for (const auto& p : pattern.getElements()) {
27+
entry.elements.push_back(dispatcher_.fetchLabel(p.getPattern()));
3228
}
29+
return entry;
3330
}
34-
void PatternVisitor::visitAnyPattern(swift::AnyPattern* pattern) {
35-
dispatcher_.emit(AnyPatternsTrap{dispatcher_.assignNewLabel(pattern)});
31+
codeql::AnyPattern PatternVisitor::translateAnyPattern(const swift::AnyPattern& pattern) {
32+
auto entry = dispatcher_.createEntry(pattern);
33+
return entry;
3634
}
3735

38-
void PatternVisitor::visitBindingPattern(swift::BindingPattern* pattern) {
39-
auto label = dispatcher_.assignNewLabel(pattern);
40-
assert(pattern->getSubPattern() && "expect BindingPattern to have a SubPattern");
41-
dispatcher_.emit(BindingPatternsTrap{label, dispatcher_.fetchLabel(pattern->getSubPattern())});
36+
codeql::BindingPattern PatternVisitor::translateBindingPattern(
37+
const swift::BindingPattern& pattern) {
38+
auto entry = dispatcher_.createEntry(pattern);
39+
entry.sub_pattern = dispatcher_.fetchLabel(pattern.getSubPattern());
40+
return entry;
4241
}
4342

44-
void PatternVisitor::visitEnumElementPattern(swift::EnumElementPattern* pattern) {
45-
auto label = dispatcher_.assignNewLabel(pattern);
46-
dispatcher_.emit(
47-
EnumElementPatternsTrap{label, dispatcher_.fetchLabel(pattern->getElementDecl())});
48-
if (auto subPattern = pattern->getSubPattern()) {
49-
dispatcher_.emit(
50-
EnumElementPatternSubPatternsTrap{label, dispatcher_.fetchLabel(pattern->getSubPattern())});
51-
}
43+
codeql::EnumElementPattern PatternVisitor::translateEnumElementPattern(
44+
const swift::EnumElementPattern& pattern) {
45+
auto entry = dispatcher_.createEntry(pattern);
46+
entry.element = dispatcher_.fetchLabel(pattern.getElementDecl());
47+
entry.sub_pattern = dispatcher_.fetchOptionalLabel(pattern.getSubPattern());
48+
return entry;
5249
}
5350

54-
void PatternVisitor::visitOptionalSomePattern(swift::OptionalSomePattern* pattern) {
55-
auto label = dispatcher_.assignNewLabel(pattern);
56-
assert(pattern->getSubPattern() && "expect BindingPattern to have a SubPattern");
57-
dispatcher_.emit(
58-
OptionalSomePatternsTrap{label, dispatcher_.fetchLabel(pattern->getSubPattern())});
51+
codeql::OptionalSomePattern PatternVisitor::translateOptionalSomePattern(
52+
const swift::OptionalSomePattern& pattern) {
53+
auto entry = dispatcher_.createEntry(pattern);
54+
entry.sub_pattern = dispatcher_.fetchLabel(pattern.getSubPattern());
55+
return entry;
5956
}
6057

61-
void PatternVisitor::visitIsPattern(swift::IsPattern* pattern) {
62-
auto label = dispatcher_.assignNewLabel(pattern);
63-
dispatcher_.emit(IsPatternsTrap{label});
64-
65-
if (auto typeRepr = pattern->getCastTypeRepr()) {
66-
dispatcher_.emit(IsPatternCastTypeReprsTrap{
67-
label, dispatcher_.fetchLabel(typeRepr, pattern->getCastType())});
68-
}
69-
if (auto subPattern = pattern->getSubPattern()) {
70-
dispatcher_.emit(IsPatternSubPatternsTrap{label, dispatcher_.fetchLabel(subPattern)});
71-
}
58+
codeql::IsPattern PatternVisitor::translateIsPattern(const swift::IsPattern& pattern) {
59+
auto entry = dispatcher_.createEntry(pattern);
60+
entry.cast_type_repr =
61+
dispatcher_.fetchOptionalLabel(pattern.getCastTypeRepr(), pattern.getCastType());
62+
entry.sub_pattern = dispatcher_.fetchOptionalLabel(pattern.getSubPattern());
63+
return entry;
7264
}
7365

74-
void PatternVisitor::visitExprPattern(swift::ExprPattern* pattern) {
75-
auto label = dispatcher_.assignNewLabel(pattern);
76-
assert(pattern->getSubExpr() && "expect ExprPattern to have SubExpr");
77-
dispatcher_.emit(ExprPatternsTrap{label, dispatcher_.fetchLabel(pattern->getSubExpr())});
66+
codeql::ExprPattern PatternVisitor::translateExprPattern(const swift::ExprPattern& pattern) {
67+
auto entry = dispatcher_.createEntry(pattern);
68+
entry.sub_expr = dispatcher_.fetchLabel(pattern.getSubExpr());
69+
return entry;
7870
}
7971

80-
void PatternVisitor::visitParenPattern(swift::ParenPattern* pattern) {
81-
auto label = dispatcher_.assignNewLabel(pattern);
82-
assert(pattern->getSubPattern() && "expect ParenPattern to have SubPattern");
83-
dispatcher_.emit(ParenPatternsTrap{label, dispatcher_.fetchLabel(pattern->getSubPattern())});
72+
codeql::ParenPattern PatternVisitor::translateParenPattern(const swift::ParenPattern& pattern) {
73+
auto entry = dispatcher_.createEntry(pattern);
74+
entry.sub_pattern = dispatcher_.fetchLabel(pattern.getSubPattern());
75+
return entry;
8476
}
8577

86-
void PatternVisitor::visitBoolPattern(swift::BoolPattern* pattern) {
87-
auto label = dispatcher_.assignNewLabel(pattern);
88-
dispatcher_.emit(BoolPatternsTrap{label, pattern->getValue()});
78+
codeql::BoolPattern PatternVisitor::translateBoolPattern(const swift::BoolPattern& pattern) {
79+
auto entry = dispatcher_.createEntry(pattern);
80+
entry.value = pattern.getValue();
81+
return entry;
8982
}
9083

9184
} // namespace codeql

swift/extractor/visitors/PatternVisitor.h

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,25 @@ namespace codeql {
88
class PatternVisitor : public AstVisitorBase<PatternVisitor> {
99
public:
1010
using AstVisitorBase<PatternVisitor>::AstVisitorBase;
11+
using AstVisitorBase<PatternVisitor>::visit;
1112

12-
void visitNamedPattern(swift::NamedPattern* pattern);
13-
void visitTypedPattern(swift::TypedPattern* pattern);
14-
void visitTuplePattern(swift::TuplePattern* pattern);
15-
void visitAnyPattern(swift::AnyPattern* pattern);
16-
void visitBindingPattern(swift::BindingPattern* pattern);
17-
void visitEnumElementPattern(swift::EnumElementPattern* pattern);
18-
void visitOptionalSomePattern(swift::OptionalSomePattern* pattern);
19-
void visitIsPattern(swift::IsPattern* pattern);
20-
void visitExprPattern(swift::ExprPattern* pattern);
21-
void visitParenPattern(swift::ParenPattern* pattern);
22-
void visitBoolPattern(swift::BoolPattern* pattern);
13+
// TODO
14+
// swift does not provide const visitors, for the moment we const_cast and promise not to
15+
// change the entities. When all visitors have been turned to translators, we can ditch
16+
// swift::ASTVisitor and roll out our own const-correct TranslatorBase class
17+
void visit(const swift::Pattern* pattern) { visit(const_cast<swift::Pattern*>(pattern)); }
18+
19+
codeql::NamedPattern translateNamedPattern(const swift::NamedPattern& pattern);
20+
codeql::TypedPattern translateTypedPattern(const swift::TypedPattern& pattern);
21+
codeql::TuplePattern translateTuplePattern(const swift::TuplePattern& pattern);
22+
codeql::AnyPattern translateAnyPattern(const swift::AnyPattern& pattern);
23+
codeql::BindingPattern translateBindingPattern(const swift::BindingPattern& pattern);
24+
codeql::EnumElementPattern translateEnumElementPattern(const swift::EnumElementPattern& pattern);
25+
codeql::OptionalSomePattern translateOptionalSomePattern(
26+
const swift::OptionalSomePattern& pattern);
27+
codeql::IsPattern translateIsPattern(const swift::IsPattern& pattern);
28+
codeql::ExprPattern translateExprPattern(const swift::ExprPattern& pattern);
29+
codeql::ParenPattern translateParenPattern(const swift::ParenPattern& pattern);
30+
codeql::BoolPattern translateBoolPattern(const swift::BoolPattern& pattern);
2331
};
2432
} // namespace codeql

swift/extractor/visitors/SwiftVisitor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class SwiftVisitor : private SwiftDispatcher {
3131
}
3232
void visit(swift::CaseLabelItem* item) override { stmtVisitor.visitCaseLabelItem(item); }
3333
void visit(swift::Expr* expr) override { exprVisitor.visit(expr); }
34-
void visit(swift::Pattern* pattern) override { patternVisitor.visit(pattern); }
34+
void visit(const swift::Pattern* pattern) override { patternVisitor.visit(pattern); }
3535
void visit(swift::TypeBase* type) override { typeVisitor.visit(type); }
3636
void visit(swift::TypeRepr* typeRepr, swift::Type type) override {
3737
emit(typeVisitor.translateTypeRepr(*typeRepr, type));

0 commit comments

Comments
 (0)