Skip to content

Commit 5ae9e89

Browse files
committed
Update PM_CASE_NODE to remove whitequark parser dependencies
1 parent e062974 commit 5ae9e89

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

parser/prism/Translator.cc

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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 (isa_splat(patternExpr)) {
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

Comments
 (0)