OpalのRewriterをつかってASTを書き換えてみる
昨日shibuya-mokumokuでやったことを書きます。
2020-01-02の記事で書いたRewriterを実際につかってみました。
実際にrewriteするOpal::Rewriters::Baseクラスを継承するクラスを作って、
module Opal
module Rewriters
class TestRewriter < Base
def on_block(node)
recvr, args, body = node.children
return super unless recvr == s(:send, nil, :rewrite_test)
body = s(:send, nil, :puts, s(:str, "Block was rewrited!!"))
node.updated(:block, [recvr, args, body])
end
end
end
end
rewriter.rbにOpal::Rewriters::TestRewriterを追加するだけです。
ここでは、rewrite_testというメソッドが呼ばれたら、ブロック内の処理を書き換えて"Block was rewrited!!"という文字列を表示するという処理をしています。
def rewrite_test
Yield
end
のようなメソッドを定義して、
rewrite_test do; end
のように空のブロック(ブロック内な何でもよいのですが)を渡して呼びだすと、"Block was rewrited!!"という文字列が表示されます。