Skip to content

Commit ee96f59

Browse files
committed
Desugar pattern matching nodes
1 parent b52108e commit ee96f59

File tree

2 files changed

+31
-25
lines changed

2 files changed

+31
-25
lines changed

ast/desugar/PrismDesugar.cc

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -541,21 +541,6 @@ void desugarPatternMatchingVars(InsSeq::STATS_store &vars, DesugarContext dctx,
541541
}
542542
}
543543

544-
// Desugar `in` and `=>` oneline pattern matching
545-
ExpressionPtr desugarOnelinePattern(DesugarContext dctx, core::LocOffsets loc, parser::Node *match) {
546-
auto matchExpr = MK::RaiseUnimplemented(loc);
547-
auto bodyExpr = MK::RaiseUnimplemented(loc);
548-
auto elseExpr = MK::EmptyTree();
549-
550-
InsSeq::STATS_store vars;
551-
desugarPatternMatchingVars(vars, dctx, match);
552-
if (!vars.empty()) {
553-
bodyExpr = MK::InsSeq(match->loc, move(vars), move(bodyExpr));
554-
}
555-
556-
return MK::If(loc, move(matchExpr), move(bodyExpr), move(elseExpr));
557-
}
558-
559544
bool locReported = false;
560545

561546
ClassDef::RHS_store scopeNodeToBody(DesugarContext dctx, unique_ptr<parser::Node> node) {
@@ -2153,14 +2138,8 @@ ExpressionPtr node2TreeImplBody(DesugarContext dctx, parser::Node *what) {
21532138
[&](parser::MatchCurLine *matchCurLine) { desugaredByPrismTranslator(matchCurLine); },
21542139
[&](parser::Redo *redo) { desugaredByPrismTranslator(redo); },
21552140
[&](parser::EncodingLiteral *encodingLiteral) { desugaredByPrismTranslator(encodingLiteral); },
2156-
[&](parser::MatchPattern *pattern) {
2157-
auto res = desugarOnelinePattern(dctx, pattern->loc, pattern->rhs.get());
2158-
result = move(res);
2159-
},
2160-
[&](parser::MatchPatternP *pattern) {
2161-
auto res = desugarOnelinePattern(dctx, pattern->loc, pattern->rhs.get());
2162-
result = move(res);
2163-
},
2141+
[&](parser::MatchPattern *pattern) { desugaredByPrismTranslator(pattern); },
2142+
[&](parser::MatchPatternP *pattern) { desugaredByPrismTranslator(pattern); },
21642143
[&](parser::EmptyElse *else_) { result = MK::EmptyTree(); },
21652144
[&](parser::ResolvedConst *resolvedConst) {
21662145
result = make_expression<ConstantLit>(resolvedConst->loc, move(resolvedConst->symbol));

parser/prism/Translator.cc

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,23 @@ static void collectPatternMatchingVars(ast::InsSeq::STATS_store &vars, parser::N
8787
}
8888
}
8989

90+
// Desugar `in` and `=>` oneline pattern matching (mirrors desugarOnelinePattern in PrismDesugar.cc)
91+
static ast::ExpressionPtr desugarOnelinePattern(core::LocOffsets loc, parser::Node *match) {
92+
auto matchExpr = MK::RaiseUnimplemented(loc);
93+
auto bodyExpr = MK::RaiseUnimplemented(loc);
94+
auto elseExpr = MK::EmptyTree();
95+
96+
ast::InsSeq::STATS_store vars;
97+
collectPatternMatchingVars(vars, match);
98+
99+
if (!vars.empty()) {
100+
auto matchLoc = match != nullptr ? match->loc : loc;
101+
bodyExpr = MK::InsSeq(matchLoc, move(vars), move(bodyExpr));
102+
}
103+
104+
return MK::If(loc, move(matchExpr), move(bodyExpr), move(elseExpr));
105+
}
106+
90107
// Allocates a new `NodeWithExpr` with a pre-computed `ExpressionPtr` AST.
91108
template <typename SorbetNode, typename... TArgs>
92109
unique_ptr<parser::Node> Translator::make_node_with_expr(ast::ExpressionPtr desugaredExpr, TArgs &&...args) const {
@@ -2912,15 +2929,25 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
29122929
auto value = patternTranslate(matchRequiredNode->value);
29132930
auto pattern = patternTranslate(matchRequiredNode->pattern);
29142931

2915-
return make_unique<parser::MatchPattern>(location, move(value), move(pattern));
2932+
if (!directlyDesugar || !hasExpr(value, pattern)) {
2933+
return make_unique<parser::MatchPattern>(location, move(value), move(pattern));
2934+
}
2935+
2936+
auto expr = desugarOnelinePattern(location, pattern.get());
2937+
return make_node_with_expr<parser::MatchPattern>(move(expr), location, move(value), move(pattern));
29162938
}
29172939
case PM_MATCH_PREDICATE_NODE: {
29182940
auto matchPredicateNode = down_cast<pm_match_predicate_node>(node);
29192941

29202942
auto value = patternTranslate(matchPredicateNode->value);
29212943
auto pattern = patternTranslate(matchPredicateNode->pattern);
29222944

2923-
return make_unique<parser::MatchPatternP>(location, move(value), move(pattern));
2945+
if (!directlyDesugar || !hasExpr(value, pattern)) {
2946+
return make_unique<parser::MatchPatternP>(location, move(value), move(pattern));
2947+
}
2948+
2949+
auto expr = desugarOnelinePattern(location, pattern.get());
2950+
return make_node_with_expr<parser::MatchPatternP>(move(expr), location, move(value), move(pattern));
29242951
}
29252952
case PM_MATCH_WRITE_NODE: { // A regex match that assigns to a local variable, like `a =~ /wat/`
29262953
auto matchWriteNode = down_cast<pm_match_write_node>(node);

0 commit comments

Comments
 (0)