Skip to content

Commit 62db99f

Browse files
committed
Track parentheses in patterns
1 parent de07a5f commit 62db99f

File tree

3 files changed

+88
-52
lines changed

3 files changed

+88
-52
lines changed

lib/prism/translation/ripper.rb

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -583,13 +583,23 @@ def visit_alias_global_variable_node(node)
583583
# foo => bar | baz
584584
# ^^^^^^^^^
585585
def visit_alternation_pattern_node(node)
586-
left = visit(node.left)
587-
right = visit(node.right)
586+
left = visit_pattern_node(node.left)
587+
right = visit_pattern_node(node.right)
588588

589589
bounds(node.location)
590590
on_binary(left, :|, right)
591591
end
592592

593+
# Visit a pattern within a pattern match. This is used to bypass the
594+
# parenthesis node that can be used to wrap patterns.
595+
private def visit_pattern_node(node)
596+
if node.is_a?(ParenthesesNode)
597+
visit(node.body)
598+
else
599+
visit(node)
600+
end
601+
end
602+
593603
# a and b
594604
# ^^^^^^^
595605
def visit_and_node(node)
@@ -1952,7 +1962,7 @@ def visit_in_node(node)
19521962
# This is a special case where we're not going to call on_in directly
19531963
# because we don't have access to the consequent. Instead, we'll return
19541964
# the component parts and let the parent node handle it.
1955-
pattern = visit(node.pattern)
1965+
pattern = visit_pattern_node(node.pattern)
19561966
statements =
19571967
if node.statements.nil?
19581968
bounds(node.location)
@@ -2389,7 +2399,7 @@ def visit_match_last_line_node(node)
23892399
# ^^^^^^^^^^
23902400
def visit_match_predicate_node(node)
23912401
value = visit(node.value)
2392-
pattern = on_in(visit(node.pattern), nil, nil)
2402+
pattern = on_in(visit_pattern_node(node.pattern), nil, nil)
23932403

23942404
on_case(value, pattern)
23952405
end
@@ -2398,7 +2408,7 @@ def visit_match_predicate_node(node)
23982408
# ^^^^^^^^^^
23992409
def visit_match_required_node(node)
24002410
value = visit(node.value)
2401-
pattern = on_in(visit(node.pattern), nil, nil)
2411+
pattern = on_in(visit_pattern_node(node.pattern), nil, nil)
24022412

24032413
on_case(value, pattern)
24042414
end

src/prism.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14883,14 +14883,20 @@ parse_pattern_primitives(pm_parser_t *parser, pm_diagnostic_id_t diag_id) {
1488314883
break;
1488414884
}
1488514885
case PM_TOKEN_PARENTHESIS_LEFT: {
14886+
pm_token_t opening = parser->current;
1488614887
parser_lex(parser);
14887-
if (node != NULL) {
14888-
pm_node_destroy(parser, node);
14889-
}
14890-
node = parse_pattern(parser, false, PM_ERR_PATTERN_EXPRESSION_AFTER_PAREN);
1489114888

14889+
pm_node_t *body = parse_pattern(parser, false, PM_ERR_PATTERN_EXPRESSION_AFTER_PAREN);
1489214890
accept1(parser, PM_TOKEN_NEWLINE);
1489314891
expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_PATTERN_TERM_PAREN);
14892+
pm_node_t *right = (pm_node_t *) pm_parentheses_node_create(parser, &opening, body, &parser->previous);
14893+
14894+
if (node == NULL) {
14895+
node = right;
14896+
} else {
14897+
node = (pm_node_t *) pm_alternation_pattern_node_create(parser, node, right, &operator);
14898+
}
14899+
1489414900
break;
1489514901
}
1489614902
default: {

test/prism/snapshots/seattlerb/case_in.txt

Lines changed: 63 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)