Ceylon 版本 1.2 格式命令

Ceylon version 1.2 Format Command

我该如何解决:

命令:

$ ceylon format source/com/example/helloworld/*

异常:

Exception in thread "main" java.lang.NoSuchMethodError: ceylon.language.runtime_.getMaxArraySize()Lceylon/language/Integer;
        at ceylon.collection.Hashtable.<init>(Hashtable.ceylon:35)
        at ceylon.collection.Hashtable.<init>(Hashtable.ceylon)
        at ceylon.collection.HashMap.$default$hashtable(HashMap.ceylon:31)
        at ceylon.formatter.options.Spaces$cache_.<init>(IndentMode.ceylon:62)
        at ceylon.formatter.options.Spaces$cache_.<init>(IndentMode.ceylon)
        at ceylon.formatter.options.Spaces.<init>(IndentMode.ceylon:59)
        at ceylon.formatter.options.FormattingOptions.$default$indentMode(FormattingOptions_generated.ceylon:355)
        at ceylon.formatter.options.FormattingOptions.<init>(FormattingOptions_generated.ceylon)
        at ceylon.formatter.options.loadProfile_.loadProfile(profiles.ceylon:79)
        at ceylon.formatter.options.loadProfile_.loadProfile(profiles.ceylon)
        at ceylon.formatter.options.commandLineOptions_.commandLineOptions(formattingOptions.ceylon:125)
        at ceylon.formatter.options.commandLineOptions_.commandLineOptions(formattingOptions.ceylon)
            at ceylon.formatter.run_.run(run.ceylon:285)
   ...

我想我必须重新安装格式化程序。但是哪个版本?

无缘无故以下命令有效:

ceylon run ceylon.formatter source/com/example/helloworld/*.ceylon

哪里不一样,我该如何解决。

ceylon.language.runtime 曾经是 implemented in hand-written Java code. In this code, getMaxArraySize() accidentally returned ceylon.language.Integer,而它本应 return 编辑 long。这有效,但不太正确。

然后,在 Ceylon 1.2 的原生支持下,runtime(连同其他一些对象)被 rewritten 作为原生 Ceylon 代码。由于 Ceylon 编译器将其转换为 Java,该方法现在获得正确的 return 类型 long。新编译的模块现在将调用此方法,但针对旧 ceylon.language 编译的代码仍将尝试调用方法 returning ceylon.language.Integer,这会导致您的 NoSuchMethodError .

这里发生的事情似乎是 ceylon format 运行s ceylon.formatter/1.1.0,它是针对 ceylon.language/1.1.0 编译的,现在不能 运行 与 ceylon.language/1.2.0ceylon run ceylon.formatter 可能 运行s ceylon.formatter/1.2.0 出于某种原因,这有效。

我不确定你需要做什么来解决这个问题。我更改了 ceylon format 插件的工作方式 recently,因此您可能需要删除旧的 ceylon format 脚本(ceylon-formatceylon-format.bat 文件位于 .ceylon/bin,我相信)。希望新的已经在那里,准备接管。

试试 ceylon plugin uninstall format 看看是否能解决问题。

第二种选择是ceylon plugin install ceylon.formatter/1.2.0

ceylon format 不起作用但 ceylon run 起作用的原因是因为您安装的 ceylon format 将寻找硬编码版本 1.1 而不是compatible anymore 而 ceylon run 将查找与您正在使用的当前 Ceylon 版本兼容的任何版本。 (所以它会同时找到 1.1.0 和 1.2.0,但它会丢弃 1.1.0,因为它不兼容,因此会自动选择 1.2.0)