@@ -94,31 +94,37 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
94
94
}
95
95
};
96
96
97
+ LLVM_NODISCARD
97
98
Expr *visit (Expr *E) {
98
99
SetParentRAII SetParent (Walker, E);
99
100
return inherited::visit (E);
100
101
}
101
102
103
+ LLVM_NODISCARD
102
104
Stmt *visit (Stmt *S) {
103
105
SetParentRAII SetParent (Walker, S);
104
106
return inherited::visit (S);
105
107
}
106
-
108
+
109
+ LLVM_NODISCARD
107
110
Pattern *visit (Pattern *P) {
108
111
SetParentRAII SetParent (Walker, P);
109
112
return inherited::visit (P);
110
113
}
111
114
115
+ LLVM_NODISCARD
112
116
bool visit (Decl *D) {
113
117
SetParentRAII SetParent (Walker, D);
114
118
return inherited::visit (D);
115
119
}
116
-
120
+
121
+ LLVM_NODISCARD
117
122
bool visit (TypeRepr *T) {
118
123
SetParentRAII SetParent (Walker, T);
119
124
return inherited::visit (T);
120
125
}
121
-
126
+
127
+ LLVM_NODISCARD
122
128
bool visit (ParameterList *PL) {
123
129
return inherited::visit (PL);
124
130
}
@@ -127,17 +133,20 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
127
133
// Decls
128
134
// ===--------------------------------------------------------------------===//
129
135
136
+ LLVM_NODISCARD
130
137
bool visitGenericParamListIfNeeded (GenericContext *GC) {
131
138
// Must check this first in case extensions have not been bound yet
132
139
if (Walker.shouldWalkIntoGenericParams ()) {
133
140
if (auto *params = GC->getParsedGenericParams ()) {
134
- doIt (params);
141
+ if (doIt (params))
142
+ return true ;
135
143
}
136
144
return true ;
137
145
}
138
146
return false ;
139
147
}
140
148
149
+ LLVM_NODISCARD
141
150
bool visitTrailingRequirements (GenericContext *GC) {
142
151
if (const auto Where = GC->getTrailingWhereClause ()) {
143
152
for (auto &Req: Where->getRequirements ())
@@ -368,7 +377,9 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
368
377
bool visitSubscriptDecl (SubscriptDecl *SD) {
369
378
bool WalkGenerics = visitGenericParamListIfNeeded (SD);
370
379
371
- visit (SD->getIndices ());
380
+ if (visit (SD->getIndices ()))
381
+ return true ;
382
+
372
383
if (auto *const TyR = SD->getElementTypeRepr ())
373
384
if (doIt (TyR))
374
385
return true ;
@@ -399,9 +410,12 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
399
410
// accessor generics are visited from the storage decl
400
411
!isa<AccessorDecl>(AFD) && visitGenericParamListIfNeeded (AFD);
401
412
402
- if (auto *PD = AFD->getImplicitSelfDecl (/* createIfNeeded=*/ false ))
403
- visit (PD);
404
- visit (AFD->getParameters ());
413
+ if (auto *PD = AFD->getImplicitSelfDecl (/* createIfNeeded=*/ false )) {
414
+ if (visit (PD))
415
+ return true ;
416
+ }
417
+ if (visit (AFD->getParameters ()))
418
+ return true ;
405
419
406
420
if (auto *FD = dyn_cast<FuncDecl>(AFD)) {
407
421
if (!isa<AccessorDecl>(FD))
@@ -436,7 +450,8 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
436
450
437
451
bool visitEnumElementDecl (EnumElementDecl *ED) {
438
452
if (auto *PL = ED->getParameterList ()) {
439
- visit (PL);
453
+ if (visit (PL))
454
+ return true ;
440
455
}
441
456
442
457
if (auto *rawLiteralExpr = ED->getRawValueUnchecked ()) {
@@ -857,7 +872,8 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
857
872
}
858
873
859
874
Expr *visitClosureExpr (ClosureExpr *expr) {
860
- visit (expr->getParameters ());
875
+ if (visit (expr->getParameters ()))
876
+ return nullptr ;
861
877
862
878
if (expr->hasExplicitResultType ()) {
863
879
if (doIt (expr->getExplicitResultTypeRepr ()))
@@ -1249,6 +1265,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1249
1265
template <typename T>
1250
1266
using PostWalkResult = ASTWalker::PostWalkResult<T>;
1251
1267
1268
+ LLVM_NODISCARD
1252
1269
bool traverse (PreWalkAction Pre, llvm::function_ref<bool (void )> VisitChildren,
1253
1270
llvm::function_ref<PostWalkAction(void )> WalkPost) {
1254
1271
switch (Pre.Action ) {
@@ -1271,6 +1288,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1271
1288
}
1272
1289
1273
1290
template <typename T>
1291
+ LLVM_NODISCARD
1274
1292
T *traverse (PreWalkResult<T *> Pre,
1275
1293
llvm::function_ref<T *(T *)> VisitChildren,
1276
1294
llvm::function_ref<PostWalkResult<T *>(T *)> WalkPost) {
@@ -1299,6 +1317,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1299
1317
llvm_unreachable (" Unhandled case in switch!" );
1300
1318
}
1301
1319
1320
+ LLVM_NODISCARD
1302
1321
bool visitParameterList (ParameterList *PL) {
1303
1322
return traverse (
1304
1323
Walker.walkToParameterListPre (PL),
@@ -1316,13 +1335,15 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1316
1335
public:
1317
1336
Traversal (ASTWalker &walker) : Walker(walker) {}
1318
1337
1338
+ LLVM_NODISCARD
1319
1339
Expr *doIt (Expr *E) {
1320
1340
return traverse<Expr>(
1321
1341
Walker.walkToExprPre (E),
1322
1342
[&](Expr *E) { return visit (E); },
1323
1343
[&](Expr *E) { return Walker.walkToExprPost (E); });
1324
1344
}
1325
1345
1346
+ LLVM_NODISCARD
1326
1347
Stmt *doIt (Stmt *S) {
1327
1348
return traverse<Stmt>(
1328
1349
Walker.walkToStmtPre (S),
@@ -1350,6 +1371,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1350
1371
}
1351
1372
1352
1373
// / Returns true on failure.
1374
+ LLVM_NODISCARD
1353
1375
bool doIt (Decl *D) {
1354
1376
if (shouldSkip (D))
1355
1377
return false ;
@@ -1359,14 +1381,16 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1359
1381
[&]() { return visit (D); },
1360
1382
[&]() { return Walker.walkToDeclPost (D); });
1361
1383
}
1362
-
1384
+
1385
+ LLVM_NODISCARD
1363
1386
Pattern *doIt (Pattern *P) {
1364
1387
return traverse<Pattern>(
1365
1388
Walker.walkToPatternPre (P),
1366
1389
[&](Pattern *P) { return visit (P); },
1367
1390
[&](Pattern *P) { return Walker.walkToPatternPost (P); });
1368
1391
}
1369
1392
1393
+ LLVM_NODISCARD
1370
1394
bool doIt (const StmtCondition &C) {
1371
1395
for (auto &elt : C) {
1372
1396
switch (elt.getKind ()) {
@@ -1398,13 +1422,15 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1398
1422
}
1399
1423
1400
1424
// / Returns true on failure.
1425
+ LLVM_NODISCARD
1401
1426
bool doIt (TypeRepr *T) {
1402
1427
return traverse (
1403
1428
Walker.walkToTypeReprPre (T),
1404
1429
[&]() { return visit (T); },
1405
1430
[&]() { return Walker.walkToTypeReprPost (T); });
1406
1431
}
1407
-
1432
+
1433
+ LLVM_NODISCARD
1408
1434
bool doIt (RequirementRepr &Req) {
1409
1435
switch (Req.getKind ()) {
1410
1436
case RequirementReprKind::SameType:
@@ -1423,6 +1449,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1423
1449
return false ;
1424
1450
}
1425
1451
1452
+ LLVM_NODISCARD
1426
1453
bool doIt (GenericParamList *GPL) {
1427
1454
// Visit generic params
1428
1455
for (auto &P : GPL->getParams ()) {
@@ -1439,6 +1466,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1439
1466
return false ;
1440
1467
}
1441
1468
1469
+ LLVM_NODISCARD
1442
1470
ArgumentList *visit (ArgumentList *ArgList) {
1443
1471
for (auto Idx : indices (*ArgList)) {
1444
1472
auto *E = doIt (ArgList->getExpr (Idx));
@@ -1448,6 +1476,7 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*,
1448
1476
return ArgList;
1449
1477
}
1450
1478
1479
+ LLVM_NODISCARD
1451
1480
ArgumentList *doIt (ArgumentList *ArgList) {
1452
1481
return traverse<ArgumentList>(
1453
1482
Walker.walkToArgumentListPre (ArgList),
@@ -2001,12 +2030,12 @@ Pattern *Pattern::walk(ASTWalker &walker) {
2001
2030
}
2002
2031
2003
2032
TypeRepr *TypeRepr::walk (ASTWalker &walker) {
2004
- Traversal (walker).doIt (this );
2033
+ ( void ) Traversal (walker).doIt (this );
2005
2034
return this ;
2006
2035
}
2007
2036
2008
2037
StmtConditionElement *StmtConditionElement::walk (ASTWalker &walker) {
2009
- Traversal (walker).doIt (*this );
2038
+ ( void ) Traversal (walker).doIt (*this );
2010
2039
return this ;
2011
2040
}
2012
2041
0 commit comments