class Main extends Sprite { public function new() { trace(Upgrades.getUpgrade("health").getName()); // this would work trace(Upgrades.health.getName()); // this will make AssetPaths throw the error super(); }}
// You cannot use @:build inside a macro : make sure that your enum is not used in macro@:build(flixel.system.FlxAssets.buildFileReferences("assets", true))class AssetPaths {}
@:build(UpgradesMacro.build())class Upgrades { private static var _upgrades:Array<Upgrade>; private static var _varNames:Array<String>; public static function getUpgrade(varName:String):Upgrade { if (_upgrades == null || _varNames == null) { _upgrades = UpgradeJsonParser.getUpgrades(); _varNames = UpgradeJsonParser.getVarNames(); } for (i in 0..._upgrades.length) { var upgrade:Upgrade = _upgrades[i]; if (varName == _varNames[i]) return upgrade; } throw 'Upgrade $varName does not exist'; }}
class UpgradesMacro { #if macro public macro static function build():Array<Field> { var upgrades:Array<Upgrade> = UpgradeJsonParser.getUpgrades(); var varNames:Array<String> = UpgradeJsonParser.getVarNames(); var fields = Context.getBuildFields(); for (i in 0...upgrades.length) { var upgrade:Upgrade = upgrades[i]; var varName:String = varNames[i]; fields.push({ name:varName, access:[Access.APublic, Access.AStatic], kind:FieldType.FVar(macro:Upgrade, macro $v{upgrade}), pos:Context.currentPos(), }); } return fields; } #end}