Haxeのmacroでanonymous structureを動的に生成する

公式Wikiで解説が発見できなくて、ググりながら色々試しててたら、JSON-schema type builder prototype. · GitHubにたどり着いた。

理解できてしまえば簡単なのだが、ポイントとしては、

  1. Expr.ComplexType.TAnonymousを生成して、
  2. ComplexTypeTools.toType()でTypeに変換して、
  3. MacroTypeに食わせる
// MyMacro.hx
class MyMacro {
    macro public static function build(): Type {
        var t = ComplexType.TAnonymous([
            {
                name: "field",
                pos:  Context.currentPos(),
                kind: FVar(macro : Int),
                meta: []
            }
        ]);

        return ComplexTypeTools.toType(t);
    }
}
// Foo.hx
typedef Foo = MacroType<[MyMacro.build()]>;

こんなかんじで、"var field: Int;"なフィールドを持ったtypedefというかanonymous structureを生成できる。

ちなみに、typedef自体もmacroで生成したい場合は、Context.defineType()を使えばいいらしい(試してない)。Build.hx · GitHubを参照。