@@ -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