Запуск проверки типов Ceylon из Ceylon, как в typechecker/src/main/Main.java

Я запускаю цейлонскую проверку типов из цейлонского проекта с run.ceylon, который является цейлонской версией typechecker/src/main/Main.java.

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

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

файл: 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.

Какая дополнительная информация нужна программе проверки типов, которой у нее нет?


person Michael    schedule 12.10.2016    source источник
comment
Между прочим, я только что внес некоторые изменения в готовящуюся к выпуску версию 1.3.1, в которой вы сможете настроить проверку типов + загрузчик модели более простым способом: gist.github.com/quintesse/004e33e84553abd75412ceb3d164bf4a   -  person Quintesse    schedule 25.10.2016


Ответы (1)


Итак, проблема здесь в том, что средство проверки типов, которое мы используем в тестировщике typechecker/src/main/Main.java, способно понимать только то, что определено в исходном коде Ceylon. Он не может прочитать скомпилированный архив Java .jar и проверить исходный код Ceylon на соответствие классам в этом архиве.

Таким образом, чтобы иметь возможность проверять код Ceylon, который зависит от двоичных файлов Java, вам потребуется дополнительная инфраструктура, включая то, что мы называем «загрузчиком модели», который отвечает за построение цейлонской модели двоичного файла Java .classes. В экосистеме Ceylon существует несколько различных загрузчиков моделей: один для javac, один для Eclipse, один для IntelliJ, один использует отражение Java, один для Dart, один для typescript, один для JS, и все они очень специфичны для конкретной среды компиляции. .

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

Надеюсь, это поможет.

person Gavin King    schedule 13.10.2016
comment
О, я только что узнал, что getTypeChecker (геттер) переписывается в typeChecker (атрибут). Я не ожидал, что в этой области будет так много промышленности. Атрибуты не всегда даются легко. - person Michael; 13.10.2016
comment
Привет, мы быстро обсудили это, и в результате выяснилось, что это, вероятно, не совсем простая вещь. Вам нужно будет взглянуть на исходный код одного из компиляторов или IDE, чтобы понять, о чем идет речь. - person Gavin King; 17.10.2016