importhaxe.macro.Context;importhaxe.macro.Expr;/** * http://yal.cc/haxe-c-style-enum-macros/ * @author YellowAfterlife*/classIntEnum{publicstaticmacrofunctionbuild():Array<Field>{switch(Context.getLocalClass().get().kind){caseKAbstractImpl(_.get()=>{type:TAbstract(_.get()=>{name:"Int"},_)}):// OKdefault:Context.error("This macro should only be applied to abstracts with base type Int",Context.currentPos());}var fields:Array<Field>=Context.getBuildFields();var nextIndex:Int=0;var getNameCases:Array<Case>=[];for(fieldinfields){var value:String=null;switch(field.kind){caseFVar(t,{expr:EConst(CInt(int))}):{// `var some = 1;`value=int;nextIndex=Std.parseInt(value)+1;};caseFVar(t,null):{// `var some;`value=Std.string(nextIndex++);field.kind=FVar(t,{expr:EConst(CInt(value)),pos:field.pos});};default:}if(value!=null)getNameCases.push({values:[{expr:EConst(CInt(value)),pos:field.pos}],expr:{expr:EConst(CString(field.name)),pos:field.pos}});}// for (field in fields)var getNameExpr:Expr={expr:ESwitch(macrothis,getNameCases,macronull),pos:Context.currentPos()};fields.push((macroclassMagic{publicfunctiongetName():Stringreturn$getNameExpr;}).fields[0]);returnfields;}}
Comments (0)
HTTPSSSH
You can clone a snippet to your computer for local editing.
Learn more.