@:enum abstract Primary(String) to String { var FLOAT = "Float"; var INT = "Int"; var STRING = "String"; var BOOL = "Bool";
}
@:enum abstract Primary(String) to String { var FLOAT = "Float"; var INT = "Int"; var STRING = "String"; var BOOL = "Bool";
private static var values:Array<String> = ["Float", "Int", "String", "Bool"];
public static function getAllValues():Array<String> {
return values.slice(0);
}
public static function hasValue(value:String){
return values.indexOf(value) != -1;
}
}
@:enum abstract Primary(String) to String { var FLOAT = "Float"; var INT = "Int"; var STRING = "String"; var BOOL = "Bool";
private static var values:Array<String> = ["Float", "Int", "String", "Bool"];
public static function getAllValues():Array<String> {
return values.slice(0);
}
public static function hasValue(value:String){
return values.indexOf(value) != -1;
}
private inline function new(s:String) { this = s; }
@:from static public function fromString(s:String) { if (!Primary.hasValue(s)) { throw s + " does not exist on Primary"; } return new Primary(s); }}
#if macroimport haxe.macro.Context;import haxe.macro.Type;import haxe.macro.Expr;using haxe.macro.Tools;#end
class AbstractEnumBuildingMacro{ public static macro function build(typePath:Expr):Array<Field> { var type:Type = Context.getType(typePath.toString()); var fields:Array<Field> = Context.getBuildFields(); var pos:Position = Context.currentPos(); var valueExprs = []; switch (type.follow()) { case TAbstract(_.get() => ab, _) if (ab.meta.has(":enum")): valueExprs.push(macro "start"); for (field in ab.impl.get().statics.get()) { if (field.meta.has(":enum") && field.meta.has(":impl")) { var fieldName = field.name; valueExprs.push(macro $typePath.$fieldName); } else { valueExprs.push(macro false); } } valueExprs.push(macro "end"); default: throw new Error(type.toString() + " should be @:enum abstract", typePath.pos); } var getAllValuesFunc:Function = { expr: macro { return values.slice(0); }, ret: (macro:Array<Dynamic>), args:[] } var hasValueFunc:Function = { expr: macro { return values.indexOf(value) != -1; }, ret: (macro:Bool), args:[ { name:"value", type: (macro:Dynamic) }] } fields.push({ name: "values", access: [Access.APrivate, Access.AStatic], kind: FieldType.FVar(macro:Array<String>, macro $a{valueExprs}), pos: pos, }); fields.push({ name: "getAllValues", access: [Access.APublic, Access.AStatic], kind: FieldType.FFun(getAllValuesFunc), pos: pos, }); fields.push({ name: "hasValue", access: [Access.APublic, Access.AStatic], kind: FieldType.FFun(hasValueFunc), pos: pos, }); return fields; }}
valueExprs.push(macro "start");
// ...
valueExprs.push(macro "end");
--
To post to this group haxe...@googlegroups.com
http://groups.google.com/group/haxelang?hl=en
---
You received this message because you are subscribed to the Google Groups "Haxe" group.
For more options, visit https://groups.google.com/d/optout.
--
Just for the record, there's this article on the Haxe Code Cookbook:
1/ Functions seem valid but "values" is an empty array.I take a part of the code from cookbook : http://code.haxe.org/category/macros/enum-abstract-values.htmlHave you an idea to fix that?
@:enum abstract EnumPrimary(String) to String
{ var FLOAT = "Float"; var INT = "Int"; var STRING = "String"; var BOOL = "Bool";
private static var values:Array<String> = AbstractEnumTools.getValues(EnumPrimary);
public static function getAllValues():Array<String> { return values.slice(0); } public static function hasValue(value:String){ return values.indexOf(value) != -1; }
private inline function new(s:String) { this = s; }
@:from static public function fromString(s:String) {
if (!hasValue(s)) {
throw s + " does not exist on Primary"; }
return new EnumPrimary(s); }}