Last active
December 24, 2015 11:43
-
-
Save mrcdk/7bef01fe1c1fb746f17f to your computer and use it in GitHub Desktop.
abstract enum toString() macro
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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