Генерация вызова конструктора с помощью макроса сборки - PullRequest
0 голосов
/ 22 января 2019

Как я могу сгенерировать main() (доступ) метод для класса Haxe с помощью вызова конструктора?

Например

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().

1 Ответ

0 голосов
/ 22 января 2019

Чтобы сгенерировать вызов конструктора наподобие new App(), вы можете указать haxe.macro.TypePath, как описано здесь .

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

Btw,вместо того, чтобы вручную создавать такие поля, я бы предложил использовать reification класса , который позволяет использовать обычный синтаксис Haxe для объявления полей:

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