Hi everyone ! :D
I am trying to copy field of an abstract to an other.
Instead of:
@:enum abstract PrimitiveNumber(String) to String
{
var FLOAT = "FLOAT";
var INT = "INT";
}
@:enum abstract PrimitiveType(String) to String
{
var FLOAT = "FLOAT";
var INT = "INT";
var STRING = "STRING";
var BOOL = "BOOL";
}
@:enum abstract Type(String) to String
{
var FLOAT = "FLOAT";
var INT = "INT";
var STRING = "STRING";
var BOOL = "BOOL";
var OBJECT = "OBJECT";
var LIST = "LIST";
var MAP = "MAP";
var ENUM = "ENUM";
}
I would like get write that:
@:enum abstract PrimitiveNumber(String) to String
{
var FLOAT = "FLOAT";
var INT = "INT";
}
@:build(AbstractTools.extendEnum(PrimitiveNumber))
@:enum abstract PrimitiveType(String) to String
{
var STRING = "STRING";
var BOOL = "BOOL";
}
@:build(AbstractTools.extendEnum(PrimitiveType))
@:enum abstract Type(String) to String
{
var OBJECT = "OBJECT";
var LIST = "LIST";
var MAP = "MAP";
var ENUM = "ENUM";
}
I wrote that:
#if macro
import haxe.macro.Context;
import haxe.macro.Expr;
using haxe.macro.Tools;
#end
class AbstractTools {
public static macro function extendEnum(typePath:Expr):Array<Field> {
var fields = Context.getBuildFields();
var type = Context.getType(typePath.toString());
var lField:Field;
switch (type.follow()) {
case TAbstract(_.get() => ab, _) if (ab.meta.has(":enum")):
var valueExprs = [];
for (classField in ab.impl.get().statics.get()) {
if (classField.meta.has(":enum") && classField.meta.has(":impl")) {
var fieldName = classField.name;
lField = {
name: fieldName,
doc: null,
meta: [],
access: [AStatic, APublic],
kind: FVar(macro : String, macro $typePath.$fieldName),
pos: Context.currentPos()
};
fields.push(lField);
}
}
default:
throw new Error(type.toString() + " should be @:enum abstract", typePath.pos);
}
return fields;
}
}
But build meta seems to work only with string parameter because I get this error:
PrimitiveNumber should be string on compilation but I have autocompletion.
kind: FVar(macro : String, macro $typePath.$fieldName),
Here, "String" must be type of abstract, but I don't know how to get it.
Do you have an idea to fix that? :)
Thanks
Théo Sabattié.