Haxe:为JSON文件创建代码完成宏

时间:2016-07-02 08:34:43

标签: macros haxe code-completion

我正在尝试通过生成字段定义来实现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

1 个答案:

答案 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>])。