@@ -5558,6 +5558,24 @@ pm_nil_node_create(pm_parser_t *parser, const pm_token_t *token) {
55585558 return node;
55595559}
55605560
5561+ /**
5562+ * Allocate and initialize a new NoKeywordsParameterNode node.
5563+ */
5564+ static pm_no_block_parameter_node_t *
5565+ pm_no_block_parameter_node_create(pm_parser_t *parser, const pm_token_t *operator, const pm_token_t *keyword) {
5566+ assert(operator->type == PM_TOKEN_AMPERSAND || operator->type == PM_TOKEN_UAMPERSAND);
5567+ assert(keyword->type == PM_TOKEN_KEYWORD_NIL);
5568+ pm_no_block_parameter_node_t *node = PM_NODE_ALLOC(parser, pm_no_block_parameter_node_t);
5569+
5570+ *node = (pm_no_block_parameter_node_t) {
5571+ .base = PM_NODE_INIT(parser, PM_NO_BLOCK_PARAMETER_NODE, 0, PM_LOCATION_INIT_TOKENS(parser, operator, keyword)),
5572+ .operator_loc = TOK2LOC(parser, operator),
5573+ .keyword_loc = TOK2LOC(parser, keyword)
5574+ };
5575+
5576+ return node;
5577+ }
5578+
55615579/**
55625580 * Allocate and initialize a new NoKeywordsParameterNode node.
55635581 */
@@ -5787,9 +5805,9 @@ pm_parameters_node_keyword_rest_set(pm_parameters_node_t *params, pm_node_t *par
57875805 * Set the block parameter on a ParametersNode node.
57885806 */
57895807static void
5790- pm_parameters_node_block_set(pm_parameters_node_t *params, pm_block_parameter_node_t *param) {
5808+ pm_parameters_node_block_set(pm_parameters_node_t *params, pm_node_t *param) {
57915809 assert(params->block == NULL);
5792- pm_parameters_node_location_set(params, UP( param) );
5810+ pm_parameters_node_location_set(params, param);
57935811 params->block = param;
57945812}
57955813
@@ -13929,26 +13947,33 @@ parse_parameters(
1392913947 parser_lex(parser);
1393013948
1393113949 pm_token_t operator = parser->previous;
13932- pm_token_t name = { 0 } ;
13950+ pm_node_t *param ;
1393313951
13934- bool repeated = false;
13935- if (accept1(parser, PM_TOKEN_IDENTIFIER)) {
13936- name = parser->previous;
13937- repeated = pm_parser_parameter_name_check(parser, &name);
13938- pm_parser_local_add_token(parser, &name, 1);
13952+ if (accept1(parser, PM_TOKEN_KEYWORD_NIL)) {
13953+ param = (pm_node_t *) pm_no_block_parameter_node_create(parser, &operator, &parser->previous);
1393913954 } else {
13940- parser->current_scope->parameters |= PM_SCOPE_PARAMETERS_FORWARDING_BLOCK;
13941- }
13955+ pm_token_t name = {0};
1394213956
13943- pm_block_parameter_node_t *param = pm_block_parameter_node_create(parser, NTOK2PTR(name), &operator);
13944- if (repeated) {
13945- pm_node_flag_set_repeated_parameter(UP(param));
13957+ bool repeated = false;
13958+ if (accept1(parser, PM_TOKEN_IDENTIFIER)) {
13959+ name = parser->previous;
13960+ repeated = pm_parser_parameter_name_check(parser, &name);
13961+ pm_parser_local_add_token(parser, &name, 1);
13962+ } else {
13963+ parser->current_scope->parameters |= PM_SCOPE_PARAMETERS_FORWARDING_BLOCK;
13964+ }
13965+
13966+ param = (pm_node_t *) pm_block_parameter_node_create(parser, NTOK2PTR(name), &operator);
13967+ if (repeated) {
13968+ pm_node_flag_set_repeated_parameter(param);
13969+ }
1394613970 }
13971+
1394713972 if (params->block == NULL) {
1394813973 pm_parameters_node_block_set(params, param);
1394913974 } else {
13950- pm_parser_err_node(parser, UP( param) , PM_ERR_PARAMETER_BLOCK_MULTI);
13951- pm_parameters_node_posts_append(params, UP( param) );
13975+ pm_parser_err_node(parser, param, PM_ERR_PARAMETER_BLOCK_MULTI);
13976+ pm_parameters_node_posts_append(params, param);
1395213977 }
1395313978
1395413979 break;
0 commit comments