@@ -246,14 +246,23 @@ static SemaReferenceKind getReferenceKind(Expr *Parent, Expr *E) {
246
246
std::pair<bool , Expr *> SemaAnnotator::walkToExprPre (Expr *E) {
247
247
assert (E);
248
248
249
+ std::pair<bool , Expr *> stopTraversal = { false , nullptr };
250
+ std::pair<bool , Expr *> skipChildren = { false , E };
251
+
252
+ auto doSkipChildren = [&]() -> std::pair<bool , Expr *> {
253
+ if (!SEWalker.walkToExprPost (E))
254
+ return stopTraversal;
255
+ return skipChildren;
256
+ };
257
+
249
258
if (isDone ())
250
- return { false , nullptr } ;
259
+ return stopTraversal ;
251
260
252
261
if (ExprsToSkip.count (E) != 0 )
253
- return { false , E } ;
262
+ return skipChildren ;
254
263
255
264
if (!SEWalker.walkToExprPre (E))
256
- return { false , E } ;
265
+ return skipChildren ;
257
266
258
267
if (auto *CtorRefE = dyn_cast<ConstructorRefCallExpr>(E))
259
268
CtorRefs.push_back (CtorRefE);
@@ -262,11 +271,10 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
262
271
if (auto *SubExpr = ACE->getUnwrappedCurryThunkExpr ()) {
263
272
if (auto *DRE = dyn_cast<DeclRefExpr>(SubExpr)) {
264
273
if (!passReference (DRE->getDecl (), DRE->getType (),
265
- DRE->getNameLoc (),
266
- ReferenceMetaData (getReferenceKind (Parent.getAsExpr (), DRE),
267
- OpAccess))) {
268
- return { false , nullptr };
269
- }
274
+ DRE->getNameLoc (),
275
+ ReferenceMetaData (getReferenceKind (Parent.getAsExpr (), DRE),
276
+ OpAccess)))
277
+ return stopTraversal;
270
278
271
279
return { true , E };
272
280
}
@@ -300,12 +308,12 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
300
308
if (auto *module = dyn_cast<ModuleDecl>(DRE->getDecl ())) {
301
309
if (!passReference (ModuleEntity (module ),
302
310
{module ->getName (), E->getLoc ()}))
303
- return { false , nullptr } ;
311
+ return stopTraversal ;
304
312
} else if (!passReference (DRE->getDecl (), DRE->getType (),
305
313
DRE->getNameLoc (),
306
314
ReferenceMetaData (getReferenceKind (Parent.getAsExpr (), DRE),
307
315
OpAccess))) {
308
- return { false , nullptr } ;
316
+ return stopTraversal ;
309
317
}
310
318
} else if (auto *MRE = dyn_cast<MemberRefExpr>(E)) {
311
319
{
@@ -324,31 +332,29 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
324
332
325
333
// Visit in source order.
326
334
if (!MRE->getBase ()->walk (*this ))
327
- return { false , nullptr } ;
335
+ return stopTraversal ;
328
336
}
329
337
330
338
if (!passReference (MRE->getMember ().getDecl (), MRE->getType (),
331
339
MRE->getNameLoc (),
332
340
ReferenceMetaData (SemaReferenceKind::DeclMemberRef,
333
341
OpAccess)))
334
- return { false , nullptr } ;
342
+ return stopTraversal ;
335
343
336
344
// We already visited the children.
337
- if (!walkToExprPost (E))
338
- return { false , nullptr };
339
- return { false , E };
345
+ return doSkipChildren ();
340
346
341
347
} else if (auto OtherCtorE = dyn_cast<OtherConstructorDeclRefExpr>(E)) {
342
348
if (!passReference (OtherCtorE->getDecl (), OtherCtorE->getType (),
343
349
OtherCtorE->getConstructorLoc (),
344
350
ReferenceMetaData (SemaReferenceKind::DeclConstructorRef,
345
351
OpAccess)))
346
- return { false , nullptr } ;
352
+ return stopTraversal ;
347
353
348
354
} else if (auto *SE = dyn_cast<SubscriptExpr>(E)) {
349
355
// Visit in source order.
350
356
if (!SE->getBase ()->walk (*this ))
351
- return { false , nullptr } ;
357
+ return stopTraversal ;
352
358
353
359
ValueDecl *SubscrD = nullptr ;
354
360
if (SE->hasDecl ())
@@ -359,21 +365,19 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
359
365
360
366
if (SubscrD) {
361
367
if (!passSubscriptReference (SubscrD, E->getLoc (), data, true ))
362
- return { false , nullptr } ;
368
+ return stopTraversal ;
363
369
}
364
370
365
371
if (!SE->getIndex ()->walk (*this ))
366
- return { false , nullptr } ;
372
+ return stopTraversal ;
367
373
368
374
if (SubscrD) {
369
375
if (!passSubscriptReference (SubscrD, E->getEndLoc (), data, false ))
370
- return { false , nullptr } ;
376
+ return stopTraversal ;
371
377
}
372
378
373
379
// We already visited the children.
374
- if (!walkToExprPost (E))
375
- return { false , nullptr };
376
- return { false , E };
380
+ return doSkipChildren ();
377
381
378
382
} else if (auto *KPE = dyn_cast<KeyPathExpr>(E)) {
379
383
for (auto &component : KPE->getComponents ()) {
@@ -406,60 +410,54 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
406
410
} else if (auto *BinE = dyn_cast<BinaryExpr>(E)) {
407
411
// Visit in source order.
408
412
if (!BinE->getArg ()->getElement (0 )->walk (*this ))
409
- return { false , nullptr } ;
413
+ return stopTraversal ;
410
414
if (!BinE->getFn ()->walk (*this ))
411
- return { false , nullptr } ;
415
+ return stopTraversal ;
412
416
if (!BinE->getArg ()->getElement (1 )->walk (*this ))
413
- return { false , nullptr } ;
417
+ return stopTraversal ;
414
418
415
419
// We already visited the children.
416
- if (!walkToExprPost (E))
417
- return { false , nullptr };
418
- return { false , E };
420
+ return doSkipChildren ();
419
421
420
422
} else if (auto TupleE = dyn_cast<TupleExpr>(E)) {
421
423
if (auto CallE = dyn_cast_or_null<CallExpr>(Parent.getAsExpr ())) {
422
424
if (!passCallArgNames (CallE->getFn (), TupleE))
423
- return { false , nullptr } ;
425
+ return stopTraversal ;
424
426
}
425
427
} else if (auto IOE = dyn_cast<InOutExpr>(E)) {
426
428
llvm::SaveAndRestore<Optional<AccessKind>>
427
429
C (this ->OpAccess , AccessKind::ReadWrite);
428
430
429
431
if (!IOE->getSubExpr ()->walk (*this ))
430
- return { false , nullptr } ;
432
+ return stopTraversal ;
431
433
432
434
// We already visited the children.
433
435
if (!walkToExprPost (E))
434
- return { false , nullptr } ;
435
- return { false , E } ;
436
+ return stopTraversal ;
437
+ return skipChildren ;
436
438
} else if (auto LE = dyn_cast<LoadExpr>(E)) {
437
439
llvm::SaveAndRestore<Optional<AccessKind>>
438
440
C (this ->OpAccess , AccessKind::Read);
439
441
440
442
if (!LE->getSubExpr ()->walk (*this ))
441
- return { false , nullptr } ;
443
+ return stopTraversal ;
442
444
443
445
// We already visited the children.
444
- if (!walkToExprPost (E))
445
- return { false , nullptr };
446
- return { false , E };
446
+ return doSkipChildren ();
447
447
} else if (auto AE = dyn_cast<AssignExpr>(E)) {
448
448
{
449
449
llvm::SaveAndRestore<Optional<AccessKind>>
450
450
C (this ->OpAccess , AccessKind::Write);
451
451
452
452
if (AE->getDest () && !AE->getDest ()->walk (*this ))
453
- return { false , nullptr } ;
453
+ return stopTraversal ;
454
454
}
455
455
456
456
if (AE->getSrc () && !AE->getSrc ()->walk (*this ))
457
- return { false , nullptr } ;
457
+ return stopTraversal ;
458
458
459
459
// We already visited the children.
460
- if (!walkToExprPost (E))
461
- return { false , nullptr };
462
- return { false , E };
460
+ return doSkipChildren ();
463
461
} else if (auto OEE = dyn_cast<OpenExistentialExpr>(E)) {
464
462
// Record opaque value.
465
463
OpaqueValueMap[OEE->getOpaqueValue ()] = OEE->getExistentialValue ();
@@ -468,44 +466,39 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
468
466
};
469
467
470
468
if (!OEE->getSubExpr ()->walk (*this ))
471
- return { false , nullptr };
472
- if (!walkToExprPost (E))
473
- return { false , nullptr };
474
- return { false , E };
469
+ return stopTraversal;
470
+
471
+ return doSkipChildren ();
475
472
} else if (auto MTEE = dyn_cast<MakeTemporarilyEscapableExpr>(E)) {
476
473
// Manually walk to original arguments in order. We don't handle
477
474
// OpaqueValueExpr here.
478
475
479
476
// Original non-escaping closure.
480
477
if (!MTEE->getNonescapingClosureValue ()->walk (*this ))
481
- return { false , nullptr } ;
478
+ return stopTraversal ;
482
479
483
480
// Body, which is called by synthesized CallExpr.
484
481
auto *callExpr = cast<CallExpr>(MTEE->getSubExpr ());
485
482
if (!callExpr->getFn ()->walk (*this ))
486
- return { false , nullptr } ;
483
+ return stopTraversal ;
487
484
488
- if (!walkToExprPost (E))
489
- return { false , nullptr };
490
- return { false , E };
485
+ return doSkipChildren ();
491
486
} else if (auto CUCE = dyn_cast<CollectionUpcastConversionExpr>(E)) {
492
487
// Ignore conversion expressions. We don't handle OpaqueValueExpr here
493
488
// because it's only in conversion expressions. Instead, just walk into
494
489
// sub expression.
495
490
if (!CUCE->getSubExpr ()->walk (*this ))
496
- return { false , nullptr };
497
- if (!walkToExprPost (E))
498
- return { false , nullptr };
499
- return { false , E };
491
+ return stopTraversal;
492
+
493
+ return doSkipChildren ();
500
494
} else if (auto OVE = dyn_cast<OpaqueValueExpr>(E)) {
501
495
// Walk into mapped value.
502
496
auto value = OpaqueValueMap.find (OVE);
503
497
if (value != OpaqueValueMap.end ()) {
504
498
if (!value->second ->walk (*this ))
505
- return { false , nullptr };
506
- if (!walkToExprPost (E))
507
- return { false , nullptr };
508
- return { false , E };
499
+ return stopTraversal;
500
+
501
+ return doSkipChildren ();
509
502
}
510
503
}
511
504
0 commit comments