我正在尝试通过生成字段定义来实现JSON文件的代码完成宏
var classOfChild = Type.getClass(child); // `child` may look like this array: [[1,2,3],[0.1,0.2,0.3]]
fields.push({
"name": childName,
"pos" : _pos,
"kind": childType,
});
我已经观看了一些视频并阅读了一些相关教程,但没有关于如何从ComplexType
结果中获取Type.typeof(object)
的信息。
我尝试的代码不起作用:
//"kind": childType,
//"kind": childType.toString(),
//"kind": FVar(macro {childType.toString(); }),
//"kind": FVar(macro Array<$v{arrType}>)
但它们都没有奏效(所有这些都引起了一些错误或)
编辑1:这是我的json数据:
{"floatVar1":0.1, "str":"some string", "nullValueObject":null, "arrayOfInts":[11,20,9], "matrixLikeArray":[[14, 12, 13, 11, 18]], "floatMatrix":[[14.4, 12.3, 13.7, 11.9, 18.0]], "symbolPayouts":[0.05], "objectInObject":{"prop1":"some str", "prop2": "some str2", "prop3":10.17, "prop4":[[1,2,3],[19.3,20.4]]}}
我想为prop4
,("prop4":[[1,2,3],[19.3,20.4]]
)
编辑2:我已经想出了如何为简单类型("kind": FVar(macro:Dynamic)
)和对象(kind : FVar(TAnonymous( jsonFields ))
)创建“种类”。但是如何为数组,数组数组等做到这一点
编辑3:代码gist.github.com
答案 0 :(得分:1)
使用宏生成代码时,很容易尝试生成效率不高的东西,并且通过尝试定义显式类型来确实进行了跟踪。
根据您的要点,您只需要定义一个json
字段并将其作为字段值的JSON文件的内容提供给它,就好像您将值定义为Haxe文字对象一样
然后你的目标是生成一些你可以写成的东西:
private var json = { prop1:'hello', prop2:42, prop3:[1,2,3] };
haxe编译器将强烈键入此json
字段。
要实现这一点,您的宏只需添加一个字段,其中包含从JSON文件中获取的初始值;同样,Haxe编译器将严格键入它。
创建一个具有由编译器推断的类型的变量只是FVar(null, valueExpr)
,这意味着你的整个宏可以简化为:
var fields = Context.getBuildFields();
var json = Json.parse(src);
fields.push({
name : "json",
pos : Context.currentPos(),
kind : FVar(null, macro $v{json}),
access: [APrivate],
});
return fields;
对于更详细的版本,我可以向您指出以下要点:ResourceGenerator.hx将生成递归“无法使用”和dce友好的对象。
PS:遗憾的是你的"prop4":[[1,2,3],[19.3,20.4]]
是不可能的,因为它会被编译器视为不兼容类型的数组([Array<Int>, Array<Float>]
)。