From ed8e265d4be53e15bffea3b1db649b1cea4ea864 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Mon, 21 Jun 2021 21:15:25 +0900 Subject: [PATCH] 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. --- ast.c | 7 +------ ast.rb | 11 +++++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/ast.c b/ast.c index 3945a32af7..32d8ab9eb6 100644 --- a/ast.c +++ b/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 } diff --git a/ast.rb b/ast.rb index ce99f53c45..34dd3f1d49 100644 --- a/ast.rb +++ b/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 #