macros - 使用构建宏生成构造函数调用

标签 macros haxe

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

例如

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;
    }
}
@:build(Build.buildFields())
class App {
    function new() {
        //....
    }
}

这可以很好地生成 main() 方法,但我不确定如何生成 new App() 而不是诉诸于 Type.createInstance( )

最佳答案

要生成像 new App() 这样的构造函数调用,您可以具体化 haxe.macro.TypePath如记录here .

var typePath:haxe.macro.TypePath = {
    pack: cls.pack,
    name: cls.name
}
expr: macro new $typePath(),

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

fields = fields.concat((macro class {
    public static function main() {
        new $typePath();
    }
}).fields);

关于macros - 使用构建宏生成构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54304292/

相关文章:

java - 为什么Java没有宏?

c++ - 意外的宏观评估

c++ - 为什么很多cache.h文件中使用 '#define alloc_nr(x) (((x)+16)*3/2)'宏?

macros - Haxe 自定义元数据到宏调用

haxe - 尝试安装 OpenFL - haxelib 返回无效操作

重新定义 C 宏

c++ - 使用 enum 来确定返回结果的类型(使用 Macro 的 hack)

abstract - 实现 Set<T>

actionscript-3 - FlashDevelop 和 Flash 11 孵化器

macos - 是否可以使用 haxe 构建 mac 原生应用程序?