summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-10-12 00:26:39 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-10-12 00:40:55 +0900
commit4ed0c33d13ff0d2544aaf36e8e4f071b900d10cd (patch)
treede93b6343b6f4b7f7b17483018f0be5000d8db5e /parse.y
parent27b48089e2bdc3b0719e75ae8685a496ef8fa9e3 (diff)
Prohibit setter method names in all kinds of endless methods
Also unwrap NODE_RIPPER to check the method name.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3649
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y19
1 files changed, 16 insertions, 3 deletions
diff --git a/parse.y b/parse.y
index 1a6887e983..f8d05ad44a 100644
--- a/parse.y
+++ b/parse.y
@@ -961,6 +961,18 @@ restore_defun(struct parser_params *p, NODE *name)
p->ctxt.in_def = c.ctxt.in_def;
}
+static void
+endless_method_name(struct parser_params *p, NODE *defn, const YYLTYPE *loc)
+{
+#ifdef RIPPER
+ defn = defn->nd_defn;
+#endif
+ ID mid = defn->nd_mid;
+ if (is_attrset_id(mid)) {
+ yyerror1(loc, "setter method cannot be defined in an endless method definition");
+ }
+}
+
#ifndef RIPPER
# define Qnone 0
# define Qnull 0
@@ -2477,9 +2489,7 @@ arg : lhs '=' arg_rhs
}
| defn_head f_paren_args '=' arg
{
- if (is_attrset_id($<node>1->nd_mid)) {
- yyerror1(&@1, "setter method cannot be defined in an endless method definition");
- }
+ endless_method_name(p, $<node>1, &@1);
token_info_drop(p, "def", @1.beg_pos);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
@@ -2490,6 +2500,7 @@ arg : lhs '=' arg_rhs
}
| defn_head f_paren_args '=' arg modifier_rescue arg
{
+ endless_method_name(p, $<node>1, &@1);
token_info_drop(p, "def", @1.beg_pos);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
@@ -2501,6 +2512,7 @@ arg : lhs '=' arg_rhs
}
| defs_head f_paren_args '=' arg
{
+ endless_method_name(p, $<node>1, &@1);
restore_defun(p, $<node>1->nd_defn);
/*%%%*/
$$ = set_defun_body(p, $1, $2, $4, &@$);
@@ -2512,6 +2524,7 @@ arg : lhs '=' arg_rhs
}
| defs_head f_paren_args '=' 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);