如何在haxe中以宏模式获取导入列表?

凯文·科斯特兰

如何获取宏模式下.hx文件使用的导入列表?更具体地讲,假设我有一个“ haxe.macro.Position”,它告诉我表达式属于哪个文件。我需要知道该文件用于将诸如“ Car”之类的删节类型声明转换为诸如“ vehicles.fourWheels.Car”之类的完整程序包路径类型的导入。

李安迪

计划添加haxe 3.3:https : //github.com/HaxeFoundation/haxe/issues/3560

目前,您可以尝试直接读取源文件(如String)并import手动解析语句。

为了获得完全限定的类型名称,在上述问题中提出了一个建议

var someComplexType:ComplexType = getComplexType();
switch (Context.typeof( macro ( _ : $someComplexType )))
{
    case TInst(_.get() => c,_):
      var pack = c.pack, name = c.name;
    case _: 
}

编辑:

这是获取完全限定的类型名称的更完整的解决方案:

#if macro
import haxe.macro.*;
import haxe.macro.Expr;
import haxe.macro.Type;
#end
import haxe.ds.Option;

class Test {
    #if macro
    static public function typeToTypePath(t:Type):TypePath {
        return switch (Context.follow(t)) {
            case TInst(t, params):
                baseTypeToTypePath(t.get(), [for (p in params) TPType(Context.toComplexType(p))]);
            case TEnum(t, params):
                baseTypeToTypePath(t.get(), [for (p in params) TPType(Context.toComplexType(p))]);
            case TType(t, params):
                baseTypeToTypePath(t.get(), [for (p in params) TPType(Context.toComplexType(p))]);
            case TAbstract(t, params):
                baseTypeToTypePath(t.get(), [for (p in params) TPType(Context.toComplexType(p))]);
            case _: throw 'Cannot convert this to TypePath: $t';
        };
    }

    static function baseTypeToTypePath(t:BaseType, params:Array<TypeParam>):TypePath {
        return {
            pack:t.pack, 
            name:t.module.substring(t.module.lastIndexOf(".")+1), 
            sub:t.name,
            params:params
        };
    }

    /**
        Fully-qualify a `ComplexType`.
        For example, turn `Option<Int>` to `haxe.ds.Option.Option<StdTypes.Int>`.
        In case the process fail, it will return the input `ComplexType`.
    */
    static public function qualifyComplexType(ct:ComplexType):ComplexType {
        var type = Context.typeof(macro ( null : $ct ));
        try {
            var tp = typeToTypePath(type);
            return TPath(tp);
        } catch(e:Dynamic) {
            return ct;
        }
    }
    #end

    /**
        Just an example to demostrate `qualifyComplexType`.
        It accepts an `e` expression in the form of `var _:Type`,
        and trace the fully-qualified name of `Type` at compile-time.
    */
    macro static public function printType(e:Expr):Expr {
        switch (e) {
            case macro var a:$ct:
                trace(ComplexTypeTools.toString(qualifyComplexType(ct)));
            case _:
        }
        return e;
    }


    static function main() {
        printType(var a:Int);          //StdTypes.Int
        printType(var a:Test);         //Test.Test
        printType(var a:Option<Int>);  //haxe.ds.Option.Option<StdTypes.Int>
        printType(var a:Void->Void);   //Void -> Void
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在php中插入列表?

来自分类Dev

如何在 WTForms 中输入列表?

来自分类Dev

如何导入列表项?

来自分类Dev

在Haxe中,如何在宏中读取变量名?

来自分类Dev

如何在python中的列表中插入列表

来自分类Dev

从Excel中的导入列表制作表格

来自分类Dev

如何在Python中将数据动态插入列表中?

来自分类Dev

在组织模式表中嵌入列表?

来自分类Dev

如何在保留名称的同时将多个文件导入列表?

来自分类Dev

从.txt导入列表

来自分类Dev

如何在Stata中的宏中存储长名称列表?

来自分类Dev

如何将Webview数据导入列表视图

来自分类Dev

从python中的单独文件导入列表变量

来自分类Dev

如何加入列表中的某些项目

来自分类Dev

如何加入列表中的细分

来自分类Dev

如何从嵌入列表中删除项目?

来自分类Dev

如何更新嵌入列表中的项目?

来自分类Dev

如何在C++中的给定索引处插入列表中的项目

来自分类Dev

Python 3〜如何从csv文件中获取行并将其放入列表

来自分类Dev

如何在Rust中导入宏?

来自分类Dev

如何在Excel宏中获取对象变量的数据成员?

来自分类Dev

如何在Excel宏中获取对象变量的数据成员?

来自分类Dev

如何在宏中获取智能指针的类型?

来自分类Dev

在Haxe中,如何读取宏内的变量名?

来自分类Dev

如何在大熊猫中写入加入列表的结果?

来自分类Dev

如何在嵌入列表中查找具有匹配字段的所有文档

来自分类Dev

如何在每个第n个索引处将字符串放入列表中?

来自分类Dev

在 React 中,如何在渲染输入列表时绑定输入的值?

来自分类Dev

在XQuery中,如何获取导入模块中的功能列表?

Related 相关文章

热门标签

归档