Macros 使用生成宏生成构造函数调用

Macros 使用生成宏生成构造函数调用,macros,haxe,Macros,Haxe,如何通过构造函数调用为Haxe类生成main()(access)方法 比如说 static function main() new App() function new() { //.... } 我想用宏创建这个,如下所示: import haxe.macro.Context; import haxe.macro.Expr; class Build { macro public static function buildFields():Array<Field>

如何通过构造函数调用为Haxe类生成
main()
(access)方法

比如说

static function main() new App()

function new() {
    //....
}

我想用宏创建这个,如下所示:

import haxe.macro.Context;
import haxe.macro.Expr;

class Build {
    macro public static function buildFields():Array<Field> {
        var fields:Array<Field> = Context.getBuildFields();
        var cls = Context.getLocalClass().get();
        var pack = cls.pack.concat([cls.name]);
        var name = pack.join(".");

        fields.push({
            name: "main",
            access: [Access.APublic, Access.AStatic],
            kind: FieldType.FFun({
                expr: macro {
                    Type.createInstance(Type.resolveClass($v{name}), []);
                },
                args: [],
                ret: null
            }),
            pos: Context.currentPos()
        });

        return fields;
    }
}

这会生成
main()
方法,但我不确定如何生成
newapp()
而不是诉诸
Type.createInstance()
来生成构造函数调用,如
newapp()
,您可以将

顺便说一句,我建议使用,而不是像那样手动构造字段,它允许您使用常规Haxe语法来声明字段:

fields = fields.concat((macro class {
    public static function main() {
        new $typePath();
    }
}).fields);
var typePath:haxe.macro.TypePath = {
    pack: cls.pack,
    name: cls.name
}
expr: macro new $typePath(),
fields = fields.concat((macro class {
    public static function main() {
        new $typePath();
    }
}).fields);