GroovyのAST変換事情
Groovy言語ではAST変換をサポートしているのでその昔からAST変換をつかったライブラリがそこそこあります。 アノテーションでコード生成やボイラープレートなどの短縮、コード検査があります。
今回はAST変換の書き方というよりどういった成果物があったり、参考になる情報をまとめておきます。 本記事はG* Advent Calendarの12日目になります。
G* Advent Calendar 2017 - Qiita
AST変換の方法
Groovy言語はパーサーコンビネーター書きにくいとかあるわけですが、まぁAST変換がいろんなタイミングで出来るようになっています。 ただ、2.5.0から便利APIが増えるので少し書きやすくなります。また、2.5.0が来る前でも書きやすくするためのライブラリとしてAsteroidというのがあります。
- Groovy 2.4.xまでのAST変換
- Groovy 2.5.0で導入される macro API
- AST変換サポートライブラリ Asteroid
GroovyのAST変換はアノテーションでスコープを限定したローカルAST変換というものから全体におよぶグローバルAST変換があります。後者はコンパイル時間がのびたりとか(どこまでやるか次第ですが)わけわからない構文が増えて困るみたいなことにならないように気をつけるという感じでしょうか。
Groovy 2.4.x までのAST変換の方法については公式ドキュメントを読むとなんとなくわかると思います。
Groovy Language Documentation - Developing AST transformations
ローカルAST変換は基本はアノテーションを定義して、アノテーションにおける実装クラス側でAST変換系のクラスを継承して変換を実装するという形になります。このときに抽象メソッドのオーバーライドをします。引数に対象のASTがくるのであとはゴニョゴニョといじるという感じです。
Groovy 2.5.0 のmacro APIはもともとは MacroGroovy というライブラリで提供されていた便利APIを公式に導入したという形です。(macroという名前がどうなんだっていうのはあるんですが。。。) まだリリース前なので変わるかもしれませんが、 2.5.0 beta 2 のドキュメントにその記載があります。
Groovy Language Documentation - Macro
2.4.xで少しでもAST変換の記述を楽にするためにAsteroidというライブラリがあります。これは比較的GroovyにおけるAST変換の主なユースケースのためにいろいろラップしているものです。
AST変換の事例となる実装
基本はGroovy言語にあるアノテーション群が最初にわかりやすいかと思います。例えば、 @ToString
や @Canonical
がいいかと思います。
groovy/ToString.java at master · apache/groovy · GitHub
groovy/ToStringASTTransformation.java at master · apache/groovy · GitHub
他にはSpockを見るとラベルをつかったAST変換を見ることができます。
spock/SpockTransform.java at master · spockframework/spock · GitHub
また、最近流行り?のGraphQLに対応したGroovyのライブラリであるGQLというのがあります。これはさきのAsteroidの作者が開発しており、GQL内でAsteroidを使っているので、Asteroidの使い方としても勉強になるライブラリになっています。
gql/GraphQLImpl.groovy at master · grooviter/gql · GitHub
Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築
- 作者: 綿引琢磨,須江信洋,林政利,今井勝信
- 出版社/メーカー: 翔泳社
- 発売日: 2014/11/07
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
- 作者: Dierk Konig,Paul King,Guillaume Laforge,Hamlet D'arcy,Cedric Champeau
- 出版社/メーカー: Manning Pubns Co
- 発売日: 2015/06/27
- メディア: ペーパーバック
- この商品を含むブログを見る