用于 Haxe4 的 js-kit

如何解决用于 Haxe4 的 js-kit

我正在尝试使用 hxnodejs 和 js-kit 来构建我的应用程序。但是 js-kit 在 haxe 升级到版本 4 之前似乎停止了维护。我解决了其中的一些问题,但卡在了最后一个:

js-kit/git/npm/Package.hx:74:第 74-80 行:警告:外部非内联函数可能没有表达式

该应用程序在一周前可以运行,但上次 git 更新了 js-kit,然后不再运行。有人(可能擅长宏)可以帮我解决这个问题吗?

package npm;

#if macro
import haxe.Json;
import haxe.macro.Compiler;
import haxe.macro.Context;
import haxe.macro.Expr;
import haxe.macro.Expr.Field;
import sys.io.File;
#end

private typedef Pack = {
    name : String,?version : String
}

#if !macro extern #end
class Package {

    static var dependencies : #if haxe3 Map<String,String> #else Hash<String> #end;

    #if macro
    public static function export( path : String = "package.json" ) : Void{
        Context.onGenerate( function(_){
            if( dependencies == null ) return;
            var data : Dynamic = {}

            if( sys.FileSystem.exists(path) ){
                data = Json.parse( File.getContent(path) );
            }

            if( data.dependencies == null ){
                data.dependencies = {};
            }else{
                switch(Type.typeof(data.dependencies)){
                    case TObject: // fine
                    default: data.dependencies = {};
                }
            }

            for( name in dependencies.keys() ){
                Reflect.setField( data.dependencies,name,dependencies.get(name) );
            }

            var content =  haxe.Json.stringify( data,null,"\t" );
            sys.io.File.saveContent( path,content );

        });
    }
    #end

    #if haxe3 macro #else @:macro #end public static function require( name : String,?version : String = "*",?isNpm : Bool = true,?native : String = null ) {

        var nameExpr = Context.makeExpr( name,Context.currentPos() );

        if( isNpm )
            addDependency( name,version );

        var outp = macro __js__("require")( $nameExpr );

        if( native != null ){
            for( p in native.split(".") ){
                var pExpr = Context.makeExpr( p,Context.currentPos() );
                outp = macro $outp[$pExpr];
            }

        }

        return macro untyped $outp;

    }

    public static function addDependency( name : String,version : String ) : Void {
        if( dependencies == null ){
            dependencies = new #if haxe3 Map #else Hash #end();
        }
        
        dependencies.set( name,version );
    }

    #if haxe3 macro #else @:macro #end public static function resolve( expr,path : String ) {
        for( p in path.split(".") ){
            var pExpr = Context.makeExpr( p,Context.currentPos() );
            expr = macro $expr[$pExpr];
        }

        return macro $expr;
    }


}

#if !macro extern #end class Include {

    #if macro
    static var requireId = 0;
    static inline var NPM_DONE_META = ':npm_done';
    static inline var USAGE = "Usage: 'implements npm.Require<\"module-name\",\"module-version\">'";
    static inline var NPM_REQUIRE = "npm.Package.Require";
    static inline var NPM_REQUIRE_NAMESPACE = "npm.Package.RequireNamespace";
    static inline var NPM_OPTION_FULL_PATH = "npm_full_path";
    static inline var JS_NODE_PACKAGE  = 'js.node';
    static inline var SEP = "__";
    static inline var INIT = "__init__";
    static inline var NO_JS_REQUIRE = "noJsRequire";
    #end

    #if haxe3 macro #else @:macro #end public static function build() : Array<Field>{

        var cl = Context.getLocalClass().get();
        var fields = Context.getBuildFields();
        var required : Pack = null;
        var requireNS = false;
        var pos = Context.currentPos();
        var isNpm = !( cl.pack.slice(0,2).join('.') == JS_NODE_PACKAGE );

        // see if the type has already been processed
        if( cl.meta.has(NPM_DONE_META) )
            return fields;

        // mark the type as processed
        cl.meta.add( NPM_DONE_META,[],pos );

        // extract infos from the implemented interfaces
        /*t.module == NPM_PACKAGE_MODULE
                && ( t.name == NPM_CLASS_REQUIRE || t.name == NPM_CLASS_REQUIRE_NAMESPACE ) */

        var requireParams = util.Macro.extractStringParams( cl,NPM_REQUIRE );
        if( requireParams.length == 0 ){
            requireParams = util.Macro.extractStringParams( cl,NPM_REQUIRE_NAMESPACE );
            requireNS = true;
        }

        if( requireParams.length > 0 ){

            required = {
                name : requireParams[0][0],version : requireParams[0][1]
            };

            // exclude local files
            isNpm = isNpm && !( StringTools.startsWith(required.name,'/') || StringTools.startsWith(required.name,'./') );

            // set the generated class name
            var clName = if( !Context.defined( NPM_OPTION_FULL_PATH ) )
                // if minified
                cl.name+SEP+(requireId++);
            else
                // if not,use the class' full path
                cl.pack.join(SEP) + SEP+cl.name;

            // initialization expressions
            var init = [];

            // use the type name by default
            var nativeClass = cl.name;

            if( requireNS ){
                // if the package is a namespace

                // check for :native class name
                var _nativeName = util.Macro.extractNative( cl );
                if( _nativeName != null ){
                    nativeClass = _nativeName;
                }
            }

            if( !Context.defined(NO_JS_REQUIRE) ) {

                var params = [macro $v{required.name}];
                if( requireNS ) {
                    params.push( macro $v{nativeClass} );
                }
                cl.meta.add(":jsRequire",params,pos);
                cl.meta.remove(":native");

                if( isNpm ) 
                    npm.Package.addDependency('${required.name}','${required.version}');

            }else{

                if( requireNS )
                    init.push( macro var $clName = untyped npm.Package.resolve( npm.Package.require( '${required.name}','${required.version}',$v{isNpm} ),'${nativeClass}' ) );
                else
                    init.push( macro var $clName = untyped npm.Package.require( '${required.name}',$v{isNpm} ) );

                // change the class' native name
                var native = 'require("${required.name}")';
                if( requireNS ){
                    native = native + '.${nativeClass}';
                }
                native = '($clName||' + native + ')';

                cl.meta.add(":native",[macro $v{native}],pos);

                // inject the initiatization code in __init__
                var injected = false;

                // check that __init__ method already exists
                for( f in fields ){
                    if( f.name == INIT ){
                        switch( f.kind ){
                            case FFun( fun ) :
                                injected = true;
                                // add the existing __init__ body in the end of the generated init expression
                                init.push( { expr : fun.expr.expr,pos : fun.expr.pos } );
                                var newExpr = {
                                    pos : fun.expr.pos,expr : EBlock(init)
                                };
                                fun.expr = newExpr;
                            default :
                        }
                    }
                }

                // if __init__ doesn't exist,just add the whole method
                if( !injected ){
                    var f = {
                        name : INIT,pos : pos,meta : [],access : [AStatic],kind : FFun({
                            ret : TPath({
                                name : "Void",pack : [],params : [],sub : null
                            }),args : [],expr : {
                                pos : pos,expr : EBlock(init)
                            }
                        })
                    };
                    fields.push(f);
                }
            }

        }

        return fields;
    }

}

@:autoBuild(npm.Include.build())
#if (haxe_ver >= 3.3)
extern interface Require<@:const P,@:const V> {}
#else
extern interface Require<Const,Const> {}
#end


@:autoBuild(npm.Include.build())
#if (haxe_ver >= 3.3)
extern interface RequireNamespace<@:const P,@:const V> {}
#else
extern interface RequireNamespace<Const,Const> {}

#end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res