summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2026-02-26 20:09:33 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2026-03-30 22:14:09 +0900
commitae9b60f18999479640b5b945b76cd74f124c172d (patch)
tree6b66b8f5b583e2bca13dcc27ba79a85efa2b30ae /parse.y
parent5b83468b86c5467281b3c39d7349bee486787a8c (diff)
[Feature #19107] parse.y: Allow trailing comma in method signature
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y60
1 files changed, 30 insertions, 30 deletions
diff --git a/parse.y b/parse.y
index bcff7918bf..170ed08a5e 100644
--- a/parse.y
+++ b/parse.y
@@ -2773,7 +2773,7 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
%type <node> if_tail opt_else case_body case_args cases opt_rescue exc_list exc_var opt_ensure
%type <node> args arg_splat call_args opt_call_args
%type <node> paren_args opt_paren_args
-%type <node_args> args_tail block_args_tail block_args-opt_tail
+%type <node_args> args_tail block_args_tail
%type <node> command_args aref_args
%type <node_block_pass> opt_block_arg block_arg
%type <node> var_ref var_lhs
@@ -2798,7 +2798,7 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
%type <node> p_value p_primitive p_variable p_var_ref p_expr_ref p_const
%type <node> p_kwargs p_kwarg p_kw
%type <id> keyword_variable user_variable sym operation2 operation3
-%type <id> cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_bad_arg
+%type <id> cname fname op f_rest_arg f_block_arg opt_comma f_norm_arg f_bad_arg
%type <id> f_kwrest f_label f_arg_asgn call_op call_op2 reswords relop dot_or_colon
%type <id> p_kwrest p_kwnorest p_any_kwrest p_kw_label
%type <id> f_no_kwarg f_any_kwrest args_forward excessed_comma nonlocal_var def_name
@@ -2923,18 +2923,18 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
}
;
-%rule args_tail_basic(value) <node_args>
- : f_kwarg(value) ',' f_kwrest opt_f_block_arg
+%rule args_tail_basic(value, trailing) <node_args>
+ : f_kwarg(value) ',' f_kwrest opt_f_block_arg(trailing)
{
$$ = new_args_tail(p, $1, $3, $4, &@3);
/*% ripper: [$:1, $:3, $:4] %*/
}
- | f_kwarg(value) opt_f_block_arg
+ | f_kwarg(value) opt_f_block_arg(trailing)
{
$$ = new_args_tail(p, $1, 0, $2, &@1);
/*% ripper: [$:1, Qnil, $:2] %*/
}
- | f_any_kwrest opt_f_block_arg
+ | f_any_kwrest opt_f_block_arg(trailing)
{
$$ = new_args_tail(p, 0, $1, $2, &@1);
/*% ripper: [Qnil, $:1, $:2] %*/
@@ -2946,6 +2946,15 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
}
;
+%rule opt_f_block_arg(trailing) <id>
+ : ',' f_block_arg
+ {
+ $$ = $2;
+ /*% ripper: $:2 %*/
+ }
+ | trailing
+ ;
+
%rule def_endless_method(bodystmt) <node>
: defn_head[head] f_opt_paren_args[args] '=' bodystmt
{
@@ -3087,13 +3096,13 @@ rb_parser_ary_free(rb_parser_t *p, rb_parser_ary_t *ary)
}
;
-%rule opt_args_tail(tail) <node_args>
+%rule opt_args_tail(tail, trailing) <node_args>
: ',' tail
{
$$ = $tail;
/*% ripper: $:tail %*/
}
- | /* none */
+ | trailing
{
$$ = new_empty_args_tail(p, &@$);
/*% ripper: [Qnil, Qnil, Qnil] %*/
@@ -4973,10 +4982,7 @@ f_any_kwrest : f_kwrest
f_eq : {p->ctxt.in_argdef = 0;} '=';
-block_args_tail : args_tail_basic(primary_value)
- ;
-
-block_args-opt_tail : opt_args_tail(block_args_tail)
+block_args_tail : args_tail_basic(primary_value, none)
;
excessed_comma : ','
@@ -4987,14 +4993,14 @@ excessed_comma : ','
}
;
-block_param : args-list(primary_value, block_args-opt_tail)
+block_param : args-list(primary_value, opt_args_tail(block_args_tail, none))
| f_arg[pre] excessed_comma
{
$$ = new_empty_args_tail(p, &@excessed_comma);
$$ = new_args(p, $pre, 0, $excessed_comma, 0, $$, &@$);
/*% ripper: params!($:pre, Qnil, $:excessed_comma, Qnil, Qnil, Qnil, Qnil) %*/
}
- | f_arg[pre] opt_args_tail(block_args_tail)[tail]
+ | f_arg[pre] opt_args_tail(block_args_tail, none)[tail]
{
$$ = new_args(p, $pre, 0, 0, 0, $tail, &@$);
/*% ripper: params!($:pre, Qnil, Qnil, Qnil, *$:tail[0..2]) %*/
@@ -6240,7 +6246,7 @@ f_arglist : f_paren_args
}
;
-args_tail : args_tail_basic(arg_value)
+args_tail : args_tail_basic(arg_value, opt_comma)
| args_forward
{
add_forwarding_args(p);
@@ -6250,7 +6256,7 @@ args_tail : args_tail_basic(arg_value)
}
;
-largs_tail : args_tail_basic(arg_value)
+largs_tail : args_tail_basic(arg_value, none)
| args_forward
{
yyerror1(&@args_forward, "unexpected ... in lambda argument");
@@ -6331,14 +6337,9 @@ largs_tail : args_tail_basic(arg_value)
}
;
-%rule f_args-opt_tail(tail) <node_args>
- : opt_args_tail(tail)
- ;
-
-
-%rule f_args-list(tail) <node_args>
- : args-list(arg_value, f_args-opt_tail(tail))
- | f_arg[pre] opt_args_tail(tail)[tail]
+%rule f_args-list(tail, trailing) <node_args>
+ : args-list(arg_value, opt_args_tail(tail, trailing))
+ | f_arg[pre] opt_args_tail(tail, trailing)[tail]
{
$$ = new_args(p, $pre, 0, 0, 0, $tail, &@$);
/*% ripper: params!($:pre, Qnil, Qnil, Qnil, *$:tail[0..2]) %*/
@@ -6347,10 +6348,10 @@ largs_tail : args_tail_basic(arg_value)
| f_empty_arg
;
-f_args : f_args-list(args_tail)
+f_args : f_args-list(args_tail, opt_comma)
;
-f_largs : f_args-list(largs_tail)
+f_largs : f_args-list(largs_tail, none)
;
args_forward : tBDOT3
@@ -6538,12 +6539,11 @@ f_block_arg : blkarg_mark tIDENTIFIER
}
;
-opt_f_block_arg : ',' f_block_arg
+opt_comma : ','?
{
- $$ = $2;
- /*% ripper: $:2 %*/
+ $$ = 0;
+ /*% ripper: Qnil %*/
}
- | none
;