Ruby 2.6 の変更点 - RubyVM::AbstractSyntaxTree

Ruby2.6アドベントカレンダーの17日目の記事です。

qiita.com

RubyVM::AbstractSyntaxTree

Ruby スクリプトを解析して抽象構文木を作成するクラスが追加されました。

RubyVM::AbstractSyntaxTree.parse は引数の文字列をパースします。

pp RubyVM::AbstractSyntaxTree.parse('x = 1 + 2')
#=> (SCOPE@1:0-1:9
#    tbl: [:x]
#    args: nil
#    body:
#      (LASGN@1:0-1:9 :x
#         (OPCALL@1:4-1:9 (LIT@1:4-1:5 1) :+ (ARRAY@1:8-1:9 (LIT@1:8-1:9 2) nil))))

RubyVM::AbstractSyntaxTree.parse_file は引数にファイル名を指定し、そのファイルを読み込みパースします。

RubyVM::AbstractSyntaxTree.of は Method や Proc オブジェクトから構文木を生成します。

proc = ->(a){ a + 123 }
pp RubyVM::AbstractSyntaxTree.of(proc)
#=> (SCOPE@1:9-1:23
#    tbl: [:a]
#    args:
#      (ARGS@1:10-1:11
#       pre_num: 1
#       pre_init: nil
#       opt: nil
#       first_post: nil
#       post_num: 0
#       post_init: nil
#       rest: nil
#       kw: nil
#       kwrest: nil
#       block: nil)
#    body:
#      (OPCALL@1:14-1:21 (DVAR@1:14-1:15 :a) :+
#         (ARRAY@1:18-1:21 (LIT@1:18-1:21 123) nil)))