【问题标题】:Running the ceylon typechecker from ceylon, like in typechecker/src/main/Main.java从锡兰运行锡兰类型检查器,如 typechecker/src/main/Main.java
【发布时间】:2016-10-13 17:22:58
【问题描述】:

我正在使用 run.ceylon 的 ceylon 项目运行 ceylon typechecker,run.ceylon 正是 typechecker/src/main/Main.java 的 ceylon 版本。

这个项目应该自己进行类型检查。

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

文件: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";
}

文件: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

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

这是一个全新的 ceylon 1.3.0 下载,未安装,只需从解压后的 .tar.gz 中运行即可。

类型检查器需要哪些它没有得到的额外信息?

【问题讨论】:

  • 顺便说一句,我刚刚对即将发布的 1.3.1 版本进行了一些更改,您可以在其中以更简单的方式设置类型检查器 + 模型加载器:@987654321 @

标签: module typechecking ceylon


【解决方案1】:

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

因此,为了能够对依赖于 Java 二进制文件的 Ceylon 代码进行类型检查,您需要更多的基础设施,包括我们所谓的“模型加载器”,它负责构建 Java 二进制文件 .classes 的 Ceylonic 模型。 Ceylon 生态系统中有许多不同的模型加载器——一个用于javac,一个用于 Eclipse,一个用于 IntelliJ,一个使用 Java 反射,一个用于 Dart,一个用于 typescript,一个用于 JS——它们都非常特定于特定的编译环境。

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

希望对你有帮助。

【讨论】:

  • 哦,刚刚得知getTypeChecker(getter)被改写为typeChecker(属性)。我没想到这个领域有这么多行业。属性并不总是那么容易。
  • 您好,我们对此进行了快速讨论,结果表明这可能不是一件完全简单的事情。您必须查看其中一个编译器或 IDE 的源代码才能了解所涉及的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多