Разрешение классов типа Coproduct не удается по неясным причинам

Я собираю небольшую библиотеку сериализации для Scala на Android (Parcelable). Но я продолжаю бороться с разрешением классов типов, связанных с Coproduct, которые, похоже, терпят неудачу в зависимости от имен файлов (?).

Я впервые столкнулся с проблемой, когда писал тесты. Существует простой файл Animal.scala, содержащий запечатанную иерархию признаков. Тесты компилируются нормально, и все работает, как задумано, но как только я изменяю имя файла, например, на ZAnimal.scala, набор тестов не компилируется, потому что экземпляры класса типа Coproduct больше не могут быть разрешены.

Эта проблема характерна только для классов типов Coproduct, классы типов, связанные с классом case, не нарушаются.

К сожалению, это также влияет на проекты, которые зависят от библиотеки, в которой АТД в .widget не разрешаются. Перемещение их в .aaa устраняет проблему.

Боюсь, это может быть вызвано базовым кодом макроса и тем, что компилятору не удается достаточно быстро обнаружить определенные типы (возможно, это связано с scalamacros/paradise#14?). Но я бы определенно предпочел, чтобы это была ошибка в коде моей библиотеки.

Изменить: я собрал небольшой пример проекта, который более точно иллюстрирует проблему.


person Taig    schedule 15.12.2015    source источник


Ответы (1)


Майлз Сабин объяснил на Gitter, что это связано с SI-7047.

Вы видите эту ошибку компилятора (которая влияет на все попытки перечислить все подклассы, основанные на макросах или иным образом): https://issues.scala-lang.org/browse/SI-7046

Если вы поместите свой ADT в исходный файл, который будет скомпилирован перед кодом, который должен перечислять его подклассы, все будет в порядке.

Обычно это достигается тем, что АТД находится в отдельном модуле.

Лексикографический порядок имени исходного файла влияет на порядок компиляции... в частности, Animal.scala будет скомпилировано раньше ZAnimal.scala.

Безопасный способ избежать этой проблемы — переместить затронутый код в отдельный подмодуль. Таким образом, компилятор обнаружил все типы при разрешении классов типов в потребляющем модуле.

person Taig    schedule 18.12.2015