If a class has the :autoBuild
metadata, the compiler generates :build
metadata on all extending classes. If an interface has the :autoBuild
metadata, the compiler generates :build
metadata on all implementing classes and all extending interfaces. Note that :autoBuild
does not imply :build
on the class/interface itself.
import haxe.macro.Context; import haxe.macro.Expr; class AutoBuildingMacro { macro static public function fromInterface():Array<Field> { trace("fromInterface: " + Context.getLocalType()); return null; } macro static public function fromBaseClass():Array<Field> { trace("fromBaseClass: " + Context.getLocalType()); return null; } }
@:autoBuild(AutoBuildingMacro.fromInterface()) interface I {} interface I2 extends I {} @:autoBuild(AutoBuildingMacro.fromBaseClass()) class Base {} class Main extends Base implements I2 { static public function main() {} }
This outputs during compilation:
AutoBuildingMacro.hx:6:
fromInterface: TInst(I2,[])
AutoBuildingMacro.hx:6:
fromInterface: TInst(Main,[])
AutoBuildingMacro.hx:11:
fromBaseClass: TInst(Main,[])
It is important to keep in mind that the order of these macro executions is undefined, which is detailed in Build Order.