@@ -106,8 +106,13 @@ bool SemaAnnotator::walkToDeclPre(Decl *D) {
106
106
if (isDone ())
107
107
return false ;
108
108
109
- if (shouldIgnore (D))
109
+ if (shouldIgnore (D)) {
110
+ // If we return true here, the children will still be visited, but we won't
111
+ // call walkToDeclPre on SEWalker. The corresponding walkToDeclPost call
112
+ // on SEWalker will be prevented by the check for shouldIgnore in
113
+ // walkToDeclPost in SemaAnnotator.
110
114
return isa<PatternBindingDecl>(D);
115
+ }
111
116
112
117
if (!handleCustomAttributes (D)) {
113
118
Cancelled = true ;
@@ -134,15 +139,15 @@ bool SemaAnnotator::walkToDeclPre(Decl *D) {
134
139
if (!SEWalker.visitDeclarationArgumentName (PD->getArgumentName (), Loc,
135
140
VD)) {
136
141
Cancelled = true ;
137
- return true ;
142
+ return false ;
138
143
}
139
144
}
140
- return false ;
145
+ return true ;
141
146
};
142
147
143
148
if (isa<AbstractFunctionDecl>(VD) || isa<SubscriptDecl>(VD)) {
144
149
auto ParamList = getParameterList (VD);
145
- if (ReportParamList (ParamList))
150
+ if (! ReportParamList (ParamList))
146
151
return false ;
147
152
}
148
153
} else if (auto *ED = dyn_cast<ExtensionDecl>(D)) {
@@ -208,6 +213,10 @@ bool SemaAnnotator::walkToDeclPost(Decl *D) {
208
213
}
209
214
210
215
std::pair<bool , Stmt *> SemaAnnotator::walkToStmtPre (Stmt *S) {
216
+ if (isDone ()) {
217
+ return { false , nullptr };
218
+ }
219
+
211
220
bool TraverseChildren = SEWalker.walkToStmtPre (S);
212
221
if (TraverseChildren) {
213
222
if (auto *DeferS = dyn_cast<DeferStmt>(S)) {
@@ -230,6 +239,10 @@ std::pair<bool, Stmt *> SemaAnnotator::walkToStmtPre(Stmt *S) {
230
239
}
231
240
232
241
Stmt *SemaAnnotator::walkToStmtPost (Stmt *S) {
242
+ if (isDone ()) {
243
+ return nullptr ;
244
+ }
245
+
233
246
bool Continue = SEWalker.walkToStmtPost (S);
234
247
if (!Continue)
235
248
Cancelled = true ;
@@ -247,23 +260,36 @@ static SemaReferenceKind getReferenceKind(Expr *Parent, Expr *E) {
247
260
std::pair<bool , Expr *> SemaAnnotator::walkToExprPre (Expr *E) {
248
261
assert (E);
249
262
250
- std::pair<bool , Expr *> stopTraversal = { false , nullptr };
251
- std::pair<bool , Expr *> skipChildren = { false , E };
263
+ if (isDone ()) {
264
+ return { false , nullptr };
265
+ }
252
266
253
- auto doSkipChildren = [&]() -> std::pair< bool , Expr *> {
254
- if (!SEWalker. walkToExprPost (E))
255
- return stopTraversal;
256
- return skipChildren ;
257
- };
267
+ if (ExprsToSkip. count (E) != 0 ) {
268
+ // We are skipping the expression. Call neither walkToExprPr nor
269
+ // walkToExprPost on it
270
+ return { false , E } ;
271
+ }
258
272
259
- if (isDone ())
260
- return stopTraversal;
273
+ if (!SEWalker.walkToExprPre (E)) {
274
+ return { false , E };
275
+ }
261
276
262
- if (ExprsToSkip.count (E) != 0 )
263
- return skipChildren;
277
+ auto doSkipChildren = [&]() -> std::pair<bool , Expr *> {
278
+ // If we decide to skip the children after having issued the call to
279
+ // walkToExprPre, we need to simulate a corresponding call to walkToExprPost
280
+ // which will not be issued by the ASTWalker if we return false in the first
281
+ // component.
282
+ if (!walkToExprPost (E)) {
283
+ // walkToExprPost has cancelled the traversal. Stop.
284
+ return { false , nullptr };
285
+ }
286
+ return { false , E };
287
+ };
264
288
265
- if (!SEWalker.walkToExprPre (E))
266
- return skipChildren;
289
+ auto doStopTraversal = [&]() -> std::pair<bool , Expr *> {
290
+ Cancelled = true ;
291
+ return { false , nullptr };
292
+ };
267
293
268
294
if (auto *CtorRefE = dyn_cast<ConstructorRefCallExpr>(E))
269
295
CtorRefs.push_back (CtorRefE);
@@ -275,7 +301,7 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
275
301
DRE->getNameLoc (),
276
302
ReferenceMetaData (getReferenceKind (Parent.getAsExpr (), DRE),
277
303
OpAccess)))
278
- return stopTraversal ;
304
+ return doStopTraversal () ;
279
305
280
306
return doSkipChildren ();
281
307
}
@@ -311,12 +337,12 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
311
337
if (auto *module = dyn_cast<ModuleDecl>(DRE->getDecl ())) {
312
338
if (!passReference (ModuleEntity (module ),
313
339
{module ->getName (), E->getLoc ()}))
314
- return stopTraversal ;
340
+ return doStopTraversal () ;
315
341
} else if (!passReference (DRE->getDecl (), DRE->getType (),
316
342
DRE->getNameLoc (),
317
343
ReferenceMetaData (getReferenceKind (Parent.getAsExpr (), DRE),
318
344
OpAccess))) {
319
- return stopTraversal ;
345
+ return doStopTraversal () ;
320
346
}
321
347
} else if (auto *MRE = dyn_cast<MemberRefExpr>(E)) {
322
348
{
@@ -335,14 +361,14 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
335
361
336
362
// Visit in source order.
337
363
if (!MRE->getBase ()->walk (*this ))
338
- return stopTraversal ;
364
+ return doStopTraversal () ;
339
365
}
340
366
341
367
if (!passReference (MRE->getMember ().getDecl (), MRE->getType (),
342
368
MRE->getNameLoc (),
343
369
ReferenceMetaData (SemaReferenceKind::DeclMemberRef,
344
370
OpAccess)))
345
- return stopTraversal ;
371
+ return doStopTraversal () ;
346
372
347
373
// We already visited the children.
348
374
return doSkipChildren ();
@@ -352,12 +378,12 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
352
378
OtherCtorE->getConstructorLoc (),
353
379
ReferenceMetaData (SemaReferenceKind::DeclConstructorRef,
354
380
OpAccess)))
355
- return stopTraversal ;
381
+ return doStopTraversal () ;
356
382
357
383
} else if (auto *SE = dyn_cast<SubscriptExpr>(E)) {
358
384
// Visit in source order.
359
385
if (!SE->getBase ()->walk (*this ))
360
- return stopTraversal ;
386
+ return doStopTraversal () ;
361
387
362
388
ValueDecl *SubscrD = nullptr ;
363
389
if (SE->hasDecl ())
@@ -368,15 +394,15 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
368
394
369
395
if (SubscrD) {
370
396
if (!passSubscriptReference (SubscrD, E->getLoc (), data, true ))
371
- return stopTraversal ;
397
+ return doStopTraversal () ;
372
398
}
373
399
374
400
if (!SE->getIndex ()->walk (*this ))
375
- return stopTraversal ;
401
+ return doStopTraversal () ;
376
402
377
403
if (SubscrD) {
378
404
if (!passSubscriptReference (SubscrD, E->getEndLoc (), data, false ))
379
- return stopTraversal ;
405
+ return doStopTraversal () ;
380
406
}
381
407
382
408
// We already visited the children.
@@ -414,37 +440,35 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
414
440
} else if (auto *BinE = dyn_cast<BinaryExpr>(E)) {
415
441
// Visit in source order.
416
442
if (!BinE->getArg ()->getElement (0 )->walk (*this ))
417
- return stopTraversal ;
443
+ return doStopTraversal () ;
418
444
if (!BinE->getFn ()->walk (*this ))
419
- return stopTraversal ;
445
+ return doStopTraversal () ;
420
446
if (!BinE->getArg ()->getElement (1 )->walk (*this ))
421
- return stopTraversal ;
447
+ return doStopTraversal () ;
422
448
423
449
// We already visited the children.
424
450
return doSkipChildren ();
425
451
426
452
} else if (auto TupleE = dyn_cast<TupleExpr>(E)) {
427
453
if (auto CallE = dyn_cast_or_null<CallExpr>(Parent.getAsExpr ())) {
428
454
if (!passCallArgNames (CallE->getFn (), TupleE))
429
- return stopTraversal ;
455
+ return doStopTraversal () ;
430
456
}
431
457
} else if (auto IOE = dyn_cast<InOutExpr>(E)) {
432
458
llvm::SaveAndRestore<Optional<AccessKind>>
433
459
C (this ->OpAccess , AccessKind::ReadWrite);
434
460
435
461
if (!IOE->getSubExpr ()->walk (*this ))
436
- return stopTraversal ;
462
+ return doStopTraversal () ;
437
463
438
464
// We already visited the children.
439
- if (!walkToExprPost (E))
440
- return stopTraversal;
441
- return skipChildren;
465
+ return doSkipChildren ();
442
466
} else if (auto LE = dyn_cast<LoadExpr>(E)) {
443
467
llvm::SaveAndRestore<Optional<AccessKind>>
444
468
C (this ->OpAccess , AccessKind::Read);
445
469
446
470
if (!LE->getSubExpr ()->walk (*this ))
447
- return stopTraversal ;
471
+ return doStopTraversal () ;
448
472
449
473
// We already visited the children.
450
474
return doSkipChildren ();
@@ -454,11 +478,11 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
454
478
C (this ->OpAccess , AccessKind::Write);
455
479
456
480
if (AE->getDest () && !AE->getDest ()->walk (*this ))
457
- return stopTraversal ;
481
+ return doStopTraversal () ;
458
482
}
459
483
460
484
if (AE->getSrc () && !AE->getSrc ()->walk (*this ))
461
- return stopTraversal ;
485
+ return doStopTraversal () ;
462
486
463
487
// We already visited the children.
464
488
return doSkipChildren ();
@@ -470,7 +494,7 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
470
494
};
471
495
472
496
if (!OEE->getSubExpr ()->walk (*this ))
473
- return stopTraversal ;
497
+ return doStopTraversal () ;
474
498
475
499
return doSkipChildren ();
476
500
} else if (auto MTEE = dyn_cast<MakeTemporarilyEscapableExpr>(E)) {
@@ -479,47 +503,63 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
479
503
480
504
// Original non-escaping closure.
481
505
if (!MTEE->getNonescapingClosureValue ()->walk (*this ))
482
- return stopTraversal ;
506
+ return doStopTraversal () ;
483
507
484
508
// Body, which is called by synthesized CallExpr.
485
509
auto *callExpr = cast<CallExpr>(MTEE->getSubExpr ());
486
510
if (!callExpr->getFn ()->walk (*this ))
487
- return stopTraversal ;
511
+ return doStopTraversal () ;
488
512
489
513
return doSkipChildren ();
490
514
} else if (auto CUCE = dyn_cast<CollectionUpcastConversionExpr>(E)) {
491
515
// Ignore conversion expressions. We don't handle OpaqueValueExpr here
492
516
// because it's only in conversion expressions. Instead, just walk into
493
517
// sub expression.
494
518
if (!CUCE->getSubExpr ()->walk (*this ))
495
- return stopTraversal ;
519
+ return doStopTraversal () ;
496
520
497
521
return doSkipChildren ();
498
522
} else if (auto OVE = dyn_cast<OpaqueValueExpr>(E)) {
499
523
// Walk into mapped value.
500
524
auto value = OpaqueValueMap.find (OVE);
501
525
if (value != OpaqueValueMap.end ()) {
502
526
if (!value->second ->walk (*this ))
503
- return stopTraversal ;
527
+ return doStopTraversal () ;
504
528
505
529
return doSkipChildren ();
506
530
}
507
531
} else if (auto DMRE = dyn_cast<DynamicMemberRefExpr>(E)) {
508
532
// Visit in source order.
509
533
if (!DMRE->getBase ()->walk (*this ))
510
- return stopTraversal ;
534
+ return doStopTraversal () ;
511
535
if (!passReference (DMRE->getMember ().getDecl (), DMRE->getType (),
512
536
DMRE->getNameLoc (),
513
537
ReferenceMetaData (SemaReferenceKind::DynamicMemberRef,
514
538
OpAccess)))
515
- return stopTraversal ;
539
+ return doStopTraversal () ;
516
540
// We already visited the children.
517
541
return doSkipChildren ();
518
542
}
519
543
520
544
return { true , E };
521
545
}
522
546
547
+ Expr *SemaAnnotator::walkToExprPost (Expr *E) {
548
+ if (isDone ()) {
549
+ return nullptr ;
550
+ }
551
+
552
+ if (isa<ConstructorRefCallExpr>(E)) {
553
+ assert (CtorRefs.back () == E);
554
+ CtorRefs.pop_back ();
555
+ }
556
+
557
+ bool Continue = SEWalker.walkToExprPost (E);
558
+ if (!Continue)
559
+ Cancelled = true ;
560
+ return Continue ? E : nullptr ;
561
+ }
562
+
523
563
bool SemaAnnotator::walkToTypeReprPre (TypeRepr *T) {
524
564
if (isDone ())
525
565
return false ;
@@ -538,23 +578,15 @@ bool SemaAnnotator::walkToTypeReprPre(TypeRepr *T) {
538
578
return true ;
539
579
}
540
580
541
- Expr *SemaAnnotator::walkToExprPost (Expr *E) {
542
- if (isa<ConstructorRefCallExpr>(E)) {
543
- assert (CtorRefs.back () == E);
544
- CtorRefs.pop_back ();
545
- }
546
-
547
- bool Continue = SEWalker.walkToExprPost (E);
548
- if (!Continue)
549
- Cancelled = true ;
550
- return Continue ? E : nullptr ;
551
- }
552
-
553
581
bool SemaAnnotator::walkToTypeReprPost (TypeRepr *T) {
554
582
return !isDone ();
555
583
}
556
584
557
585
std::pair<bool , Pattern *> SemaAnnotator::walkToPatternPre (Pattern *P) {
586
+ if (isDone ()) {
587
+ return { false , nullptr };
588
+ }
589
+
558
590
if (P->isImplicit ())
559
591
return { true , P };
560
592
0 commit comments