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