macros - Haxe 宏,从生成的 var setter 调用静态方法

标签 macros haxe

我正在使用 haxe 宏向变量添加 getter 和 setter,现在我一直试图从新生成的 setter 中调用静态函数:

public static function build():Array<Field> {
//.........
// create setter
var setterBody = macro {
    $variableRef = v;
    // mypackage.MyClass.myFunc(this) <-------- DOES NOT WORK!!
    return $variableRef;
};
newFields.push({
    pos: Context.currentPos(),
    name: "set_" + field.name,
    meta: [],
    kind: FieldType.FFun({
            ret: readType,
            params: [],
            expr: setterBody,
            args: [{
                value: null,
                type: readType,
                opt: false,
                name: "v"
            }]
        }),
    doc: "",
    access: []
});

在上面的代码中,我找不到调用 MyClass.myFun(this) 的方法,我不知道如何为 setter this 生成该代码code> 指的是调用setter 的对象实例。

非常感谢。

最佳答案

如果没有更完整的示例,很难知道出了什么问题。我能做的就是向您展示有效的代码:

TiagoLrMacroTest.hx:

@:build( TiagoLrMacro.build() )
class TiagoLrMacroTest {
    public static function main() {
        var test = new TiagoLrMacroTest();
        test.name = "hello";
    }

    function new() {}

    public var name(default,set):String;
}

class MyStaticClass {
        public static function staticMethod( a:TiagoLrMacroTest ) {
        trace( a.name );
    }
}

TiagoLrMacro.hx

import haxe.macro.Expr;
import haxe.macro.Context;

class TiagoLrMacro {
    public static function build():Array<Field> {
        var fields = Context.getBuildFields();
        var setterBody = macro {
            name = v;
            TiagoLrMacroTest.MyStaticClass.staticMethod( this );
            return name;
        };
        fields.push({
            pos: Context.currentPos(),
            name: "set_name",
            meta: [],
            kind: FieldType.FFun({
                ret: macro :String,
                params: [],
                expr: setterBody,
                args: [{
                    value: null,
                    type: macro :String,
                    opt: false,
                    name: "v"
                }]
            }),
            doc: "",
            access: []
        });
        return fields;
    }
}

结果(Haxe 3.1.3):

TiagoLrMacroTest.hx:15: hello

我在宏中调用静态方法时遇到的一个常见问题是不尊重导入,因此您必须使用像 mypackage.MyClass.myFunc(this) 这样的完整类型路径,但是您已经这样做了,所以错误一定是在代码的其他地方。快乐的宏观:)

关于macros - Haxe 宏,从生成的 var setter 调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28841687/

相关文章:

javascript - vsshaxe - 如何在浏览器中调试 Javascript 目标

c - 用于 C 的 Varargs `ELEM` 宏

c++ - 调试宏与调试变量

c++ - 如何找到 Microsoft Visual C++ 中使用的编译预处理器

c++ - 如何将外部库包含到 Haxe 中?

html - 如何将 HaxeFlixel 与 openfl-bit Five 一起使用

Haxe 中的 Flash 函数重载

c++ - 如何从 clang-tidy 中的 CStyleCastExpr 匹配器获取宏名称?

macos - OpenGL/GLSL 精度误差

android - 使用 Haxe/OpenFL 在 Android/iOS 上保存应用程序数据