Skip to content

Commit

Permalink
Experimentally expose RubyVM::AST::Node#node_id
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mame committed Jun 21, 2021
1 parent 089a26b commit ed8e265
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 6 deletions.
7 changes: 1 addition & 6 deletions ast.c
Expand Up @@ -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

Expand Down Expand Up @@ -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 changes: 11 additions & 0 deletions ast.rb
Expand Up @@ -140,6 +140,17 @@ def inspect
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
#
Expand Down

0 comments on commit ed8e265

Please sign in to comment.