Skip to content

Instantly share code, notes, and snippets.

@mrcdk
Last active December 24, 2015 11:43
Show Gist options
  • Save mrcdk/7bef01fe1c1fb746f17f to your computer and use it in GitHub Desktop.
Save mrcdk/7bef01fe1c1fb746f17f to your computer and use it in GitHub Desktop.
abstract enum toString() macro
package ;
#if macro
import haxe.macro.Context;
import haxe.macro.Printer;
import haxe.macro.Expr;
class MacroEnum {
macro public static function buildToString():Array<Field> {
var fields = Context.getBuildFields();
var pos = Context.currentPos();
var classname = Context.getLocalClass().get().name;
var cases:Array<Case> = [];
inline function mk(field:Field):Case {
return {
expr: macro $v { field.name },
values: [ { pos: pos, expr: EField(macro $i { classname }, field.name) } ],
};
}
for (field in fields) {
switch(field.kind) {
case FVar(_, _): cases.push(mk(field));
default:
}
}
var eSwitch = {
pos: pos,
expr: ESwitch(
{ pos: pos, expr: EParenthesis( macro $i{"i"} ) },
cases,
macro $v{"null"}
),
};
var fExpr = {
args: [{name:'i'}],
ret: null,
expr: macro $b { [ { pos: pos, expr: EReturn(eSwitch) } ] },
};
var toString = {
name: 'toString',
access: [Access.AStatic],
pos: pos,
kind: FieldType.FFun(cast fExpr),
};
//var printer = new Printer();
//trace(printer.printField(cast toString));
//return null;
fields.push(cast toString);
return fields;
}
}
#end
package;
class Main
{
public static function main() {
var type = BeanType.RED;
trace(type);
trace(BeanType.BLUE);
}
}
@:build(MacroEnum.buildToString())
@:enum abstract BeanType(Int) {
var NONE = 100;
var RED = 0;
var BLUE = 1;
var GREEN = 2;
var YELLOW = 3;
var VIOLET = 4;
var NUISANCE= 10;
var POINT = 11;
var HARD = 12;
var IRON = 13;
var SUN = 20;
var BLOCK = 21;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment