Edited at

irbでRubyVM::AbstractSyntaxTree.ofを使って雑にASTを取る

~/.irbrcに以下を足すだけでOK


~/.irbrc

unless defined?(SCRIPT_LINES__)

SCRIPT_LINES__ = {}
end

ast_happier = TracePoint.new(:call) do |tp|
SCRIPT_LINES__['(irb)'] = tp.binding.local_variable_get(:statements).lines
end
ast_happier.enable(target: IRB::WorkSpace.instance_method(:evaluate))



% irb

irb(main):001:0> pp RubyVM::AbstractSyntaxTree.of(-> { puts :hi })
(SCOPE@1:35-1:48
tbl: []
args:
(ARGS@1:35-1:35
pre_num: 0
pre_init: nil
opt: nil
first_post: nil
post_num: 0
post_init: nil
rest: nil
kw: nil
kwrest: nil
block: nil)
body: (FCALL@1:38-1:46 :puts (ARRAY@1:43-1:46 (LIT@1:43-1:46 :hi) nil)))
=> #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:35-1:48>


どうして動くのか

ここに書いた

https://dev.to/okinawarb/how-can-i-use-rubyvm-abstractsyntaxtree-in-irb-m2k


課題

うまく動かないケースは変数に入れてからofとかだと動かないんですが(たぶんね)、ファイル名を工夫して、SCRIPT_LINES__にこう入れる、というのが分かっていれば、実質自明なので頑張って改良してくれ〜の他力本願スタイルでいきます