Mihail Ignatiev
Mihail Ignatiev

Reputation: 853

Get abstract underlying type in a build macro?

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

Answers (1)

Andy Li
Andy Li

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

Related Questions