Skip to content

Commit 6ecfc5b

Browse files
committed
Add desugarNullable() helper
1 parent 4a21e6c commit 6ecfc5b

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

parser/prism/Translator.cc

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
10101022
unique_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));

parser/prism/Translator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Translator final {
5656
desugarUniqueCounter(this->desugarUniqueCounterStorage) {}
5757

5858
ast::ExpressionPtr desugar(pm_node_t *node, bool preserveConcreteSyntax = false);
59+
ast::ExpressionPtr desugarNullable(pm_node_t *node, bool preserveConcreteSyntax = false);
5960

6061
// Translates the given AST from Prism's node types into the equivalent AST in Sorbet's legacy parser node types.
6162
std::unique_ptr<parser::Node> translate(pm_node_t *node, bool preserveConcreteSyntax = false);

0 commit comments

Comments
 (0)