Skip to content

Commit 78750e9

Browse files
committed
Add desugarNullable() helper
1 parent 043efe0 commit 78750e9

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

parser/prism/Translator.cc

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,19 @@ pair<core::LocOffsets, core::LocOffsets> Translator::computeSendLoc(PrismNode *c
10011001
ast::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));

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)