ripper: Fix excess compile_error at simple backref op_asgn

Fix up 89cfc1520717257073012ec07105c551e4b8af7c.
This commit is contained in:
Nobuyoshi Nakada 2024-05-19 19:42:57 +09:00
parent 335cb28886
commit 9e28354705
No known key found for this signature in database
GPG Key ID: 3582D74E1FEE4465
2 changed files with 18 additions and 16 deletions

10
parse.y
View File

@ -1448,7 +1448,9 @@ static NODE *assignable(struct parser_params*,ID,NODE*,const YYLTYPE*);
static NODE *aryset(struct parser_params*,NODE*,NODE*,const YYLTYPE*); static NODE *aryset(struct parser_params*,NODE*,NODE*,const YYLTYPE*);
static NODE *attrset(struct parser_params*,NODE*,ID,ID,const YYLTYPE*); static NODE *attrset(struct parser_params*,NODE*,ID,ID,const YYLTYPE*);
#ifndef RIPPER
static void rb_backref_error(struct parser_params*,NODE*); static void rb_backref_error(struct parser_params*,NODE*);
#endif
static NODE *node_assign(struct parser_params*,NODE*,NODE*,struct lex_context,const YYLTYPE*); static NODE *node_assign(struct parser_params*,NODE*,NODE*,struct lex_context,const YYLTYPE*);
static NODE *new_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context, const YYLTYPE *loc); static NODE *new_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context, const YYLTYPE *loc);
@ -3875,10 +3877,10 @@ arg : lhs '=' lex_ctxt arg_rhs
} }
| backref tOP_ASGN lex_ctxt arg_rhs | backref tOP_ASGN lex_ctxt arg_rhs
{ {
rb_backref_error(p, $1);
/*%%%*/ /*%%%*/
$$ = NEW_ERROR(&@$); rb_backref_error(p, $1);
/*% %*/ /*% %*/
$$ = NEW_ERROR(&@$);
/*% ripper[error]: backref_error(p, $1, opassign!(var_field!($:1), $:2, $:4)) %*/ /*% ripper[error]: backref_error(p, $1, opassign!(var_field!($:1), $:2, $:4)) %*/
} }
| arg tDOT2 arg | arg tDOT2 arg
@ -6114,8 +6116,6 @@ qsym_list : /* none */
string_contents : /* none */ string_contents : /* none */
{ {
$$ = 0; $$ = 0;
/*%%%*/
/*% %*/
/*% ripper: string_content! %*/ /*% ripper: string_content! %*/
} }
| string_contents string_content | string_contents string_content
@ -13671,6 +13671,7 @@ attrset(struct parser_params *p, NODE *recv, ID atype, ID id, const YYLTYPE *loc
return NEW_ATTRASGN(recv, id, 0, loc); return NEW_ATTRASGN(recv, id, 0, loc);
} }
#ifndef RIPPER
static void static void
rb_backref_error(struct parser_params *p, NODE *node) rb_backref_error(struct parser_params *p, NODE *node)
{ {
@ -13683,6 +13684,7 @@ rb_backref_error(struct parser_params *p, NODE *node)
break; break;
} }
} }
#endif
#ifdef RIPPER #ifdef RIPPER
static VALUE static VALUE

View File

@ -267,28 +267,28 @@ class TestRipper::ParserEvents < Test::Unit::TestCase
end end
def test_assign_error_backref def test_assign_error_backref
thru_assign_error = false errors = []
result = result =
parse('$& = 1', :on_assign_error) {thru_assign_error = true} parse('$& = 1', %i[on_assign_error compile_error]) {|e, *| errors << e}
assert_equal true, thru_assign_error assert_equal %i[on_assign_error], errors
assert_equal '[assign(assign_error(var_field($&)),1)]', result assert_equal '[assign(assign_error(var_field($&)),1)]', result
thru_assign_error = false errors = []
result = result =
parse('$&, _ = 1', :on_assign_error) {thru_assign_error = true} parse('$&, _ = 1', %i[on_assign_error compile_error]) {|e, *| errors << e}
assert_equal true, thru_assign_error assert_equal %i[on_assign_error], errors
assert_equal '[massign([assign_error(var_field($&)),var_field(_)],1)]', result assert_equal '[massign([assign_error(var_field($&)),var_field(_)],1)]', result
thru_assign_error = false errors = []
result = result =
parse('$& += 1', :on_assign_error) {thru_assign_error = true} parse('$& += 1', %i[on_assign_error compile_error]) {|e, *| errors << e}
assert_equal true, thru_assign_error assert_equal %i[on_assign_error], errors
assert_equal '[assign_error(opassign(var_field($&),+=,1))]', result assert_equal '[assign_error(opassign(var_field($&),+=,1))]', result
thru_assign_error = false errors = []
result = result =
parse('$& += cmd 1, 2', :on_assign_error) {thru_assign_error = true} parse('$& += cmd 1, 2', %i[on_assign_error compile_error]) {|e, *| errors << e}
assert_equal true, thru_assign_error assert_equal %i[on_assign_error], errors
assert_equal '[assign_error(opassign(var_field($&),+=,command(cmd,[1,2])))]', result assert_equal '[assign_error(opassign(var_field($&),+=,command(cmd,[1,2])))]', result
end end