2
2
3
3
namespace codeql {
4
4
5
- void StmtVisitor::visitLabeledStmt (swift::LabeledStmt* stmt) {
6
- auto label = dispatcher_.assignNewLabel (stmt);
7
- emitLabeledStmt (stmt, label);
8
- }
9
-
10
5
codeql::StmtCondition StmtVisitor::translateStmtCondition (const swift::StmtCondition& cond) {
11
6
auto entry = dispatcher_.createEntry (cond);
12
7
entry.elements = dispatcher_.fetchRepeatedLabels (cond);
@@ -25,197 +20,157 @@ codeql::ConditionElement StmtVisitor::translateStmtConditionElement(
25
20
return entry;
26
21
}
27
22
28
- void StmtVisitor::visitLabeledConditionalStmt (swift::LabeledConditionalStmt* stmt) {
29
- auto label = dispatcher_.assignNewLabel (stmt);
30
- emitLabeledStmt (stmt, label);
31
- emitLabeledConditionalStmt (stmt, label);
32
- }
33
-
34
- void StmtVisitor::visitCaseLabelItem (swift::CaseLabelItem* labelItem) {
35
- auto label = dispatcher_.assignNewLabel (labelItem);
36
- assert (labelItem->getPattern () && " CaseLabelItem has Pattern" );
37
- dispatcher_.emit (CaseLabelItemsTrap{label, dispatcher_.fetchLabel (labelItem->getPattern ())});
23
+ codeql::CaseLabelItem StmtVisitor::translateCaseLabelItem (const swift::CaseLabelItem& labelItem) {
24
+ auto entry = dispatcher_.createEntry (labelItem);
25
+ entry.pattern = dispatcher_.fetchLabel (labelItem.getPattern ());
26
+ entry.guard = dispatcher_.fetchOptionalLabel (labelItem.getGuardExpr ());
27
+ return entry;
38
28
}
39
29
40
- void StmtVisitor::visitBraceStmt (swift::BraceStmt* stmt) {
41
- auto label = dispatcher_.assignNewLabel (stmt);
42
- dispatcher_.emit (BraceStmtsTrap{label});
43
- auto i = 0u ;
44
- for (auto & e : stmt->getElements ()) {
45
- dispatcher_.emit (BraceStmtElementsTrap{label, i++, dispatcher_.fetchLabel (e)});
46
- }
30
+ codeql::BraceStmt StmtVisitor::translateBraceStmt (const swift::BraceStmt& stmt) {
31
+ auto entry = dispatcher_.createEntry (stmt);
32
+ entry.elements = dispatcher_.fetchRepeatedLabels (stmt.getElements ());
33
+ return entry;
47
34
}
48
35
49
- void StmtVisitor::visitReturnStmt (swift::ReturnStmt* stmt) {
50
- auto label = dispatcher_.assignNewLabel (stmt);
51
- dispatcher_.emit (ReturnStmtsTrap{label});
52
- if (stmt->hasResult ()) {
53
- auto resultLabel = dispatcher_.fetchLabel (stmt->getResult ());
54
- dispatcher_.emit (ReturnStmtResultsTrap{label, resultLabel});
36
+ codeql::ReturnStmt StmtVisitor::translateReturnStmt (const swift::ReturnStmt& stmt) {
37
+ auto entry = dispatcher_.createEntry (stmt);
38
+ if (stmt.hasResult ()) {
39
+ entry.result = dispatcher_.fetchLabel (stmt.getResult ());
55
40
}
41
+ return entry;
56
42
}
57
43
58
- void StmtVisitor::visitForEachStmt (swift::ForEachStmt* stmt) {
59
- auto label = dispatcher_.assignNewLabel (stmt);
60
- assert (stmt->getBody () && " ForEachStmt has getBody()" );
61
- assert (stmt->getParsedSequence () && " ForEachStmt has getParsedSequence()" );
62
- assert (stmt->getPattern () && " ForEachStmt has getPattern()" );
63
- auto bodyLabel = dispatcher_.fetchLabel (stmt->getBody ());
64
- auto sequenceLabel = dispatcher_.fetchLabel (stmt->getParsedSequence ());
65
- auto patternLabel = dispatcher_.fetchLabel (stmt->getPattern ());
66
- emitLabeledStmt (stmt, label);
67
- dispatcher_.emit (ForEachStmtsTrap{label, patternLabel, sequenceLabel, bodyLabel});
68
- if (auto where = stmt->getWhere ()) {
69
- auto whereLabel = dispatcher_.fetchLabel (where);
70
- dispatcher_.emit (ForEachStmtWheresTrap{label, whereLabel});
71
- }
44
+ codeql::ForEachStmt StmtVisitor::translateForEachStmt (const swift::ForEachStmt& stmt) {
45
+ auto entry = dispatcher_.createEntry (stmt);
46
+ fillLabeledStmt (stmt, entry);
47
+ entry.body = dispatcher_.fetchLabel (stmt.getBody ());
48
+ entry.sequence = dispatcher_.fetchLabel (stmt.getParsedSequence ());
49
+ entry.pattern = dispatcher_.fetchLabel (stmt.getPattern ());
50
+ entry.where = dispatcher_.fetchOptionalLabel (stmt.getWhere ());
51
+ return entry;
72
52
}
73
53
74
- void StmtVisitor::visitIfStmt (swift::IfStmt* stmt) {
75
- auto label = dispatcher_.assignNewLabel (stmt);
76
- emitLabeledStmt (stmt, label);
77
- emitLabeledConditionalStmt (stmt, label);
78
- auto thenLabel = dispatcher_.fetchLabel (stmt->getThenStmt ());
79
- dispatcher_.emit (IfStmtsTrap{label, thenLabel});
80
- if (auto * elseStmt = stmt->getElseStmt ()) {
81
- auto elseLabel = dispatcher_.fetchLabel (elseStmt);
82
- dispatcher_.emit (IfStmtElsesTrap{label, elseLabel});
83
- }
54
+ codeql::IfStmt StmtVisitor::translateIfStmt (const swift::IfStmt& stmt) {
55
+ auto entry = dispatcher_.createEntry (stmt);
56
+ fillLabeledConditionalStmt (stmt, entry);
57
+ entry.then = dispatcher_.fetchLabel (stmt.getThenStmt ());
58
+ entry.else_ = dispatcher_.fetchOptionalLabel (stmt.getElseStmt ());
59
+ return entry;
84
60
}
85
61
86
- void StmtVisitor::visitBreakStmt (swift::BreakStmt* stmt) {
87
- auto label = dispatcher_.assignNewLabel (stmt);
88
- dispatcher_.emit (BreakStmtsTrap{label});
89
- if (auto * target = stmt->getTarget ()) {
90
- auto targetlabel = dispatcher_.fetchLabel (target);
91
- dispatcher_.emit (BreakStmtTargetsTrap{label, targetlabel});
92
- }
93
- auto targetName = stmt->getTargetName ();
94
- if (!targetName.empty ()) {
95
- dispatcher_.emit (BreakStmtTargetNamesTrap{label, targetName.str ().str ()});
62
+ codeql::BreakStmt StmtVisitor::translateBreakStmt (const swift::BreakStmt& stmt) {
63
+ auto entry = dispatcher_.createEntry (stmt);
64
+ entry.target = dispatcher_.fetchOptionalLabel (stmt.getTarget ());
65
+ if (auto targetName = stmt.getTargetName (); !targetName.empty ()) {
66
+ entry.target_name = targetName.str ().str ();
96
67
}
68
+ return entry;
97
69
}
98
70
99
- void StmtVisitor::visitContinueStmt (swift::ContinueStmt* stmt) {
100
- auto label = dispatcher_.assignNewLabel (stmt);
101
- dispatcher_.emit (ContinueStmtsTrap{label});
102
- if (auto * target = stmt->getTarget ()) {
103
- auto targetlabel = dispatcher_.fetchLabel (target);
104
- dispatcher_.emit (ContinueStmtTargetsTrap{label, targetlabel});
105
- }
106
- auto targetName = stmt->getTargetName ();
107
- if (!targetName.empty ()) {
108
- dispatcher_.emit (ContinueStmtTargetNamesTrap{label, targetName.str ().str ()});
71
+ codeql::ContinueStmt StmtVisitor::translateContinueStmt (const swift::ContinueStmt& stmt) {
72
+ auto entry = dispatcher_.createEntry (stmt);
73
+ entry.target = dispatcher_.fetchOptionalLabel (stmt.getTarget ());
74
+ if (auto targetName = stmt.getTargetName (); !targetName.empty ()) {
75
+ entry.target_name = targetName.str ().str ();
109
76
}
77
+ return entry;
110
78
}
111
79
112
- void StmtVisitor::visitWhileStmt ( swift::WhileStmt* stmt) {
113
- auto label = dispatcher_.assignNewLabel (stmt);
114
- emitLabeledStmt (stmt, label );
115
- emitLabeledConditionalStmt (stmt, label );
116
- dispatcher_. emit (WhileStmtsTrap{label, dispatcher_. fetchLabel (stmt-> getBody ())}) ;
80
+ codeql::WhileStmt StmtVisitor::translateWhileStmt ( const swift::WhileStmt& stmt) {
81
+ auto entry = dispatcher_.createEntry (stmt);
82
+ fillLabeledConditionalStmt (stmt, entry );
83
+ entry. body = dispatcher_. fetchLabel (stmt. getBody () );
84
+ return entry ;
117
85
}
118
86
119
- void StmtVisitor::visitRepeatWhileStmt ( swift::RepeatWhileStmt* stmt) {
120
- auto label = dispatcher_.assignNewLabel (stmt);
121
- emitLabeledStmt (stmt, label );
122
- auto bodyLabel = dispatcher_.fetchLabel (stmt-> getBody ());
123
- auto condLabel = dispatcher_.fetchLabel (stmt-> getCond ());
124
- dispatcher_. emit (RepeatWhileStmtsTrap{label, condLabel, bodyLabel}) ;
87
+ codeql::RepeatWhileStmt StmtVisitor::translateRepeatWhileStmt ( const swift::RepeatWhileStmt& stmt) {
88
+ auto entry = dispatcher_.createEntry (stmt);
89
+ fillLabeledStmt (stmt, entry );
90
+ entry. body = dispatcher_.fetchLabel (stmt. getBody ());
91
+ entry. condition = dispatcher_.fetchLabel (stmt. getCond ());
92
+ return entry ;
125
93
}
126
94
127
- void StmtVisitor::visitDoCatchStmt (swift::DoCatchStmt* stmt) {
128
- auto label = dispatcher_.assignNewLabel (stmt);
129
- emitLabeledStmt (stmt, label);
130
- auto bodyLabel = dispatcher_.fetchLabel (stmt->getBody ());
131
- dispatcher_.emit (DoCatchStmtsTrap{label, bodyLabel});
132
- auto i = 0u ;
133
- for (auto * stmtCatch : stmt->getCatches ()) {
134
- dispatcher_.emit (DoCatchStmtCatchesTrap{label, i++, dispatcher_.fetchLabel (stmtCatch)});
135
- }
95
+ codeql::DoCatchStmt StmtVisitor::translateDoCatchStmt (const swift::DoCatchStmt& stmt) {
96
+ auto entry = dispatcher_.createEntry (stmt);
97
+ fillLabeledStmt (stmt, entry);
98
+ entry.body = dispatcher_.fetchLabel (stmt.getBody ());
99
+ entry.catches = dispatcher_.fetchRepeatedLabels (stmt.getCatches ());
100
+ return entry;
136
101
}
137
102
138
- void StmtVisitor::visitCaseStmt (swift::CaseStmt* stmt) {
139
- auto label = dispatcher_.assignNewLabel (stmt);
140
- auto bodyLabel = dispatcher_.fetchLabel (stmt->getBody ());
141
- dispatcher_.emit (CaseStmtsTrap{label, bodyLabel});
142
- auto i = 0u ;
143
- for (auto & item : stmt->getMutableCaseLabelItems ()) {
144
- dispatcher_.emit (CaseStmtLabelsTrap{label, i++, dispatcher_.fetchLabel (&item)});
145
- }
146
- if (stmt->hasCaseBodyVariables ()) {
147
- auto i = 0u ;
148
- for (auto * var : stmt->getCaseBodyVariables ()) {
149
- dispatcher_.emit (CaseStmtVariablesTrap{label, i++, dispatcher_.fetchLabel (var)});
103
+ codeql::CaseStmt StmtVisitor::translateCaseStmt (const swift::CaseStmt& stmt) {
104
+ auto entry = dispatcher_.createEntry (stmt);
105
+ entry.body = dispatcher_.fetchLabel (stmt.getBody ());
106
+ entry.labels = dispatcher_.fetchRepeatedLabels (stmt.getCaseLabelItems ());
107
+ if (stmt.hasCaseBodyVariables ()) {
108
+ for (auto var : stmt.getCaseBodyVariables ()) {
109
+ entry.variables .push_back (dispatcher_.fetchLabel (var));
150
110
}
151
111
}
112
+ return entry;
152
113
}
153
114
154
- void StmtVisitor::visitGuardStmt (swift::GuardStmt* stmt) {
155
- auto label = dispatcher_.assignNewLabel (stmt);
156
- emitLabeledStmt (stmt, label);
157
- emitLabeledConditionalStmt (stmt, label);
158
- auto bodyLabel = dispatcher_.fetchLabel (stmt->getBody ());
159
- dispatcher_.emit (GuardStmtsTrap{label, bodyLabel});
115
+ codeql::GuardStmt StmtVisitor::translateGuardStmt (const swift::GuardStmt& stmt) {
116
+ auto entry = dispatcher_.createEntry (stmt);
117
+ fillLabeledConditionalStmt (stmt, entry);
118
+ entry.body = dispatcher_.fetchLabel (stmt.getBody ());
119
+ return entry;
160
120
}
161
121
162
- void StmtVisitor::visitThrowStmt ( swift::ThrowStmt* stmt) {
163
- auto label = dispatcher_.assignNewLabel (stmt);
164
- auto subExprLabel = dispatcher_.fetchLabel (stmt-> getSubExpr ());
165
- dispatcher_. emit (ThrowStmtsTrap{label, subExprLabel}) ;
122
+ codeql::ThrowStmt StmtVisitor::translateThrowStmt ( const swift::ThrowStmt& stmt) {
123
+ auto entry = dispatcher_.createEntry (stmt);
124
+ entry. sub_expr = dispatcher_.fetchLabel (stmt. getSubExpr ());
125
+ return entry ;
166
126
}
167
127
168
- void StmtVisitor::visitDeferStmt ( swift::DeferStmt* stmt) {
169
- auto label = dispatcher_.assignNewLabel (stmt);
170
- auto bodyLabel = dispatcher_.fetchLabel (stmt-> getBodyAsWritten ());
171
- dispatcher_. emit (DeferStmtsTrap{label, bodyLabel}) ;
128
+ codeql::DeferStmt StmtVisitor::translateDeferStmt ( const swift::DeferStmt& stmt) {
129
+ auto entry = dispatcher_.createEntry (stmt);
130
+ entry. body = dispatcher_.fetchLabel (stmt. getBodyAsWritten ());
131
+ return entry ;
172
132
}
173
133
174
- void StmtVisitor::visitDoStmt ( swift::DoStmt* stmt) {
175
- auto label = dispatcher_.assignNewLabel (stmt);
176
- emitLabeledStmt (stmt, label );
177
- auto bodyLabel = dispatcher_.fetchLabel (stmt-> getBody ());
178
- dispatcher_. emit (DoStmtsTrap{label, bodyLabel}) ;
134
+ codeql::DoStmt StmtVisitor::translateDoStmt ( const swift::DoStmt& stmt) {
135
+ auto entry = dispatcher_.createEntry (stmt);
136
+ fillLabeledStmt (stmt, entry );
137
+ entry. body = dispatcher_.fetchLabel (stmt. getBody ());
138
+ return entry ;
179
139
}
180
140
181
- void StmtVisitor::visitSwitchStmt (swift::SwitchStmt* stmt) {
182
- auto label = dispatcher_.assignNewLabel (stmt);
183
- emitLabeledStmt (stmt, label);
184
- auto subjectLabel = dispatcher_.fetchLabel (stmt->getSubjectExpr ());
185
- dispatcher_.emit (SwitchStmtsTrap{label, subjectLabel});
186
- auto i = 0u ;
187
- for (auto * c : stmt->getCases ()) {
188
- dispatcher_.emit (SwitchStmtCasesTrap{label, i++, dispatcher_.fetchLabel (c)});
189
- }
141
+ codeql::SwitchStmt StmtVisitor::translateSwitchStmt (const swift::SwitchStmt& stmt) {
142
+ auto entry = dispatcher_.createEntry (stmt);
143
+ fillLabeledStmt (stmt, entry);
144
+ entry.expr = dispatcher_.fetchLabel (stmt.getSubjectExpr ());
145
+ entry.cases = dispatcher_.fetchRepeatedLabels (stmt.getCases ());
146
+ return entry;
190
147
}
191
148
192
- void StmtVisitor::visitFallthroughStmt ( swift::FallthroughStmt* stmt) {
193
- auto label = dispatcher_.assignNewLabel (stmt);
194
- auto sourceLabel = dispatcher_.fetchLabel (stmt-> getFallthroughSource ());
195
- auto destLabel = dispatcher_.fetchLabel (stmt-> getFallthroughDest ());
196
- dispatcher_. emit (FallthroughStmtsTrap{label, sourceLabel, destLabel}) ;
149
+ codeql::FallthroughStmt StmtVisitor::translateFallthroughStmt ( const swift::FallthroughStmt& stmt) {
150
+ auto entry = dispatcher_.createEntry (stmt);
151
+ entry. fallthrough_source = dispatcher_.fetchLabel (stmt. getFallthroughSource ());
152
+ entry. fallthrough_dest = dispatcher_.fetchLabel (stmt. getFallthroughDest ());
153
+ return entry ;
197
154
}
198
155
199
- void StmtVisitor::visitYieldStmt (swift::YieldStmt* stmt) {
200
- auto label = dispatcher_.assignNewLabel (stmt);
201
- dispatcher_.emit (YieldStmtsTrap{label});
202
- auto i = 0u ;
203
- for (auto * expr : stmt->getYields ()) {
204
- auto exprLabel = dispatcher_.fetchLabel (expr);
205
- dispatcher_.emit (YieldStmtResultsTrap{label, i++, exprLabel});
206
- }
156
+ codeql::YieldStmt StmtVisitor::translateYieldStmt (const swift::YieldStmt& stmt) {
157
+ auto entry = dispatcher_.createEntry (stmt);
158
+ entry.results = dispatcher_.fetchRepeatedLabels (stmt.getYields ());
159
+ return entry;
207
160
}
208
161
209
- void StmtVisitor::emitLabeledStmt (const swift::LabeledStmt* stmt, TrapLabel<LabeledStmtTag> label ) {
210
- if (stmt-> getLabelInfo ()) {
211
- dispatcher_. emit (LabeledStmtLabelsTrap{ label, stmt-> getLabelInfo () .Name .str ().str ()} );
162
+ void StmtVisitor::fillLabeledStmt (const swift::LabeledStmt& stmt, codeql::LabeledStmt& entry ) {
163
+ if (auto info = stmt. getLabelInfo ()) {
164
+ entry. label = info .Name .str ().str ();
212
165
}
213
166
}
214
167
215
- void StmtVisitor::emitLabeledConditionalStmt (swift::LabeledConditionalStmt* stmt,
216
- TrapLabel<LabeledConditionalStmtTag> label) {
217
- auto condLabel = dispatcher_.fetchLabel (stmt->getCondPointer ());
218
- dispatcher_.emit (LabeledConditionalStmtsTrap{label, condLabel});
168
+ void StmtVisitor::fillLabeledConditionalStmt (const swift::LabeledConditionalStmt& stmt,
169
+ codeql::LabeledConditionalStmt& entry) {
170
+ // getCondPointer not provided for const stmt by swift...
171
+ entry.condition =
172
+ dispatcher_.fetchLabel (const_cast <swift::LabeledConditionalStmt&>(stmt).getCondPointer ());
173
+ fillLabeledStmt (stmt, entry);
219
174
}
220
175
221
176
} // namespace codeql
0 commit comments