@@ -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+
26912700bool ConstraintSystem::preCheckTarget (SyntacticElementTarget &target) {
26922701 auto *DC = target.getDeclContext ();
26932702 auto &ctx = DC->getASTContext ();
0 commit comments