@:op(a.b)这里描述了这个功能:https://haxe.io/releases/3.3.0/
我有May<T>一个用于null安全的摘要.这是它的简化版本:
package;
import haxe.macro.Expr;
abstract May<T>(Null<T>) from(Null<T>){
// convert T, Null<T> or May<T> to May<T>
// accepts Null<T because of 'from(Null<T>)'
// accepts T because Null<T> has 'from(T)'
// we need to accept May<T> to avoid returning May<May<T>> from resolve() if field is already a May
public static inline function from<T>(t:May<T>):May<T> return t;
public inline function exist():Bool return this != null;
public inline function unwrap():T return exist() ? unsafeUnwrap() : throw 'unwrap null'; …Run Code Online (Sandbox Code Playgroud) 我想创建一个宏,为我的类添加一个字段,并且字段值应该是Class<T>它们所在的类.这是我的最小示例,它不会使用此错误进行编译:
src/Base.hx:3:字符2-11:未知标识符:foo.Foo
但是如果我Foo从包foo转移到root包,那么它就会编译并运行.
Main.hx
import foo.Foo;
class Main
{
static function main()
{
trace(Foo.data);
}
}
Run Code Online (Sandbox Code Playgroud)
Build.hx
import haxe.macro.Context;
import haxe.macro.Type;
import haxe.macro.Expr;
class Build
{
macro static public function build(DataClass):Array<Field>
{
var cls = Context.getLocalClass().get();
var pack = cls.pack.concat([cls.name]);
var name = pack.join(".");
trace(name);
var expr = {
expr: ExprDef.EConst(Constant.CIdent(name)),
pos: Context.currentPos()
}
var newFieldCls = macro class {
public static var data:Class<Dynamic> = $expr;
}
var fields = Context.getBuildFields();
return fields.concat(newFieldCls.fields);
} …Run Code Online (Sandbox Code Playgroud) 我有从未在其他代码中直接提及的类,但只能使用Type.resolveClass.我希望它们被编译并包含在应用程序中,但我无法知道如何做到这一点.我认为@:keep(或@:keepSub)正是为了这个,但它不能像我预期的那样工作.这就是我做的:
Main.hx:
package;
//import Foo; //uncomment this line to make it work
class Main {
static function main() trace(Type.resolveClass('Foo'));
}
Run Code Online (Sandbox Code Playgroud)
Foo.hx:
package;
@:keep class Foo {}
Run Code Online (Sandbox Code Playgroud)
但这个痕迹null(我已经测试过JS和Flash)即使我用-dce no它编译仍然有痕迹null.
不确定这是编译器问题还是我不明白它是如何工作的.
我需要找出为什么某些模块被包含在编译中.有些类不应该包含在内,我认为有一些未使用的导入或坏架构需要不必要的导入.有没有办法找到哪些模块导入某个模块,哪些模块导入包含该模块的这些模块,等等,跟踪到主应用程序类?
是否可以将我的类型构建宏应用于项目中的所有类而无需修改其代码?
我正在尝试实现一个基于Haxe宏的调试器:基本上我在类的每个函数中的每个表达式之间调用我的函数.目前我有一个接口IDebuggable,只有实现该接口的类中的代码才能在断点处停止.
考虑以下代码:
var t: {a: Int} = {a:100, b:200};
Run Code Online (Sandbox Code Playgroud)
它不会编译错误: { b : Int, a : Int } has extra field b
但是这段代码编译得很好:
class Foo {
public var a: Int = 100;
public var b: Int = 200;
public function new() {}
}
...
var t: {a: Int} = new Foo();
Run Code Online (Sandbox Code Playgroud)
为什么第一个案件被禁止?
如果有一些额外的字段会出现什么问题?如果出现问题,为什么他们被允许进入第二种情况.