@@ -1001,6 +1001,19 @@ pair<core::LocOffsets, core::LocOffsets> Translator::computeSendLoc(PrismNode *c
10011001ast::ExpressionPtr Translator::desugar (pm_node_t *node, bool preserveConcreteSyntax) {
10021002 auto legacyNode = translate (node, preserveConcreteSyntax);
10031003
1004+ ENFORCE (legacyNode != nullptr );
1005+ enforceHasExpr (legacyNode);
1006+
1007+ return legacyNode->takeDesugaredExpr ();
1008+ }
1009+
1010+ ast::ExpressionPtr Translator::desugarNullable (pm_node_t *node, bool preserveConcreteSyntax) {
1011+ auto legacyNode = translate (node, preserveConcreteSyntax);
1012+
1013+ if (legacyNode == nullptr ) {
1014+ return MK::EmptyTree ();
1015+ }
1016+
10041017 enforceHasExpr (legacyNode);
10051018
10061019 return legacyNode->takeDesugaredExpr ();
@@ -2524,13 +2537,9 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
25242537 case PM_IF_NODE: { // An `if` statement or modifier, like `if cond; ...; end` or `a.b if cond`
25252538 auto ifNode = down_cast<pm_if_node>(node);
25262539
2527- auto predicatePreExpr = translate (ifNode->predicate );
2540+ auto predicateExpr = desugar (ifNode->predicate );
25282541 auto thenExpr = desugarStatements (ifNode->statements );
2529- auto elsePreExpr = translate (ifNode->subsequent );
2530-
2531- enforceHasExpr (predicatePreExpr, elsePreExpr);
2532- auto predicateExpr = predicatePreExpr->takeDesugaredExpr ();
2533- auto elseExpr = takeDesugaredExprOrEmptyTree (elsePreExpr);
2542+ auto elseExpr = desugarNullable (ifNode->subsequent );
25342543
25352544 auto expr = MK::If (location, move (predicateExpr), move (thenExpr), move (elseExpr));
25362545 return expr_only (move (expr));
@@ -3352,16 +3361,10 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
33523361 case PM_UNLESS_NODE: { // An `unless` branch, either in a statement or modifier form.
33533362 auto unlessNode = down_cast<pm_unless_node>(node);
33543363
3355- auto predicatePreExpr = translate (unlessNode->predicate );
3364+ auto predicateExpr = desugar (unlessNode->predicate );
33563365 // For `unless`, then/else are swapped: `statements` is the else branch, `else_clause` is the then branch
33573366 auto elseExpr = desugarStatements (unlessNode->statements );
3358- ExpressionPtr thenExpr = MK::EmptyTree ();
3359- if (unlessNode->else_clause ) {
3360- thenExpr = desugarStatements (unlessNode->else_clause ->statements );
3361- }
3362-
3363- enforceHasExpr (predicatePreExpr);
3364- auto predicateExpr = predicatePreExpr->takeDesugaredExpr ();
3367+ ExpressionPtr thenExpr = desugarNullable (up_cast (unlessNode->else_clause ));
33653368
33663369 auto expr = MK::If (location, move (predicateExpr), move (thenExpr), move (elseExpr));
33673370 return expr_only (move (expr));
0 commit comments