うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

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というのがあります。

  1. Groovy 2.4.xまでのAST変換
  2. Groovy 2.5.0で導入される macro API
  3. 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変換の主なユースケースのためにいろいろラップしているものです。

Asteroid

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徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Groovy in Action

Groovy in Action

  • 作者: Dierk Konig,Paul King,Guillaume Laforge,Hamlet D'arcy,Cedric Champeau
  • 出版社/メーカー: Manning Pubns Co
  • 発売日: 2015/06/27
  • メディア: ペーパーバック
  • この商品を含むブログを見る