Haxe: собрать некоторые данные в макросах сборки и затем передать эту информацию во время выполнения

Я хочу собрать некоторые данные во время создания типа, а затем передать эту информацию во время выполнения.

Например, я хочу назначить каждому типу идентификатор, а затем иметь возможность найти тип по идентификатору во время выполнения.

У меня есть рабочий пример, но он основан на том, что мой макрос выражения вызывается после макроса сборки. Могу ли я рассчитывать на это в этом случае? (Я знаю, что в общем случае это не так)

Любые другие решения?

#if macro
import haxe.macro.Context;
import haxe.macro.Expr;
#end


#if !macro
class Main 
{

    static function main() 
    {
        trace(TypeId.idByClass);
        trace(TypeId.classById);
    }

}


@:autoBuild(TypeId.collectData())
class Base
{
}

class Foo extends Base
{}

class Bar extends Base
{}
#end

class TypeId
{
    #if !macro
    public static var idByClass = getTypes(false);
    public static var classById = getTypes(true);
    #end

    #if macro
    private static var idMap = new Map<String, Int>();
    private static var nextId = 0;

    public static function collectData()
    {
        var localClass = Context.getLocalClass().get();
        var localClassName = localClass.pack.concat([localClass.name]).join(".");
        if (!idMap.exists(localClassName))
            idMap[localClassName] = nextId++;

        return Context.getBuildFields();
    }
    #end

    macro private static function getTypes(byId:Bool)
    {
        var idByClass = new Array<Expr>();
        var classById = new Array<Expr>();
        for (key in idMap.keys())
        {
            idByClass.push(macro $v{key} => $v{idMap[key]});
            classById[idMap[key]] = macro $v{key};
        }

        if (byId)
            return macro $a{classById};
        else
            return macro $a{idByClass};
    }
}

0 ответов

Другие вопросы по тегам