Haxe 宏,从生成的 var setter 调用静态方法
Haxe macros, calling static method from generated var setter
我正在使用 haxe 宏将 getter 和 setters 添加到变量,现在我无法尝试从新生成的 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
指的是调用 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)
这样的完整类型路径,但您已经在这样做了,所以错误一定是在你的代码中的其他地方。祝您宏观愉快 :)
我正在使用 haxe 宏将 getter 和 setters 添加到变量,现在我无法尝试从新生成的 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
指的是调用 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)
这样的完整类型路径,但您已经在这样做了,所以错误一定是在你的代码中的其他地方。祝您宏观愉快 :)