mirror of
https://github.com/ruby/ruby.git
synced 2026-01-26 12:14:51 +00:00
Add NODE SCLASS locations
Add locations to struct `RNode_SCLASS`.
memo:
```
@ ProgramNode (location: (1,0)-(1,18))
+-- locals: []
+-- statements:
@ StatementsNode (location: (1,0)-(1,18))
+-- body: (length: 1)
+-- @ SingletonClassNode (location: (1,0)-(1,18))
+-- locals: []
+-- class_keyword_loc: (1,0)-(1,5) = "class"
+-- operator_loc: (1,6)-(1,8) = "<<"
+-- expression:
| @ SelfNode (location: (1,9)-(1,13))
+-- body: nil
+-- end_keyword_loc: (1,15)-(1,18) = "end"
```
This commit is contained in:
parent
395bda2fa1
commit
dd4e7801f3
8
ast.c
8
ast.c
@ -918,6 +918,14 @@ node_locations(VALUE ast_value, const NODE *node)
|
||||
return rb_ary_new_from_args(2,
|
||||
location_new(nd_code_loc(node)),
|
||||
location_new(&RNODE_RETURN(node)->keyword_loc));
|
||||
|
||||
case NODE_SCLASS:
|
||||
return rb_ary_new_from_args(4,
|
||||
location_new(nd_code_loc(node)),
|
||||
location_new(&RNODE_SCLASS(node)->class_keyword_loc),
|
||||
location_new(&RNODE_SCLASS(node)->operator_loc),
|
||||
location_new(&RNODE_SCLASS(node)->end_keyword_loc));
|
||||
|
||||
case NODE_SPLAT:
|
||||
return rb_ary_new_from_args(2,
|
||||
location_new(nd_code_loc(node)),
|
||||
|
||||
@ -1023,8 +1023,11 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node)
|
||||
ANN("format: class << [nd_recv]; [nd_body]; end");
|
||||
ANN("example: class << obj; ..; end");
|
||||
F_NODE(nd_recv, RNODE_SCLASS, "receiver");
|
||||
LAST_NODE;
|
||||
F_NODE(nd_body, RNODE_SCLASS, "singleton class definition");
|
||||
F_LOC(class_keyword_loc, RNODE_SCLASS);
|
||||
F_LOC(operator_loc, RNODE_SCLASS);
|
||||
LAST_NODE;
|
||||
F_LOC(end_keyword_loc, RNODE_SCLASS);
|
||||
return;
|
||||
|
||||
case NODE_COLON2:
|
||||
|
||||
11
parse.y
11
parse.y
@ -1146,7 +1146,7 @@ static rb_node_valias_t *rb_node_valias_new(struct parser_params *p, ID nd_alias
|
||||
static rb_node_undef_t *rb_node_undef_new(struct parser_params *p, NODE *nd_undef, const YYLTYPE *loc);
|
||||
static rb_node_class_t *rb_node_class_new(struct parser_params *p, NODE *nd_cpath, NODE *nd_body, NODE *nd_super, const YYLTYPE *loc, const YYLTYPE *class_keyword_loc, const YYLTYPE *inheritance_operator_loc, const YYLTYPE *end_keyword_loc);
|
||||
static rb_node_module_t *rb_node_module_new(struct parser_params *p, NODE *nd_cpath, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *module_keyword_loc, const YYLTYPE *end_keyword_loc);
|
||||
static rb_node_sclass_t *rb_node_sclass_new(struct parser_params *p, NODE *nd_recv, NODE *nd_body, const YYLTYPE *loc);
|
||||
static rb_node_sclass_t *rb_node_sclass_new(struct parser_params *p, NODE *nd_recv, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *class_keyword_loc, const YYLTYPE *operator_loc, const YYLTYPE *end_keyword_loc);
|
||||
static rb_node_colon2_t *rb_node_colon2_new(struct parser_params *p, NODE *nd_head, ID nd_mid, const YYLTYPE *loc, const YYLTYPE *delimiter_loc, const YYLTYPE *name_loc);
|
||||
static rb_node_colon3_t *rb_node_colon3_new(struct parser_params *p, ID nd_mid, const YYLTYPE *loc, const YYLTYPE *delimiter_loc, const YYLTYPE *name_loc);
|
||||
static rb_node_dot2_t *rb_node_dot2_new(struct parser_params *p, NODE *nd_beg, NODE *nd_end, const YYLTYPE *loc, const YYLTYPE *operator_loc);
|
||||
@ -1254,7 +1254,7 @@ static rb_node_error_t *rb_node_error_new(struct parser_params *p, const YYLTYPE
|
||||
#define NEW_UNDEF(i,loc) (NODE *)rb_node_undef_new(p,i,loc)
|
||||
#define NEW_CLASS(n,b,s,loc,ck_loc,io_loc,ek_loc) (NODE *)rb_node_class_new(p,n,b,s,loc,ck_loc,io_loc,ek_loc)
|
||||
#define NEW_MODULE(n,b,loc,mk_loc,ek_loc) (NODE *)rb_node_module_new(p,n,b,loc,mk_loc,ek_loc)
|
||||
#define NEW_SCLASS(r,b,loc) (NODE *)rb_node_sclass_new(p,r,b,loc)
|
||||
#define NEW_SCLASS(r,b,loc,ck_loc,op_loc,ek_loc) (NODE *)rb_node_sclass_new(p,r,b,loc,ck_loc,op_loc,ek_loc)
|
||||
#define NEW_COLON2(c,i,loc,d_loc,n_loc) (NODE *)rb_node_colon2_new(p,c,i,loc,d_loc,n_loc)
|
||||
#define NEW_COLON3(i,loc,d_loc,n_loc) (NODE *)rb_node_colon3_new(p,i,loc,d_loc,n_loc)
|
||||
#define NEW_DOT2(b,e,loc,op_loc) (NODE *)rb_node_dot2_new(p,b,e,loc,op_loc)
|
||||
@ -4605,7 +4605,7 @@ primary : inline_primary
|
||||
bodystmt
|
||||
k_end
|
||||
{
|
||||
$$ = NEW_SCLASS($expr_value, $bodystmt, &@$);
|
||||
$$ = NEW_SCLASS($expr_value, $bodystmt, &@$, &@k_class, &@tLSHFT, &@k_end);
|
||||
nd_set_line(RNODE_SCLASS($$)->nd_body, @k_end.end_pos.lineno);
|
||||
set_line_body($bodystmt, nd_line($expr_value));
|
||||
fixpos($$, $expr_value);
|
||||
@ -11431,7 +11431,7 @@ rb_node_class_new(struct parser_params *p, NODE *nd_cpath, NODE *nd_body, NODE *
|
||||
}
|
||||
|
||||
static rb_node_sclass_t *
|
||||
rb_node_sclass_new(struct parser_params *p, NODE *nd_recv, NODE *nd_body, const YYLTYPE *loc)
|
||||
rb_node_sclass_new(struct parser_params *p, NODE *nd_recv, NODE *nd_body, const YYLTYPE *loc, const YYLTYPE *class_keyword_loc, const YYLTYPE *operator_loc, const YYLTYPE *end_keyword_loc)
|
||||
{
|
||||
/* Keep the order of node creation */
|
||||
NODE *scope = NEW_SCOPE(0, nd_body, NULL, loc);
|
||||
@ -11439,6 +11439,9 @@ rb_node_sclass_new(struct parser_params *p, NODE *nd_recv, NODE *nd_body, const
|
||||
RNODE_SCOPE(scope)->nd_parent = &n->node;
|
||||
n->nd_recv = nd_recv;
|
||||
n->nd_body = scope;
|
||||
n->class_keyword_loc = *class_keyword_loc;
|
||||
n->operator_loc = *operator_loc;
|
||||
n->end_keyword_loc = *end_keyword_loc;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
@ -914,6 +914,9 @@ typedef struct RNode_SCLASS {
|
||||
|
||||
struct RNode *nd_recv;
|
||||
struct RNode *nd_body;
|
||||
rb_code_location_t class_keyword_loc;
|
||||
rb_code_location_t operator_loc;
|
||||
rb_code_location_t end_keyword_loc;
|
||||
} rb_node_sclass_t;
|
||||
|
||||
typedef struct RNode_COLON2 {
|
||||
|
||||
@ -1636,6 +1636,14 @@ dummy
|
||||
assert_locations(node.children[-1].locations, [[1, 0, 1, 6], [1, 0, 1, 6]])
|
||||
end
|
||||
|
||||
def test_sclass_locations
|
||||
node = ast_parse("class << self; end")
|
||||
assert_locations(node.children[-1].locations, [[1, 0, 1, 18], [1, 0, 1, 5], [1, 6, 1, 8], [1, 15, 1, 18]])
|
||||
|
||||
node = ast_parse("class << obj; foo; end")
|
||||
assert_locations(node.children[-1].locations, [[1, 0, 1, 22], [1, 0, 1, 5], [1, 6, 1, 8], [1, 19, 1, 22]])
|
||||
end
|
||||
|
||||
def test_splat_locations
|
||||
node = ast_parse("a = *1")
|
||||
assert_locations(node.children[-1].children[1].locations, [[1, 4, 1, 6], [1, 4, 1, 5]])
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user