Skip to content

Commit fd795d0

Browse files
committed
[Sema] NFC: Factor out PreCheckTarget::wrapMemberChainIfNeeded
1 parent b719498 commit fd795d0

File tree

1 file changed

+27
-18
lines changed

1 file changed

+27
-18
lines changed

lib/Sema/PreCheckTarget.cpp

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,10 @@ class PreCheckTarget final : public ASTWalker {
10921092
/// Pull some operator expressions into the optional chain.
10931093
OptionalEvaluationExpr *hoistOptionalEvaluationExprIfNeeded(Expr *E);
10941094

1095+
/// Wrap an unresolved member or optional bind chain in an
1096+
/// UnresolvedMemberChainResultExpr or OptionalEvaluationExpr respectively.
1097+
Expr *wrapMemberChainIfNeeded(Expr *E);
1098+
10951099
/// Whether the given expression "looks like" a (possibly sugared) type. For
10961100
/// example, `(foo, bar)` "looks like" a type, but `foo + bar` does not.
10971101
bool exprLooksLikeAType(Expr *expr);
@@ -1464,24 +1468,8 @@ class PreCheckTarget final : public ASTWalker {
14641468
return Action::Continue(OEE);
14651469
}
14661470

1467-
auto *parent = Parent.getAsExpr();
1468-
if (isMemberChainTail(expr, parent)) {
1469-
Expr *wrapped = expr;
1470-
// If we find an unresolved member chain, wrap it in an
1471-
// UnresolvedMemberChainResultExpr (unless this has already been done).
1472-
if (auto *UME = TypeChecker::getUnresolvedMemberChainBase(expr)) {
1473-
if (!parent || !isa<UnresolvedMemberChainResultExpr>(parent)) {
1474-
wrapped = new (ctx) UnresolvedMemberChainResultExpr(expr, UME);
1475-
}
1476-
}
1477-
// Wrap optional chain in an OptionalEvaluationExpr.
1478-
if (isBindOptionalMemberChain(expr)) {
1479-
if (!parent || !isa<OptionalEvaluationExpr>(parent)) {
1480-
wrapped = new (ctx) OptionalEvaluationExpr(wrapped);
1481-
}
1482-
}
1483-
expr = wrapped;
1484-
}
1471+
expr = wrapMemberChainIfNeeded(expr);
1472+
14851473
return Action::Continue(expr);
14861474
}
14871475

@@ -2688,6 +2676,27 @@ PreCheckTarget::hoistOptionalEvaluationExprIfNeeded(Expr *expr) {
26882676
return nullptr;
26892677
}
26902678

2679+
Expr *PreCheckTarget::wrapMemberChainIfNeeded(Expr *E) {
2680+
auto *parent = Parent.getAsExpr();
2681+
Expr *wrapped = E;
2682+
2683+
if (!isMemberChainTail(E, parent))
2684+
return E;
2685+
2686+
// If we find an unresolved member chain, wrap it in an
2687+
// UnresolvedMemberChainResultExpr (unless this has already been done).
2688+
if (auto *UME = TypeChecker::getUnresolvedMemberChainBase(E)) {
2689+
if (!parent || !isa<UnresolvedMemberChainResultExpr>(parent))
2690+
wrapped = new (Ctx) UnresolvedMemberChainResultExpr(E, UME);
2691+
}
2692+
// Wrap optional chain in an OptionalEvaluationExpr.
2693+
if (isBindOptionalMemberChain(E)) {
2694+
if (!parent || !isa<OptionalEvaluationExpr>(parent))
2695+
wrapped = new (Ctx) OptionalEvaluationExpr(wrapped);
2696+
}
2697+
return wrapped;
2698+
}
2699+
26912700
bool ConstraintSystem::preCheckTarget(SyntacticElementTarget &target) {
26922701
auto *DC = target.getDeclContext();
26932702
auto &ctx = DC->getASTContext();

0 commit comments

Comments
 (0)