Haxeのmacroでanonymous structureを動的に生成する
公式Wikiで解説が発見できなくて、ググりながら色々試しててたら、JSON-schema type builder prototype. · GitHubにたどり着いた。
理解できてしまえば簡単なのだが、ポイントとしては、
- Expr.ComplexType.TAnonymousを生成して、
- ComplexTypeTools.toType()でTypeに変換して、
- 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を参照。