@@ -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.
91108template <typename SorbetNode, typename ... TArgs>
92109unique_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