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};
}
}