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:
Yusuke Endoh 2021-06-21 21:15:25 +09:00
Родитель 089a26b0a6
Коммит ed8e265d4b
2 изменённых файлов: 12 добавлений и 6 удалений

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
Просмотреть файл

@ -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
#