@@ -7,6 +7,91 @@ namespace codeql {
77class PatternVisitor : public AstVisitorBase <PatternVisitor> {
88 public:
99 using AstVisitorBase<PatternVisitor>::AstVisitorBase;
10- };
1110
11+ void visitNamedPattern (swift::NamedPattern* pattern) {
12+ auto label = dispatcher_.assignNewLabel (pattern);
13+ // TODO: in some (but not all) cases, this seems to introduce a duplicate entry
14+ // for example the vars listed in a case stmt have a different pointer than then ones in
15+ // patterns.
16+ // assert(pattern->getDecl() && "expect NamedPattern to have Decl");
17+ // dispatcher_.emit(NamedPatternsTrap{label, pattern->getNameStr().str(),
18+ // dispatcher_.fetchLabel(pattern->getDecl())});
19+ dispatcher_.emit (NamedPatternsTrap{label, pattern->getNameStr ().str ()});
20+ }
21+
22+ void visitTypedPattern (swift::TypedPattern* pattern) {
23+ auto label = dispatcher_.assignNewLabel (pattern);
24+ assert (pattern->getSubPattern () && " expect TypedPattern to have a SubPattern" );
25+ dispatcher_.emit (TypedPatternsTrap{label, dispatcher_.fetchLabel (pattern->getSubPattern ())});
26+ if (auto typeRepr = pattern->getTypeRepr ()) {
27+ dispatcher_.emit (
28+ TypedPatternTypeReprsTrap{label, dispatcher_.fetchLabel (pattern->getTypeRepr ())});
29+ }
30+ }
31+
32+ void visitTuplePattern (swift::TuplePattern* pattern) {
33+ auto label = dispatcher_.assignNewLabel (pattern);
34+ dispatcher_.emit (TuplePatternsTrap{label});
35+ auto i = 0u ;
36+ for (auto p : pattern->getElements ()) {
37+ dispatcher_.emit (
38+ TuplePatternElementsTrap{label, i++, dispatcher_.fetchLabel (p.getPattern ())});
39+ }
40+ }
41+ void visitAnyPattern (swift::AnyPattern* pattern) {
42+ dispatcher_.emit (AnyPatternsTrap{dispatcher_.assignNewLabel (pattern)});
43+ }
44+
45+ void visitBindingPattern (swift::BindingPattern* pattern) {
46+ auto label = dispatcher_.assignNewLabel (pattern);
47+ assert (pattern->getSubPattern () && " expect BindingPattern to have a SubPattern" );
48+ dispatcher_.emit (BindingPatternsTrap{label, dispatcher_.fetchLabel (pattern->getSubPattern ())});
49+ }
50+
51+ void visitEnumElementPattern (swift::EnumElementPattern* pattern) {
52+ auto label = dispatcher_.assignNewLabel (pattern);
53+ dispatcher_.emit (
54+ EnumElementPatternsTrap{label, dispatcher_.fetchLabel (pattern->getElementDecl ())});
55+ if (auto subPattern = pattern->getSubPattern ()) {
56+ dispatcher_.emit (EnumElementPatternSubPatternsTrap{
57+ label, dispatcher_.fetchLabel (pattern->getSubPattern ())});
58+ }
59+ }
60+
61+ void visitOptionalSomePattern (swift::OptionalSomePattern* pattern) {
62+ auto label = dispatcher_.assignNewLabel (pattern);
63+ assert (pattern->getSubPattern () && " expect BindingPattern to have a SubPattern" );
64+ dispatcher_.emit (
65+ OptionalSomePatternsTrap{label, dispatcher_.fetchLabel (pattern->getSubPattern ())});
66+ }
67+
68+ void visitIsPattern (swift::IsPattern* pattern) {
69+ auto label = dispatcher_.assignNewLabel (pattern);
70+ dispatcher_.emit (IsPatternsTrap{label});
71+
72+ if (auto typeRepr = pattern->getCastTypeRepr ()) {
73+ dispatcher_.emit (IsPatternCastTypeReprsTrap{label, dispatcher_.fetchLabel (typeRepr)});
74+ }
75+ if (auto subPattern = pattern->getSubPattern ()) {
76+ dispatcher_.emit (IsPatternSubPatternsTrap{label, dispatcher_.fetchLabel (subPattern)});
77+ }
78+ }
79+
80+ void visitExprPattern (swift::ExprPattern* pattern) {
81+ auto label = dispatcher_.assignNewLabel (pattern);
82+ assert (pattern->getSubExpr () && " expect ExprPattern to have SubExpr" );
83+ dispatcher_.emit (ExprPatternsTrap{label, dispatcher_.fetchLabel (pattern->getSubExpr ())});
84+ }
85+
86+ void visitParenPattern (swift::ParenPattern* pattern) {
87+ auto label = dispatcher_.assignNewLabel (pattern);
88+ assert (pattern->getSubPattern () && " expect ParenPattern to have SubPattern" );
89+ dispatcher_.emit (ParenPatternsTrap{label, dispatcher_.fetchLabel (pattern->getSubPattern ())});
90+ }
91+
92+ void visitBoolPattern (swift::BoolPattern* pattern) {
93+ auto label = dispatcher_.assignNewLabel (pattern);
94+ dispatcher_.emit (BoolPatternsTrap{label, pattern->getValue ()});
95+ }
96+ };
1297} // namespace codeql
0 commit comments