summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-02-01 00:23:53 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-02-01 16:17:12 +0900
commit7b343d9c67517227843c3ac0802ac6412d547a0a (patch)
treea98a8bed9bf410a6b01a98b4787b643c58d5d611 /parse.y
parenteb8f284cf242280b2b3c4de01cf557e3eebf821b (diff)
downloadruby-7b343d9c67517227843c3ac0802ac6412d547a0a.tar.gz
Extract body rules from endless method definitions
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y100
1 files changed, 36 insertions, 64 deletions
diff --git a/parse.y b/parse.y
index feb4e72395..87a1d40f3f 100644
--- a/parse.y
+++ b/parse.y
@@ -1464,7 +1464,7 @@ static int looking_at_eol_p(struct parser_params *p);
%type <node> string_contents xstring_contents regexp_contents string_content
%type <node> words symbols symbol_list qwords qsymbols word_list qword_list qsym_list word
%type <node> literal numeric simple_numeric ssym dsym symbol cpath def_name defn_head defs_head
-%type <node> top_compstmt top_stmts top_stmt begin_block
+%type <node> top_compstmt top_stmts top_stmt begin_block endless_arg endless_command
%type <node> bodystmt compstmt stmts stmt_or_begin stmt expr arg primary command command_call method_call
%type <node> expr_value expr_value_do arg_value primary_value fcall rel_expr
%type <node> if_tail opt_else case_body case_args cases opt_rescue exc_list exc_var opt_ensure
@@ -1918,54 +1918,26 @@ command_asgn : lhs '=' lex_ctxt command_rhs
/*% %*/
/*% ripper: opassign!(field!($1, ID2VAL(idCOLON2), $3), $4, $6) %*/
}
- | defn_head f_opt_paren_args '=' command
+ | defn_head f_opt_paren_args '=' endless_command
{
endless_method_name(p, $<node>1, &@1);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
$$ = set_defun_body(p, $1, $2, $4, &@$);
/*% %*/
- /*% ripper[$4]: bodystmt!($4, Qnil, Qnil, Qnil) %*/
- /*% ripper: def!(get_value($1), $2, $4) %*/
- local_pop(p);
- }
- | defn_head f_opt_paren_args '=' command modifier_rescue arg
- {
- endless_method_name(p, $<node>1, &@1);
- restore_defun(p, $<node>1->nd_defn);
- /*%%%*/
- $4 = rescued_expr(p, $4, $6, &@4, &@5, &@6);
- $$ = set_defun_body(p, $1, $2, $4, &@$);
- /*% %*/
- /*% ripper[$4]: bodystmt!(rescue_mod!($4, $6), Qnil, Qnil, Qnil) %*/
- /*% ripper: def!(get_value($1), $2, $4) %*/
- local_pop(p);
- }
- | defs_head f_opt_paren_args '=' command
- {
- endless_method_name(p, $<node>1, &@1);
- restore_defun(p, $<node>1->nd_defn);
- /*%%%*/
- $$ = set_defun_body(p, $1, $2, $4, &@$);
- /*%
- $1 = get_value($1);
- %*/
- /*% ripper[$4]: bodystmt!($4, Qnil, Qnil, Qnil) %*/
- /*% ripper: defs!(AREF($1, 0), AREF($1, 1), AREF($1, 2), $2, $4) %*/
+ /*% ripper: def!(get_value($1), $2, bodystmt!($4, Qnil, Qnil, Qnil)) %*/
local_pop(p);
}
- | defs_head f_opt_paren_args '=' command modifier_rescue arg
+ | defs_head f_opt_paren_args '=' endless_command
{
endless_method_name(p, $<node>1, &@1);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
- $4 = rescued_expr(p, $4, $6, &@4, &@5, &@6);
$$ = set_defun_body(p, $1, $2, $4, &@$);
/*%
$1 = get_value($1);
%*/
- /*% ripper[$4]: bodystmt!(rescue_mod!($4, $6), Qnil, Qnil, Qnil) %*/
- /*% ripper: defs!(AREF($1, 0), AREF($1, 1), AREF($1, 2), $2, $4) %*/
+ /*% ripper: defs!(AREF($1, 0), AREF($1, 1), AREF($1, 2), $2, bodystmt!($4, Qnil, Qnil, Qnil)) %*/
local_pop(p);
}
| backref tOP_ASGN lex_ctxt command_rhs
@@ -1978,6 +1950,20 @@ command_asgn : lhs '=' lex_ctxt command_rhs
}
;
+endless_command : command
+ | endless_command modifier_rescue arg
+ {
+ /*%%%*/
+ $$ = rescued_expr(p, $1, $3, &@1, &@2, &@3);
+ /*% %*/
+ /*% ripper: rescue_mod!($1, $3) %*/
+ }
+ | keyword_not opt_nl endless_command
+ {
+ $$ = call_uni_op(p, method_cond(p, $3, &@3), METHOD_NOT, &@1, &@$);
+ }
+ ;
+
command_rhs : command_call %prec tOP_ASGN
{
value_expr($1);
@@ -2861,30 +2847,17 @@ arg : lhs '=' lex_ctxt arg_rhs
/*% %*/
/*% ripper: ifop!($1, $3, $6) %*/
}
- | defn_head f_opt_paren_args '=' arg
- {
- endless_method_name(p, $<node>1, &@1);
- restore_defun(p, $<node>1->nd_defn);
- /*%%%*/
- $$ = set_defun_body(p, $1, $2, $4, &@$);
- /*% %*/
- /*% ripper[$4]: bodystmt!($4, Qnil, Qnil, Qnil) %*/
- /*% ripper: def!(get_value($1), $2, $4) %*/
- local_pop(p);
- }
- | defn_head f_opt_paren_args '=' arg modifier_rescue arg
+ | defn_head f_opt_paren_args '=' endless_arg
{
endless_method_name(p, $<node>1, &@1);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
- $4 = rescued_expr(p, $4, $6, &@4, &@5, &@6);
$$ = set_defun_body(p, $1, $2, $4, &@$);
/*% %*/
- /*% ripper[$4]: bodystmt!(rescue_mod!($4, $6), Qnil, Qnil, Qnil) %*/
- /*% ripper: def!(get_value($1), $2, $4) %*/
+ /*% ripper: def!(get_value($1), $2, bodystmt!($4, Qnil, Qnil, Qnil)) %*/
local_pop(p);
}
- | defs_head f_opt_paren_args '=' arg
+ | defs_head f_opt_paren_args '=' endless_arg
{
endless_method_name(p, $<node>1, &@1);
restore_defun(p, $<node>1->nd_defn);
@@ -2893,27 +2866,26 @@ arg : lhs '=' lex_ctxt arg_rhs
/*%
$1 = get_value($1);
%*/
- /*% ripper[$4]: bodystmt!($4, Qnil, Qnil, Qnil) %*/
- /*% ripper: defs!(AREF($1, 0), AREF($1, 1), AREF($1, 2), $2, $4) %*/
+ /*% ripper: defs!(AREF($1, 0), AREF($1, 1), AREF($1, 2), $2, bodystmt!($4, Qnil, Qnil, Qnil)) %*/
local_pop(p);
}
- | defs_head f_opt_paren_args '=' arg modifier_rescue arg
+ | primary
+ {
+ $$ = $1;
+ }
+ ;
+
+endless_arg : arg %prec modifier_rescue
+ | endless_arg modifier_rescue arg
{
- endless_method_name(p, $<node>1, &@1);
- restore_defun(p, $<node>1->nd_defn);
/*%%%*/
- $4 = rescued_expr(p, $4, $6, &@4, &@5, &@6);
- $$ = set_defun_body(p, $1, $2, $4, &@$);
- /*%
- $1 = get_value($1);
- %*/
- /*% ripper[$4]: bodystmt!(rescue_mod!($4, $6), Qnil, Qnil, Qnil) %*/
- /*% ripper: defs!(AREF($1, 0), AREF($1, 1), AREF($1, 2), $2, $4) %*/
- local_pop(p);
+ $$ = rescued_expr(p, $1, $3, &@1, &@2, &@3);
+ /*% %*/
+ /*% ripper: rescue_mod!($1, $3) %*/
}
- | primary
+ | keyword_not opt_nl endless_arg
{
- $$ = $1;
+ $$ = call_uni_op(p, method_cond(p, $3, &@3), METHOD_NOT, &@1, &@$);
}
;