2020-01-05

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.rbOpal::Rewriters::TestRewriterを追加するだけです。

ここでは、rewrite_testというメソッドが呼ばれたら、ブロック内の処理を書き換えて"Block was rewrited!!"という文字列を表示するという処理をしています。

def rewrite_test
  Yield
end

のようなメソッドを定義して、

rewrite_test do; end

のように空のブロック(ブロック内な何でもよいのですが)を渡して呼びだすと、"Block was rewrited!!"という文字列が表示されます。