Ruby 4.1 リファレンスマニュアル

instance method RubyVM::InstructionSequence#syntax_tree

syntax_tree -> Ruby::Prism::Node | RubyVM::AbstractSyntaxTree::Node | nilRuby 4.1 から[permalink][rdoc][edit]

self のコンパイル元になった抽象構文木(AST)のノードを、コンパイルに使ったのと同じパーサでソースを再度パースし直すことで返します。

デフォルトの prism でコンパイルされていれば Ruby::Prism のノード(Ruby::Prism::Node のサブクラス)を、parse.y でコンパイルされていれば RubyVM::AbstractSyntaxTree::Node を返します。

以下のように、ノードを確実に取得できない場合は nil を返します。

  • ソースを利用できない場合(文字列からコンパイルした場合や、RubyVM.keep_script_lines を有効にせずに eval したコードなど)
  • コンパイルしたあとにソースファイルが変更されている場合

返されるノードは prism gem のノードではなく、インタプリタに組み込まれた Ruby::Prism のノードです。そのため、インストールされている prism gem のバージョンにかかわらず、返される構文木は実行中のコードに対応します。

このメソッドは実験的なもので、予告なく変更される可能性があります。

例
# /tmp/hello.rb
puts "hello, world"

iseq = RubyVM::InstructionSequence.compile_file("/tmp/hello.rb")
p iseq.syntax_tree.type # => :program_node

# 文字列からコンパイルした場合はソースを再度読み込めないので nil
p RubyVM::InstructionSequence.compile("1 + 2").syntax_tree # => nil

[SEE_ALSO] RubyVM::InstructionSequence#node_id, RubyVM::InstructionSequence#source_hash, Proc#syntax_tree