@@ -1007,6 +1007,18 @@ ast::ExpressionPtr Translator::desugar(pm_node_t *node, bool preserveConcreteSyn
10071007 return legacyNode->takeDesugaredExpr ();
10081008}
10091009
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+
1017+ enforceHasExpr (legacyNode);
1018+
1019+ return legacyNode->takeDesugaredExpr ();
1020+ }
1021+
10101022unique_ptr<parser::Node> Translator::translate (pm_node_t *node, bool preserveConcreteSyntax) {
10111023 if (node == nullptr )
10121024 return nullptr ;
@@ -2525,13 +2537,9 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
25252537 case PM_IF_NODE: { // An `if` statement or modifier, like `if cond; ...; end` or `a.b if cond`
25262538 auto ifNode = down_cast<pm_if_node>(node);
25272539
2528- auto predicatePreExpr = translate (ifNode->predicate );
2540+ auto predicateExpr = desugar (ifNode->predicate );
25292541 auto thenExpr = desugarStatements (ifNode->statements );
2530- auto elsePreExpr = translate (ifNode->subsequent );
2531-
2532- enforceHasExpr (predicatePreExpr, elsePreExpr);
2533- auto predicateExpr = predicatePreExpr->takeDesugaredExpr ();
2534- auto elseExpr = takeDesugaredExprOrEmptyTree (elsePreExpr);
2542+ auto elseExpr = desugarNullable (ifNode->subsequent );
25352543
25362544 auto expr = MK::If (location, move (predicateExpr), move (thenExpr), move (elseExpr));
25372545 return expr_only (move (expr));
@@ -3353,16 +3361,10 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
33533361 case PM_UNLESS_NODE: { // An `unless` branch, either in a statement or modifier form.
33543362 auto unlessNode = down_cast<pm_unless_node>(node);
33553363
3356- auto predicatePreExpr = translate (unlessNode->predicate );
3364+ auto predicateExpr = desugar (unlessNode->predicate );
33573365 // For `unless`, then/else are swapped: `statements` is the else branch, `else_clause` is the then branch
33583366 auto elseExpr = desugarStatements (unlessNode->statements );
3359- ExpressionPtr thenExpr = MK::EmptyTree ();
3360- if (unlessNode->else_clause ) {
3361- thenExpr = desugarStatements (unlessNode->else_clause ->statements );
3362- }
3363-
3364- enforceHasExpr (predicatePreExpr);
3365- auto predicateExpr = predicatePreExpr->takeDesugaredExpr ();
3367+ ExpressionPtr thenExpr = desugarNullable (up_cast (unlessNode->else_clause ));
33663368
33673369 auto expr = MK::If (location, move (predicateExpr), move (thenExpr), move (elseExpr));
33683370 return expr_only (move (expr));
0 commit comments