зеркало из https://github.com/github/ruby.git
Experimentally expose RubyVM::AST::Node#node_id
Now ISeq#to_a includes the node_id list for each bytecode instruction. I want a way to retrieve the AST::Node instance corresponding to an instruction for a research purpose including TypeProf-based LSP server.
This commit is contained in:
Родитель
089a26b0a6
Коммит
ed8e265d4b
7
ast.c
7
ast.c
|
@ -254,16 +254,14 @@ ast_node_type(rb_execution_context_t *ec, VALUE self)
|
|||
return rb_sym_intern_ascii_cstr(node_type_to_str(data->node));
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ISEQ_NODE_ID
|
||||
static VALUE
|
||||
ast_node_node_id(VALUE self)
|
||||
ast_node_node_id(rb_execution_context_t *ec, VALUE self)
|
||||
{
|
||||
struct ASTNodeData *data;
|
||||
TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
|
||||
|
||||
return INT2FIX(nd_node_id(data->node));
|
||||
}
|
||||
#endif
|
||||
|
||||
#define NEW_CHILD(ast, node) node ? ast_new_internal(ast, node) : Qnil
|
||||
|
||||
|
@ -725,7 +723,4 @@ Init_ast(void)
|
|||
rb_mAST = rb_define_module_under(rb_cRubyVM, "AbstractSyntaxTree");
|
||||
rb_cNode = rb_define_class_under(rb_mAST, "Node", rb_cObject);
|
||||
rb_undef_alloc_func(rb_cNode);
|
||||
#ifdef DEBUG_ISEQ_NODE_ID
|
||||
rb_define_method(rb_cNode, "node_id", ast_node_node_id, 0);
|
||||
#endif
|
||||
}
|
||||
|
|
11
ast.rb
11
ast.rb
|
@ -140,6 +140,17 @@ module RubyVM::AbstractSyntaxTree
|
|||
Primitive.ast_node_inspect
|
||||
end
|
||||
|
||||
# call-seq:
|
||||
# node.node_id -> integer
|
||||
#
|
||||
# Returns an internal node_id number.
|
||||
# Note that this is an API for ruby internal use, debugging,
|
||||
# and research. Do not use this for any other purpose.
|
||||
# The compatibility is not guaranteed.
|
||||
def node_id
|
||||
Primitive.ast_node_node_id
|
||||
end
|
||||
|
||||
# call-seq:
|
||||
# node.script_lines -> array
|
||||
#
|
||||
|
|
Загрузка…
Ссылка в новой задаче