【问题标题】:Haxe: Creating a code completion macro for JSON filesHaxe:为 JSON 文件创建代码完成宏
【发布时间】:2016-11-04 14:51:51
【问题描述】:

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

但它们都不起作用(它们都引发了一些错误或)

编辑 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中的代码

【问题讨论】:

标签: macros haxe code-completion


【解决方案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&lt;Int&gt;, Array&lt;Float&gt;])。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多