OpalのRewriterについて
OpalのコンパイラにはRewriterという仕組みがあります。 OpalのコンパイラはRubyのコードからparser gemを使ってASTを構築し、ASTをトラバースしながらJavaScriptのコードを生成していきます。
RubyのASTはそのままJavaScriptに変換するには不都合がある場合があります。 この不都合を回避するためにあらかじめASTを書き換えるしくみを持っています。 例えば次のようなケースです。
if RUBY_ENGINE != 'opal'~endのようなコードブロックはOpalでは無視される(opalenginecheck.rb)for..in構文はRubyとJavaScriptで大きく異なる(for_rewriter.rb)
のようなケースでASTの書き換えを行ないます。 (ほかにもこのあたりを見るとさまざまな書き換えをおこなっていることがわかります。)
opal_engine_checkのように本来は評価時にチェックするようなものもコンパイル時にチェックすることが出来るようになっているのです。