зеркало из https://github.com/github/ruby.git
Move `error` from top_stmts and top_stmt to stmt
By this change, syntax error is recovered smaller units. In the case below, "DEFN :bar" is same level with "CLASS :Foo" now. ``` module Z class Foo foo. end def bar end end ``` [Feature #19013]
This commit is contained in:
Родитель
4f24f3ea94
Коммит
4bfdf6d06d
2
ast.c
2
ast.c
|
@ -648,6 +648,8 @@ node_children(rb_ast_t *ast, const NODE *node)
|
|||
NEW_CHILD(ast, node->nd_pkwargs),
|
||||
kwrest);
|
||||
}
|
||||
case NODE_ERROR:
|
||||
return rb_ary_new_from_node_args(ast, 0);
|
||||
case NODE_ARGS_AUX:
|
||||
case NODE_LAST:
|
||||
break;
|
||||
|
|
|
@ -493,6 +493,7 @@ count_nodes(int argc, VALUE *argv, VALUE os)
|
|||
COUNT_NODE(NODE_ARYPTN);
|
||||
COUNT_NODE(NODE_FNDPTN);
|
||||
COUNT_NODE(NODE_HSHPTN);
|
||||
COUNT_NODE(NODE_ERROR);
|
||||
#undef COUNT_NODE
|
||||
case NODE_LAST: break;
|
||||
}
|
||||
|
|
3
node.c
3
node.c
|
@ -1098,6 +1098,9 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node)
|
|||
F_NODE(nd_pkwrestarg, "keyword rest argument");
|
||||
}
|
||||
return;
|
||||
case NODE_ERROR:
|
||||
ANN("Broken input recovered by Error Tolerant mode");
|
||||
return;
|
||||
|
||||
case NODE_ARGS_AUX:
|
||||
case NODE_LAST:
|
||||
|
|
2
node.h
2
node.h
|
@ -125,6 +125,7 @@ enum node_type {
|
|||
NODE_ARYPTN,
|
||||
NODE_HSHPTN,
|
||||
NODE_FNDPTN,
|
||||
NODE_ERROR,
|
||||
NODE_LAST
|
||||
};
|
||||
|
||||
|
@ -386,6 +387,7 @@ typedef struct RNode {
|
|||
#define NEW_PREEXE(b,loc) NEW_SCOPE(b,loc)
|
||||
#define NEW_POSTEXE(b,loc) NEW_NODE(NODE_POSTEXE,0,b,0,loc)
|
||||
#define NEW_ATTRASGN(r,m,a,loc) NEW_NODE(NODE_ATTRASGN,r,m,a,loc)
|
||||
#define NEW_ERROR(loc) NEW_NODE(NODE_ERROR,0,0,0,loc)
|
||||
|
||||
#define NODE_SPECIAL_REQUIRED_KEYWORD ((NODE *)-1)
|
||||
#define NODE_REQUIRED_KEYWORD_P(node) ((node)->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD)
|
||||
|
|
14
parse.y
14
parse.y
|
@ -1430,10 +1430,6 @@ top_stmts : none
|
|||
/*% %*/
|
||||
/*% ripper: stmts_add!($1, $3) %*/
|
||||
}
|
||||
| error top_stmt
|
||||
{
|
||||
$$ = remove_begin($2);
|
||||
}
|
||||
;
|
||||
|
||||
top_stmt : stmt
|
||||
|
@ -1503,10 +1499,6 @@ stmts : none
|
|||
/*% %*/
|
||||
/*% ripper: stmts_add!($1, $3) %*/
|
||||
}
|
||||
| error stmt
|
||||
{
|
||||
$$ = remove_begin($2);
|
||||
}
|
||||
;
|
||||
|
||||
stmt_or_begin : stmt
|
||||
|
@ -1659,6 +1651,12 @@ stmt : keyword_alias fitem {SET_LEX_STATE(EXPR_FNAME|EXPR_FITEM);} fitem
|
|||
/*% ripper: massign!($1, $4) %*/
|
||||
}
|
||||
| expr
|
||||
| error
|
||||
{
|
||||
/*%%%*/
|
||||
$$ = NEW_ERROR(&@$);
|
||||
/*% %*/
|
||||
}
|
||||
;
|
||||
|
||||
command_asgn : lhs '=' lex_ctxt command_rhs
|
||||
|
|
|
@ -114,6 +114,11 @@ module TestIRB
|
|||
"class bad; end" => "#{GREEN}class#{CLEAR} #{RED}#{REVERSE}bad#{CLEAR}; #{GREEN}end#{CLEAR}",
|
||||
"def req(@a) end" => "#{GREEN}def#{CLEAR} #{BLUE}#{BOLD}req#{CLEAR}(#{RED}#{REVERSE}@a#{CLEAR}) #{GREEN}end#{CLEAR}",
|
||||
})
|
||||
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.2.0')
|
||||
tests.merge!({
|
||||
"def req(true) end" => "#{GREEN}def#{CLEAR} #{BLUE}#{BOLD}req#{CLEAR}(#{RED}#{REVERSE}true#{CLEAR}#{RED}#{REVERSE})#{CLEAR} #{RED}#{REVERSE}end#{CLEAR}",
|
||||
})
|
||||
end
|
||||
else
|
||||
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0')
|
||||
tests.merge!({
|
||||
|
|
|
@ -981,30 +981,30 @@ dummy
|
|||
tbl: []
|
||||
args: nil
|
||||
body:
|
||||
(BLOCK@1:8-8:3 (BEGIN@1:8-1:8 nil)
|
||||
(CLASS@2:2-8:3 (COLON2@2:8-2:11 nil :Foo) nil
|
||||
(SCOPE@2:2-8:3
|
||||
(BLOCK@1:8-7:5 (BEGIN@1:8-1:8 nil)
|
||||
(CLASS@2:2-4:5 (COLON2@2:8-2:11 nil :Foo) nil
|
||||
(SCOPE@2:2-4:5
|
||||
tbl: []
|
||||
args: nil
|
||||
body:
|
||||
(DEFN@6:2-7:5
|
||||
mid: :bar
|
||||
body:
|
||||
(SCOPE@6:2-7:5
|
||||
tbl: []
|
||||
args:
|
||||
(ARGS@6:9-6:9
|
||||
pre_num: 0
|
||||
pre_init: nil
|
||||
opt: nil
|
||||
first_post: nil
|
||||
post_num: 0
|
||||
post_init: nil
|
||||
rest: nil
|
||||
kw: nil
|
||||
kwrest: nil
|
||||
block: nil)
|
||||
body: nil))))))))
|
||||
body: (BLOCK@2:11-4:5 (BEGIN@2:11-2:11 nil) (ERROR@3:4-4:5))))
|
||||
(DEFN@6:2-7:5
|
||||
mid: :bar
|
||||
body:
|
||||
(SCOPE@6:2-7:5
|
||||
tbl: []
|
||||
args:
|
||||
(ARGS@6:9-6:9
|
||||
pre_num: 0
|
||||
pre_init: nil
|
||||
opt: nil
|
||||
first_post: nil
|
||||
post_num: 0
|
||||
post_init: nil
|
||||
rest: nil
|
||||
kw: nil
|
||||
kwrest: nil
|
||||
block: nil)
|
||||
body: nil))))))
|
||||
EXP
|
||||
end
|
||||
end
|
||||
|
|
Загрузка…
Ссылка в новой задаче