从锡兰运行锡兰typechecker,就像在typechecker / src / main / Main.java中一样

时间:2016-10-12 11:29:02

标签: module typechecking ceylon

我正在使用一个带有run.ceylon的ceylon项目运行ceylon类型检测程序,该项目正是typechecker / src / main / Main.java的锡兰版本。

这个项目本来应该是自我攻击。

它编译时没有错误,但在运行时无法加载类型检查的依赖项。

file:source / com / example / withmodule / module.ceylon

native("jvm")
module com.example.withmodule "1.0" {
    import com.redhat.ceylon.typechecker "1.3.0" ;
    //import     com.redhat.ceylon.module-resolver "1.3.0";
}

file:source / com / example / withmodule / run.ceylon

import java.io{File}
import com.redhat.ceylon.cmr.api{RepositoryManager}
import com.redhat.ceylon.cmr.ceylon{CeylonUtils}
import com.redhat.ceylon.compiler.typechecker{TypeCheckerBuilder}
import com.redhat.ceylon.compiler.typechecker.io.cmr.impl{LeakingLogger}

shared void run(){

   value args = ["/absolutepath/ceylon-1.3.0/source/"];


    RepositoryManager repositoryManager = 
            CeylonUtils.repoManager()
                .systemRepo("/absolutepath/ceylon-1.3.0/repo")
                .logger( LeakingLogger())
                .buildManager();

    TypeCheckerBuilder tcb = 
              TypeCheckerBuilder()
                .setRepositoryManager(repositoryManager)
                .verbose(true)
                .statistics(true);

    for (String path in args) {
        tcb.addSrcDirectory( File(path));
    }

    tcb.typeChecker.process();
}

它编译没有错误。

但是当它运行时会产生错误:

error [package not found in imported modules: 'com.redhat.ceylon.cmr.api' (add module import to module descriptor of 'com.example.withmodule')] at 2:7-2:31 of com/example/withmodule/withmodule.ceylon
error [package not found in imported modules: 'com.redhat.ceylon.cmr.ceylon' (add module import to module descriptor of 'com.example.withmodule')] at 3:7-3:34 of com/example/withmodule/withmodule.ceylon
error [package not found in imported modules: 'com.redhat.ceylon.compiler.typechecker' (add module import to module descriptor of 'com.example.withmodule')] at 4:7-4:44 of com/example/withmodule/withmodule.ceylon
error [package not found in imported modules: 'com.redhat.ceylon.compiler.typechecker.io.cmr.impl' (add module import to module descriptor of 'com.example.withmodule')] at 5:7-5:56 of com/example/withmodule/withmodule.ceylon

这对我来说毫无意义,因为编译和类型检查在之前就已经成功了。

这是一个新的锡兰1.3.0下载,没有安装,只需从解压缩的.tar.gz运行。

typechecker需要哪些额外信息才能获得它?

1 个答案:

答案 0 :(得分:2)

所以这里的问题是我们在测试运行器typechecker/src/main/Main.java中使用的类型检查器只能理解Ceylon源代码中定义的内容。 能够读取已编译的Java .jar存档,并根据该存档中的类对您的Ceylon源代码进行类型检查。

因此,为了能够检查依赖于Java二进制文件的Ceylon代码,您需要更多的基础结构,包括我们称之为“模型加载器”,它负责构建Java二进制文件的Ceylonic模型.class es 。 Ceylon生态系统中有许多不同的模型加载器 - 一个用于javac,一个用于Eclipse,一个用于IntelliJ,一个用于Java反射,一个用于Dart,一个用于打字稿,一个用于JS-它们是所有这些都非常特定于特定的编译环境。

因此,不依赖javac,IntelliJ,Eclipse等等的Ceylon类型检查程序的测试不具备任何类型的Java互操作性。您的代码可以成功地检查Ceylon源代码中定义的内容,包括依赖于Ceylon模块的代码,其中包含Ceylon编译器生成的.src存档,但它无法对Java .jar存档中定义的内容进行类型检查。

我希望有所帮助。