@@ -83,17 +83,23 @@ static void diagSyntacticUseRestrictions(const Expr *E, const DeclContext *DC,
83
83
DiagnoseWalker (const DeclContext *DC, bool isExprStmt)
84
84
: IsExprStmt(isExprStmt), Ctx(DC->getASTContext ()), DC(DC) {}
85
85
86
- // Not interested in going outside a basic expression.
87
- std::pair<bool , Stmt *> walkToStmtPre (Stmt *S) override {
88
- return { false , S };
89
- }
90
86
std::pair<bool , Pattern*> walkToPatternPre (Pattern *P) override {
91
87
return { false , P };
92
88
}
93
- bool walkToDeclPre (Decl *D) override { return false ; }
89
+
90
+ bool walkToDeclPre (Decl *D) override {
91
+ if (auto *closure = dyn_cast<ClosureExpr>(D->getDeclContext ()))
92
+ return closure->hasAppliedFunctionBuilder ();
93
+ return false ;
94
+ }
95
+
94
96
bool walkToTypeReprPre (TypeRepr *T) override { return true ; }
95
97
96
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
98
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
99
+ return expr->hasAppliedFunctionBuilder ();
100
+ }
101
+
102
+ bool shouldWalkIntoTapExpression () override { return false ; }
97
103
98
104
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
99
105
// See through implicit conversions of the expression. We want to be able
@@ -1314,7 +1320,11 @@ static void diagRecursivePropertyAccess(const Expr *E, const DeclContext *DC) {
1314
1320
cast<VarDecl>(DRE->getDecl ())->isSelfParameter ();
1315
1321
}
1316
1322
1317
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
1323
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
1324
+ return expr->hasAppliedFunctionBuilder ();
1325
+ }
1326
+
1327
+ bool shouldWalkIntoTapExpression () override { return false ; }
1318
1328
1319
1329
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
1320
1330
Expr *subExpr;
@@ -1478,10 +1488,16 @@ static void diagnoseImplicitSelfUseInClosure(const Expr *E,
1478
1488
1479
1489
// Don't walk into nested decls.
1480
1490
bool walkToDeclPre (Decl *D) override {
1491
+ if (auto *closure = dyn_cast<ClosureExpr>(D->getDeclContext ()))
1492
+ return closure->hasAppliedFunctionBuilder ();
1481
1493
return false ;
1482
1494
}
1483
1495
1484
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
1496
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
1497
+ return expr->hasAppliedFunctionBuilder ();
1498
+ }
1499
+
1500
+ bool shouldWalkIntoTapExpression () override { return false ; }
1485
1501
1486
1502
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
1487
1503
if (auto *CE = dyn_cast<AbstractClosureExpr>(E)) {
@@ -3302,7 +3318,11 @@ static void checkStmtConditionTrailingClosure(ASTContext &ctx, const Expr *E) {
3302
3318
public:
3303
3319
DiagnoseWalker (ASTContext &ctx) : Ctx(ctx) { }
3304
3320
3305
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3321
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
3322
+ return expr->hasAppliedFunctionBuilder ();
3323
+ }
3324
+
3325
+ bool shouldWalkIntoTapExpression () override { return false ; }
3306
3326
3307
3327
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
3308
3328
switch (E->getKind ()) {
@@ -3447,7 +3467,11 @@ class ObjCSelectorWalker : public ASTWalker {
3447
3467
ObjCSelectorWalker (const DeclContext *dc, Type selectorTy)
3448
3468
: Ctx(dc->getASTContext ()), DC(dc), SelectorTy(selectorTy) { }
3449
3469
3450
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
3470
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
3471
+ return expr->hasAppliedFunctionBuilder ();
3472
+ }
3473
+
3474
+ bool shouldWalkIntoTapExpression () override { return false ; }
3451
3475
3452
3476
std::pair<bool , Expr *> walkToExprPre (Expr *expr) override {
3453
3477
auto *stringLiteral = dyn_cast<StringLiteralExpr>(expr);
@@ -4164,7 +4188,11 @@ static void diagnoseUnintendedOptionalBehavior(const Expr *E,
4164
4188
}
4165
4189
}
4166
4190
4167
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
4191
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
4192
+ return expr->hasAppliedFunctionBuilder ();
4193
+ }
4194
+
4195
+ bool shouldWalkIntoTapExpression () override { return false ; }
4168
4196
4169
4197
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
4170
4198
if (!E || isa<ErrorExpr>(E) || !E->getType ())
@@ -4236,7 +4264,11 @@ static void diagnoseDeprecatedWritableKeyPath(const Expr *E,
4236
4264
}
4237
4265
}
4238
4266
4239
- bool shouldWalkIntoNonSingleExpressionClosure () override { return false ; }
4267
+ bool shouldWalkIntoNonSingleExpressionClosure (ClosureExpr *expr) override {
4268
+ return expr->hasAppliedFunctionBuilder ();
4269
+ }
4270
+
4271
+ bool shouldWalkIntoTapExpression () override { return false ; }
4240
4272
4241
4273
std::pair<bool , Expr *> walkToExprPre (Expr *E) override {
4242
4274
if (!E || isa<ErrorExpr>(E) || !E->getType ())
0 commit comments