Reputation: 853
For example i have an abstract type of Bool
abstract ABool(Bool) from Bool to Bool {}
And i have a field of that type
var abool:ABool;
What i need is to know ABool underlying type (Bool) in my build macro.
Upvotes: 1
Views: 167
Reputation: 6034
#if macro
import haxe.macro.Expr;
import haxe.macro.*;
#end
class Builder {
macro static public function build():Array<Field> {
var fields = Context.getBuildFields();
for (f in fields) {
switch (f.kind) {
// looks at class variables and properties
case FVar(t, e) | FProp(_, _, t, e):
// t is a haxe.macro.ComplexType,
// lets convert it to a haxe.macro.Type,
// such that we can check if it is an abstract type or not
var type = Context.typeof(macro {var a:$t; a;});
switch (type) {
case TAbstract(t, params):
var underlyingType = t.get().type;
trace(underlyingType); //TAbstract(Bool,[])
case _:
// ignore things that are not of abstract type
}
case _:
// ignore methods
}
}
return fields;
}
}
abstract ABool(Bool) from Bool to Bool {}
#if !macro
@:build(Builder.build())
#end
class Test {
var abool:ABool;
static function main() {
}
}
Upvotes: 3