给定一个地图 Map
这就是我想要达到的目标:
var res = myMacroFunc(["var1"=>12, "var2"=>66]);
res == {var1: 12, var2: 66}
可能有更简洁的方法来做到这一点……但是您可以遍历数组声明中的每个表达式,使用 switch 语句来匹配
$a => $b
并生成ObjectField。将所有 ObjectFields 存储在一个数组中以创建一个 EObjectDecl。
这是 Haxe Playground 中的工作版本。
public static macro function myMacroFunc(e:haxe.macro.Expr):haxe.macro.Expr {
final objects = [];
switch (e.expr) {
// input is array decl
case EArrayDecl(values):
{
for (v in values) {
switch (v) {
// match expression of format $a => $b
case macro $a => $b: {
switch (a.expr) {
// "a" must be a string constant, so we extract that
case EConst(CString(s, _)): {
objects.push({field: s, expr: b});
}
case _: {}
}
}
case _: {}
}
}
}
case _:
{}
}
return {
pos: e.pos, // re-use input position
expr: EObjectDecl(objects) // pass to EObjectDecl
};
}