@@ -1092,6 +1092,10 @@ class PreCheckTarget final : public ASTWalker {
1092
1092
// / Pull some operator expressions into the optional chain.
1093
1093
OptionalEvaluationExpr *hoistOptionalEvaluationExprIfNeeded (Expr *E);
1094
1094
1095
+ // / Wrap an unresolved member or optional bind chain in an
1096
+ // / UnresolvedMemberChainResultExpr or OptionalEvaluationExpr respectively.
1097
+ Expr *wrapMemberChainIfNeeded (Expr *E);
1098
+
1095
1099
// / Whether the given expression "looks like" a (possibly sugared) type. For
1096
1100
// / example, `(foo, bar)` "looks like" a type, but `foo + bar` does not.
1097
1101
bool exprLooksLikeAType (Expr *expr);
@@ -1464,24 +1468,8 @@ class PreCheckTarget final : public ASTWalker {
1464
1468
return Action::Continue (OEE);
1465
1469
}
1466
1470
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
+
1485
1473
return Action::Continue (expr);
1486
1474
}
1487
1475
@@ -2688,6 +2676,27 @@ PreCheckTarget::hoistOptionalEvaluationExprIfNeeded(Expr *expr) {
2688
2676
return nullptr ;
2689
2677
}
2690
2678
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
+
2691
2700
bool ConstraintSystem::preCheckTarget (SyntacticElementTarget &target) {
2692
2701
auto *DC = target.getDeclContext ();
2693
2702
auto &ctx = DC->getASTContext ();
0 commit comments