Skip to content

Commit 7e797f5

Browse files
committed
Fix not binding power in endless methods
[Bug #21097] Also, parse: ``` x = a rescue b in c ``` as: ``` (x = (a rescue b)) in c ``` and: ``` def f = a rescue b in c ``` as: ``` (def f = (a rescue b)) in c ```
1 parent 0ee68f7 commit 7e797f5

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

src/prism.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19317,7 +19317,22 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, u
1931719317
}
1931819318
}
1931919319
} else {
19320-
receiver = parse_expression(parser, PM_BINDING_POWER_NOT, (flags & PM_PARSE_ACCEPTS_DO_BLOCK) | PM_PARSE_ACCEPTS_COMMAND_CALL, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
19320+
/* `not` in a single line method is allowed to be followed by
19321+
* an expression without pattern matching, that optionally is
19322+
* followed by a `rescue` modifier. */
19323+
if (flags & PM_PARSE_IN_ENDLESS_DEF) {
19324+
receiver = parse_expression(parser, PM_BINDING_POWER_MATCH + 1, (flags & PM_PARSE_ACCEPTS_DO_BLOCK) | PM_PARSE_ACCEPTS_COMMAND_CALL, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
19325+
19326+
if (accept1(parser, PM_TOKEN_KEYWORD_RESCUE_MODIFIER)) {
19327+
context_push(parser, PM_CONTEXT_RESCUE_MODIFIER);
19328+
pm_token_t rescue_keyword = parser->previous;
19329+
pm_node_t *value = parse_expression(parser, PM_BINDING_POWER_MATCH + 1, flags & PM_PARSE_ACCEPTS_DO_BLOCK, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
19330+
context_pop(parser);
19331+
receiver = UP(pm_rescue_modifier_node_create(parser, receiver, &rescue_keyword, value));
19332+
}
19333+
} else {
19334+
receiver = parse_expression(parser, PM_BINDING_POWER_NOT, (flags & PM_PARSE_ACCEPTS_DO_BLOCK) | PM_PARSE_ACCEPTS_COMMAND_CALL, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
19335+
}
1932119336
}
1932219337

1932319338
return UP(pm_call_node_not_create(parser, receiver, &message, &arguments));
@@ -20303,7 +20318,7 @@ parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_
2030320318
pm_token_t rescue = parser->current;
2030420319
parser_lex(parser);
2030520320

20306-
pm_node_t *right = parse_expression(parser, pm_binding_powers[PM_TOKEN_KEYWORD_RESCUE_MODIFIER].right, flags & PM_PARSE_ACCEPTS_DO_BLOCK, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
20321+
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MATCH + 1, flags & PM_PARSE_ACCEPTS_DO_BLOCK, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
2030720322
context_pop(parser);
2030820323

2030920324
return UP(pm_rescue_modifier_node_create(parser, value, &rescue, right));
@@ -20420,7 +20435,7 @@ parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding
2042020435
}
2042120436
}
2042220437

20423-
pm_node_t *right = parse_expression(parser, pm_binding_powers[PM_TOKEN_KEYWORD_RESCUE_MODIFIER].right, (flags & PM_PARSE_ACCEPTS_DO_BLOCK) | (accepts_command_call_inner ? PM_PARSE_ACCEPTS_COMMAND_CALL : 0), PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
20438+
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MATCH + 1, (flags & PM_PARSE_ACCEPTS_DO_BLOCK) | (accepts_command_call_inner ? PM_PARSE_ACCEPTS_COMMAND_CALL : 0), PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
2042420439
context_pop(parser);
2042520440

2042620441
return UP(pm_rescue_modifier_node_create(parser, value, &rescue, right));

0 commit comments

Comments
 (0)