Skip to content

Commit b45f70d

Browse files
committed
IDE: Clean up traversal logic in SourceEntityWalker
Try to make this a bit more self-documenting.
1 parent 4533081 commit b45f70d

File tree

1 file changed

+52
-59
lines changed

1 file changed

+52
-59
lines changed

lib/IDE/SourceEntityWalker.cpp

Lines changed: 52 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -246,14 +246,23 @@ static SemaReferenceKind getReferenceKind(Expr *Parent, Expr *E) {
246246
std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
247247
assert(E);
248248

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+
249258
if (isDone())
250-
return { false, nullptr };
259+
return stopTraversal;
251260

252261
if (ExprsToSkip.count(E) != 0)
253-
return { false, E };
262+
return skipChildren;
254263

255264
if (!SEWalker.walkToExprPre(E))
256-
return { false, E };
265+
return skipChildren;
257266

258267
if (auto *CtorRefE = dyn_cast<ConstructorRefCallExpr>(E))
259268
CtorRefs.push_back(CtorRefE);
@@ -262,11 +271,10 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
262271
if (auto *SubExpr = ACE->getUnwrappedCurryThunkExpr()) {
263272
if (auto *DRE = dyn_cast<DeclRefExpr>(SubExpr)) {
264273
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;
270278

271279
return { true, E };
272280
}
@@ -300,12 +308,12 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
300308
if (auto *module = dyn_cast<ModuleDecl>(DRE->getDecl())) {
301309
if (!passReference(ModuleEntity(module),
302310
{module->getName(), E->getLoc()}))
303-
return { false, nullptr };
311+
return stopTraversal;
304312
} else if (!passReference(DRE->getDecl(), DRE->getType(),
305313
DRE->getNameLoc(),
306314
ReferenceMetaData(getReferenceKind(Parent.getAsExpr(), DRE),
307315
OpAccess))) {
308-
return { false, nullptr };
316+
return stopTraversal;
309317
}
310318
} else if (auto *MRE = dyn_cast<MemberRefExpr>(E)) {
311319
{
@@ -324,31 +332,29 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
324332

325333
// Visit in source order.
326334
if (!MRE->getBase()->walk(*this))
327-
return { false, nullptr };
335+
return stopTraversal;
328336
}
329337

330338
if (!passReference(MRE->getMember().getDecl(), MRE->getType(),
331339
MRE->getNameLoc(),
332340
ReferenceMetaData(SemaReferenceKind::DeclMemberRef,
333341
OpAccess)))
334-
return { false, nullptr };
342+
return stopTraversal;
335343

336344
// We already visited the children.
337-
if (!walkToExprPost(E))
338-
return { false, nullptr };
339-
return { false, E };
345+
return doSkipChildren();
340346

341347
} else if (auto OtherCtorE = dyn_cast<OtherConstructorDeclRefExpr>(E)) {
342348
if (!passReference(OtherCtorE->getDecl(), OtherCtorE->getType(),
343349
OtherCtorE->getConstructorLoc(),
344350
ReferenceMetaData(SemaReferenceKind::DeclConstructorRef,
345351
OpAccess)))
346-
return { false, nullptr };
352+
return stopTraversal;
347353

348354
} else if (auto *SE = dyn_cast<SubscriptExpr>(E)) {
349355
// Visit in source order.
350356
if (!SE->getBase()->walk(*this))
351-
return { false, nullptr };
357+
return stopTraversal;
352358

353359
ValueDecl *SubscrD = nullptr;
354360
if (SE->hasDecl())
@@ -359,21 +365,19 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
359365

360366
if (SubscrD) {
361367
if (!passSubscriptReference(SubscrD, E->getLoc(), data, true))
362-
return { false, nullptr };
368+
return stopTraversal;
363369
}
364370

365371
if (!SE->getIndex()->walk(*this))
366-
return { false, nullptr };
372+
return stopTraversal;
367373

368374
if (SubscrD) {
369375
if (!passSubscriptReference(SubscrD, E->getEndLoc(), data, false))
370-
return { false, nullptr };
376+
return stopTraversal;
371377
}
372378

373379
// We already visited the children.
374-
if (!walkToExprPost(E))
375-
return { false, nullptr };
376-
return { false, E };
380+
return doSkipChildren();
377381

378382
} else if (auto *KPE = dyn_cast<KeyPathExpr>(E)) {
379383
for (auto &component : KPE->getComponents()) {
@@ -406,60 +410,54 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
406410
} else if (auto *BinE = dyn_cast<BinaryExpr>(E)) {
407411
// Visit in source order.
408412
if (!BinE->getArg()->getElement(0)->walk(*this))
409-
return { false, nullptr };
413+
return stopTraversal;
410414
if (!BinE->getFn()->walk(*this))
411-
return { false, nullptr };
415+
return stopTraversal;
412416
if (!BinE->getArg()->getElement(1)->walk(*this))
413-
return { false, nullptr };
417+
return stopTraversal;
414418

415419
// We already visited the children.
416-
if (!walkToExprPost(E))
417-
return { false, nullptr };
418-
return { false, E };
420+
return doSkipChildren();
419421

420422
} else if (auto TupleE = dyn_cast<TupleExpr>(E)) {
421423
if (auto CallE = dyn_cast_or_null<CallExpr>(Parent.getAsExpr())) {
422424
if (!passCallArgNames(CallE->getFn(), TupleE))
423-
return { false, nullptr };
425+
return stopTraversal;
424426
}
425427
} else if (auto IOE = dyn_cast<InOutExpr>(E)) {
426428
llvm::SaveAndRestore<Optional<AccessKind>>
427429
C(this->OpAccess, AccessKind::ReadWrite);
428430

429431
if (!IOE->getSubExpr()->walk(*this))
430-
return { false, nullptr };
432+
return stopTraversal;
431433

432434
// We already visited the children.
433435
if (!walkToExprPost(E))
434-
return { false, nullptr };
435-
return { false, E };
436+
return stopTraversal;
437+
return skipChildren;
436438
} else if (auto LE = dyn_cast<LoadExpr>(E)) {
437439
llvm::SaveAndRestore<Optional<AccessKind>>
438440
C(this->OpAccess, AccessKind::Read);
439441

440442
if (!LE->getSubExpr()->walk(*this))
441-
return { false, nullptr };
443+
return stopTraversal;
442444

443445
// We already visited the children.
444-
if (!walkToExprPost(E))
445-
return { false, nullptr };
446-
return { false, E };
446+
return doSkipChildren();
447447
} else if (auto AE = dyn_cast<AssignExpr>(E)) {
448448
{
449449
llvm::SaveAndRestore<Optional<AccessKind>>
450450
C(this->OpAccess, AccessKind::Write);
451451

452452
if (AE->getDest() && !AE->getDest()->walk(*this))
453-
return { false, nullptr };
453+
return stopTraversal;
454454
}
455455

456456
if (AE->getSrc() && !AE->getSrc()->walk(*this))
457-
return { false, nullptr };
457+
return stopTraversal;
458458

459459
// We already visited the children.
460-
if (!walkToExprPost(E))
461-
return { false, nullptr };
462-
return { false, E };
460+
return doSkipChildren();
463461
} else if (auto OEE = dyn_cast<OpenExistentialExpr>(E)) {
464462
// Record opaque value.
465463
OpaqueValueMap[OEE->getOpaqueValue()] = OEE->getExistentialValue();
@@ -468,44 +466,39 @@ std::pair<bool, Expr *> SemaAnnotator::walkToExprPre(Expr *E) {
468466
};
469467

470468
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();
475472
} else if (auto MTEE = dyn_cast<MakeTemporarilyEscapableExpr>(E)) {
476473
// Manually walk to original arguments in order. We don't handle
477474
// OpaqueValueExpr here.
478475

479476
// Original non-escaping closure.
480477
if (!MTEE->getNonescapingClosureValue()->walk(*this))
481-
return { false, nullptr };
478+
return stopTraversal;
482479

483480
// Body, which is called by synthesized CallExpr.
484481
auto *callExpr = cast<CallExpr>(MTEE->getSubExpr());
485482
if (!callExpr->getFn()->walk(*this))
486-
return { false, nullptr };
483+
return stopTraversal;
487484

488-
if (!walkToExprPost(E))
489-
return { false, nullptr };
490-
return { false, E };
485+
return doSkipChildren();
491486
} else if (auto CUCE = dyn_cast<CollectionUpcastConversionExpr>(E)) {
492487
// Ignore conversion expressions. We don't handle OpaqueValueExpr here
493488
// because it's only in conversion expressions. Instead, just walk into
494489
// sub expression.
495490
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();
500494
} else if (auto OVE = dyn_cast<OpaqueValueExpr>(E)) {
501495
// Walk into mapped value.
502496
auto value = OpaqueValueMap.find(OVE);
503497
if (value != OpaqueValueMap.end()) {
504498
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();
509502
}
510503
}
511504

0 commit comments

Comments
 (0)