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

Haxe: Creating a code completion macro for JSON files

我正在尝试通过生成字段定义来为 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,
    });

我已经看过一些视频并阅读了一些这方面的教程,但是没有关于如何从 Type.typeof(object) 结果中得到 ComplexType 的信息。

我已经尝试过无效的代码:

                    //"kind": childType,
                    //"kind": childType.toString(),
                    //"kind": FVar(macro {childType.toString(); }),
                    //"kind": FVar(macro Array<$v{arrType}>)

但是 none 他们工作了(他们都提出了一些错误或)

编辑 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

中的代码

使用宏生成代码时,很容易尝试生成效率不高的代码,而且您确实会因为尝试定义显式类型而偏离轨道。

根据你的要点,你只需要定义一个 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 将递归生成 "inlinable" 和 dce 友好的对象。

PS:很遗憾,您的 "prop4":[[1,2,3],[19.3,20.4]] 是不可能的,因为它会被编译器视为不兼容类型的数组 ([Array<Int>, Array<Float>])。