2016-10-12 8 views
2

Я запускаю программу-указатель ceylon из проекта ceylon с run.ceylon, который представляет собой точно такую ​​же версию ceylon typechecker/src/main/Main.java.Запуск ceylon typechecker из ceylon, как в typechecker/src/main/Main.java

Этот проект должен быть проверен самим типом.

Он компилируется без ошибок, но во время выполнения не удается загрузить зависимости для проверки типов.

файл: источник/COM/пример/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"; 
} 

файл: источник/COM/пример/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 скачать, не установлен, просто запустить из unzipped .tar.gz.

Какую дополнительную информацию требуется для тех, кто ее не получил?

+0

Btw yau, я только что внес некоторые изменения для скоро появляющейся версии 1.3.1, где вы можете несколько упростить настройку загрузчика typechecker + model: https: //gist.github .com/quintesse/004e33e84553abd75412ceb3d164bf4a – Quintesse

ответ

2

Таким образом, проблема заключается в том, что typechecker, который мы используем в тестовом бегуне typechecker/src/main/Main.java, способен понимать только то, что определено в исходном коде Цейлона. Это не, способный читать скомпилированный архив Java .jar и typecheck ваш исходный код Ceylon против классов в этом архиве.

Для того чтобы иметь возможность использовать код Ceylon, который зависит от двоичных файлов Java, вам понадобится больше инфраструктуры, включая то, что мы называем «загрузчиком модели», который отвечает за построение модели Ceylonic двоичного кода Java .class. В экосистеме Цейлона есть несколько разных модельных загрузчиков — один для javac, один для Eclipse, один для IntelliJ, тот, который использует отражение Java, один для Dart, один для машинописных, один для JS —, и все они очень специфичны для конкретную среду компиляции.

Итак, тесты для Ceylon typechecker, которые не зависят от javac, IntelliJ, Eclipse и т. Д. И т. Д., Не содержат каких-либо Java-взаимодействий. Ваш код может успешно выполнять проверку типов, определенных в исходном коде Ceylon, включая код, который зависит от модулей Ceylon с архивами .src, созданных компилятором Ceylon, но он не может проверять типы, определенные в архиве Java .jar.

Я надеюсь, что это поможет.

+0

О, я только что узнал, что getTypeChecker (getter) переписан на typeChecker (атрибут). Я не ожидал такой отрасли в этой области. Атрибуты не всегда легко. – Michael

+0

Привет, мы быстро обсудили это, и результатом было то, что это, вероятно, не совсем простая вещь. Вам нужно будет взглянуть на источник одного из компиляторов или IDE, чтобы получить представление о том, что задействовано. –