@@ -8606,6 +8606,7 @@ static const uint32_t context_terminators[] = {
86068606 [PM_CONTEXT_BLOCK_KEYWORDS] = (1U << PM_TOKEN_KEYWORD_END) | (1U << PM_TOKEN_KEYWORD_RESCUE) | (1U << PM_TOKEN_KEYWORD_ENSURE),
86078607 [PM_CONTEXT_BLOCK_ENSURE] = (1U << PM_TOKEN_KEYWORD_END),
86088608 [PM_CONTEXT_BLOCK_ELSE] = (1U << PM_TOKEN_KEYWORD_ENSURE) | (1U << PM_TOKEN_KEYWORD_END),
8609+ [PM_CONTEXT_BLOCK_PARAMETERS] = (1U << PM_TOKEN_PIPE),
86098610 [PM_CONTEXT_BLOCK_RESCUE] = (1U << PM_TOKEN_KEYWORD_ENSURE) | (1U << PM_TOKEN_KEYWORD_RESCUE) | (1U << PM_TOKEN_KEYWORD_ELSE) | (1U << PM_TOKEN_KEYWORD_END),
86108611 [PM_CONTEXT_CASE_WHEN] = (1U << PM_TOKEN_KEYWORD_WHEN) | (1U << PM_TOKEN_KEYWORD_END) | (1U << PM_TOKEN_KEYWORD_ELSE),
86118612 [PM_CONTEXT_CASE_IN] = (1U << PM_TOKEN_KEYWORD_IN) | (1U << PM_TOKEN_KEYWORD_END) | (1U << PM_TOKEN_KEYWORD_ELSE),
@@ -8756,6 +8757,7 @@ context_human(pm_context_t context) {
87568757 case PM_CONTEXT_BEGIN: return "begin statement";
87578758 case PM_CONTEXT_BLOCK_BRACES: return "'{'..'}' block";
87588759 case PM_CONTEXT_BLOCK_KEYWORDS: return "'do'..'end' block";
8760+ case PM_CONTEXT_BLOCK_PARAMETERS: return "'|'..'|' block parameter";
87598761 case PM_CONTEXT_CASE_WHEN: return "'when' clause";
87608762 case PM_CONTEXT_CASE_IN: return "'in' clause";
87618763 case PM_CONTEXT_CLASS: return "class definition";
@@ -15357,6 +15359,9 @@ parse_block_parameters(
1535715359) {
1535815360 pm_parameters_node_t *parameters = NULL;
1535915361 if (!match1(parser, PM_TOKEN_SEMICOLON)) {
15362+ if (!is_lambda_literal) {
15363+ context_push(parser, PM_CONTEXT_BLOCK_PARAMETERS);
15364+ }
1536015365 parameters = parse_parameters(
1536115366 parser,
1536215367 is_lambda_literal ? PM_BINDING_POWER_DEFINED : PM_BINDING_POWER_INDEX,
@@ -15367,6 +15372,9 @@ parse_block_parameters(
1536715372 true,
1536815373 (uint16_t) (depth + 1)
1536915374 );
15375+ if (!is_lambda_literal) {
15376+ context_pop(parser);
15377+ }
1537015378 }
1537115379
1537215380 pm_block_parameters_node_t *block_parameters = pm_block_parameters_node_create(parser, parameters, opening);
@@ -15722,6 +15730,7 @@ parse_return(pm_parser_t *parser, pm_node_t *node) {
1572215730 case PM_CONTEXT_BLOCK_ENSURE:
1572315731 case PM_CONTEXT_BLOCK_KEYWORDS:
1572415732 case PM_CONTEXT_BLOCK_RESCUE:
15733+ case PM_CONTEXT_BLOCK_PARAMETERS:
1572515734 case PM_CONTEXT_DEF_ELSE:
1572615735 case PM_CONTEXT_DEF_ENSURE:
1572715736 case PM_CONTEXT_DEF_PARAMS:
@@ -15758,6 +15767,7 @@ parse_block_exit(pm_parser_t *parser, pm_node_t *node) {
1575815767 case PM_CONTEXT_BLOCK_KEYWORDS:
1575915768 case PM_CONTEXT_BLOCK_ELSE:
1576015769 case PM_CONTEXT_BLOCK_ENSURE:
15770+ case PM_CONTEXT_BLOCK_PARAMETERS:
1576115771 case PM_CONTEXT_BLOCK_RESCUE:
1576215772 case PM_CONTEXT_DEFINED:
1576315773 case PM_CONTEXT_FOR:
@@ -17975,6 +17985,7 @@ parse_retry(pm_parser_t *parser, const pm_node_t *node) {
1797517985 case PM_CONTEXT_BEGIN:
1797617986 case PM_CONTEXT_BLOCK_BRACES:
1797717987 case PM_CONTEXT_BLOCK_KEYWORDS:
17988+ case PM_CONTEXT_BLOCK_PARAMETERS:
1797817989 case PM_CONTEXT_CASE_IN:
1797917990 case PM_CONTEXT_CASE_WHEN:
1798017991 case PM_CONTEXT_DEFAULT_PARAMS:
@@ -18055,6 +18066,7 @@ parse_yield(pm_parser_t *parser, const pm_node_t *node) {
1805518066 case PM_CONTEXT_BLOCK_KEYWORDS:
1805618067 case PM_CONTEXT_BLOCK_ELSE:
1805718068 case PM_CONTEXT_BLOCK_ENSURE:
18069+ case PM_CONTEXT_BLOCK_PARAMETERS:
1805818070 case PM_CONTEXT_BLOCK_RESCUE:
1805918071 case PM_CONTEXT_CASE_IN:
1806018072 case PM_CONTEXT_CASE_WHEN:
@@ -19618,6 +19630,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
1961819630 if (!accept_endless_def) {
1961919631 pm_parser_err_previous(parser, PM_ERR_DEF_ENDLESS_PARAMETERS);
1962019632 }
19633+ if (
19634+ parser->current_context->context == PM_CONTEXT_DEFAULT_PARAMS &&
19635+ parser->current_context->prev->context == PM_CONTEXT_BLOCK_PARAMETERS
19636+ ) {
19637+ PM_PARSER_ERR_FORMAT(parser, def_keyword.start, parser->previous.end, PM_ERR_UNEXPECTED_PARAMETER_DEFAULT_VALUE, "endless method definition");
19638+ }
1962119639 equal = parser->previous;
1962219640
1962319641 context_push(parser, PM_CONTEXT_DEF);
0 commit comments