2015-07-20 51 views

回答

3
#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() { 

    } 
}