解析联积类型 类 因不明原因而失败

Resolving Coproduct type classes fails for obscure reasons

我正在 Android (Parcelable) 上为 Scala 构建一个小型序列化库。但我一直在努力解决 Coproduct 相关类型 classes,这些类型似乎因文件名 (?) 而失败。

我第一次遇到这个问题是在写tests的时候。有一个包含密封特征层次结构的简单文件 Animal.scala。测试编译正常,一切都按预期工作,但是一旦我将文件名更改为 ZAnimal.scala,测试套件就无法编译,因为 Coproduct 类型 class 实例无法解析任何更多

此问题仅适用于 Coproduct 类型 classes,case class 相关类型 classes 请勿中断。

不幸的是,这也影响了依赖库的项目,其中 .widget 中的 ADT 无法解析。将它们移动到 .aaa 可以解决问题。

恐怕这可能是由底层宏代码和编译器未能足够快地发现某些类型引起的(可能与 scalamacros/paradise#14 相关?)。但如果是我的库代码中的错误,我肯定更愿意。

编辑:我整理了一个 small sample project 来更准确地说明问题。

Miles Sabin 在 Gitter that this related to SI-7047 上进行了解释。

You're seeing this compiler bug (which affects all attempts to enumerate all subclasses, macro based or otherwise): https://issues.scala-lang.org/browse/SI-7046

If you put your ADT in a source file which will be compiled before the code that needs to enumerate its subclasses you should be OK.

That's usually satisfied by the ADT being in a separate module.

Lexicographic ordering of source file name has an effect on compilation order ... in particular, Animal.scala will be compiled before ZAnimal.scala.

避免此问题的安全方法是将受影响的代码移动到单独的子模块中。这样,编译器在解析使用模块中的类型 类 时发现了所有类型。