Skip to content

Commit 2e9bf5e

Browse files
authored
Merge pull request #3445 from ruby/rescue-modifier
Fix rescue modifier precedence
2 parents 0d0f26c + 0720200 commit 2e9bf5e

File tree

3 files changed

+241
-4
lines changed

3 files changed

+241
-4
lines changed

src/prism.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -12975,7 +12975,7 @@ typedef struct {
1297512975

1297612976
pm_binding_powers_t pm_binding_powers[PM_TOKEN_MAXIMUM] = {
1297712977
// rescue
12978-
[PM_TOKEN_KEYWORD_RESCUE_MODIFIER] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_MODIFIER_RESCUE),
12978+
[PM_TOKEN_KEYWORD_RESCUE_MODIFIER] = { PM_BINDING_POWER_MODIFIER_RESCUE, PM_BINDING_POWER_COMPOSITION, true, false },
1297912979

1298012980
// if unless until while
1298112981
[PM_TOKEN_KEYWORD_IF_MODIFIER] = LEFT_ASSOCIATIVE(PM_BINDING_POWER_MODIFIER),
@@ -19480,7 +19480,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1948019480
context_push(parser, PM_CONTEXT_RESCUE_MODIFIER);
1948119481

1948219482
pm_token_t rescue_keyword = parser->previous;
19483-
pm_node_t *value = parse_expression(parser, binding_power, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
19483+
pm_node_t *value = parse_expression(parser, pm_binding_powers[PM_TOKEN_KEYWORD_RESCUE_MODIFIER].right, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
1948419484
context_pop(parser);
1948519485

1948619486
statement = (pm_node_t *) pm_rescue_modifier_node_create(parser, statement, &rescue_keyword, value);
@@ -20701,7 +20701,7 @@ parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_
2070120701
pm_token_t rescue = parser->current;
2070220702
parser_lex(parser);
2070320703

20704-
pm_node_t *right = parse_expression(parser, binding_power, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
20704+
pm_node_t *right = parse_expression(parser, pm_binding_powers[PM_TOKEN_KEYWORD_RESCUE_MODIFIER].right, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
2070520705
context_pop(parser);
2070620706

2070720707
return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right);
@@ -20807,7 +20807,7 @@ parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding
2080720807
}
2080820808
}
2080920809

20810-
pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
20810+
pm_node_t *right = parse_expression(parser, pm_binding_powers[PM_TOKEN_KEYWORD_RESCUE_MODIFIER].right, accepts_command_call_inner, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
2081120811
context_pop(parser);
2081220812

2081320813
return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right);
+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
a rescue b if c
2+
3+
a = b rescue c if d
4+
5+
a, = b rescue c if d
6+
7+
def a = b rescue c if d

test/prism/snapshots/rescue_modifier.txt

+230
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)