@@ -1921,21 +1921,23 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
19211921 args.emplace_back (takeDesugaredExprOrEmptyTree (predicate));
19221922 args.emplace_back (MK::Int (locZeroLen, totalPatterns));
19231923
1924- for (auto &whenNodePtr : whenNodes) {
1925- auto whenNodeWrapped = parser::NodeWithExpr::cast_node<parser::When>(whenNodePtr.get ());
1926- ENFORCE (whenNodeWrapped != nullptr , " case without a when?" );
1927- // Each pattern node already has a desugared expression (populated by translateMulti +
1928- // NodeWithExpr). Consume them now; the wrapper's placeholder expression is intentionally ignored.
1929- for (auto &patternNode : whenNodeWrapped->patterns ) {
1924+ // Extract pattern expressions directly from Prism nodes
1925+ for (auto *prismWhenPtr : prismWhenNodes) {
1926+ auto *prismWhen = down_cast<pm_when_node>(prismWhenPtr);
1927+ auto prismPatterns = absl::MakeSpan (prismWhen->conditions .nodes , prismWhen->conditions .size );
1928+
1929+ for (auto *prismPattern : prismPatterns) {
1930+ auto patternNode = translate (prismPattern);
19301931 args.emplace_back (takeDesugaredExprOrEmptyTree (patternNode));
19311932 }
19321933 }
19331934
1934- for (auto &whenNodePtr : whenNodes) {
1935- auto whenNodeWrapped = parser::NodeWithExpr::cast_node<parser::When>(whenNodePtr.get ());
1936- ENFORCE (whenNodeWrapped != nullptr , " case without a when?" );
1937- // The body node also carries a real expression once translateStatements has run.
1938- args.emplace_back (takeDesugaredExprOrEmptyTree (whenNodeWrapped->body ));
1935+ // Extract body expressions directly from Prism nodes
1936+ for (auto *prismWhenPtr : prismWhenNodes) {
1937+ auto *prismWhen = down_cast<pm_when_node>(prismWhenPtr);
1938+ auto bodyNode = translateStatements (prismWhen->statements );
1939+ auto bodyExpr = takeDesugaredExprOrEmptyTree (bodyNode);
1940+ args.emplace_back (move (bodyExpr));
19391941 }
19401942
19411943 args.emplace_back (takeDesugaredExprOrEmptyTree (elseClause));
@@ -1963,17 +1965,20 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
19631965 // building backwards
19641966 ExpressionPtr resultExpr = takeDesugaredExprOrEmptyTree (elseClause);
19651967
1966- for (auto it = whenNodes.rbegin (); it != whenNodes.rend (); ++it) {
1967- auto whenNodeWrapped = parser::NodeWithExpr::cast_node<parser::When>(it->get ());
1968- ENFORCE (whenNodeWrapped != nullptr , " case without a when?" );
1968+ // Iterate over Prism when nodes in reverse to build the if/else ladder backwards
1969+ for (auto it = prismWhenNodes.rbegin (); it != prismWhenNodes.rend (); ++it) {
1970+ auto *prismWhen = down_cast<pm_when_node>(*it);
1971+ auto whenLoc = translateLoc (prismWhen->base .location );
1972+ auto prismPatterns = absl::MakeSpan (prismWhen->conditions .nodes , prismWhen->conditions .size );
19691973
19701974 ExpressionPtr patternsResult; // the if/else ladder for this when clause's patterns
1971- for (auto &patternNode : whenNodeWrapped->patterns ) {
1975+ for (auto *prismPattern : prismPatterns) {
1976+ auto patternNode = translate (prismPattern);
19721977 auto patternExpr = takeDesugaredExprOrEmptyTree (patternNode);
19731978 auto patternLoc = patternExpr.loc ();
19741979
19751980 ExpressionPtr testExpr;
1976- if (parser::NodeWithExpr::isa_node<parser::Splat>(patternNode. get () )) {
1981+ if (PM_NODE_TYPE_P (prismPattern, PM_SPLAT_NODE )) {
19771982 // splat pattern in when clause, predicate is required, `case a when *others`
19781983 ENFORCE (hasPredicate, " splats need something to test against" );
19791984 auto local = MK::Local (predicateLoc, tempName);
@@ -2004,8 +2009,9 @@ unique_ptr<parser::Node> Translator::translate(pm_node_t *node, bool preserveCon
20042009 }
20052010 }
20062011
2007- auto thenExpr = takeDesugaredExprOrEmptyTree (whenNodeWrapped->body );
2008- resultExpr = MK::If (whenNodeWrapped->loc , move (patternsResult), move (thenExpr), move (resultExpr));
2012+ auto bodyNode = translateStatements (prismWhen->statements );
2013+ auto thenExpr = takeDesugaredExprOrEmptyTree (bodyNode);
2014+ resultExpr = MK::If (whenLoc, move (patternsResult), move (thenExpr), move (resultExpr));
20092015 }
20102016
20112017 if (hasPredicate) {
0 commit comments