Предлагает ли экосистема Scala.js какие-либо способы расширения или замены автоматически сгенерированных методов установки / мутатора для полей свойств классов scala?
Пожалуйста, рассмотрите приложение Scala.js с большой и постоянно растущей библиотекой простых и case-классов, которые смешанно используют автоматически сгенерированные и определяемые вручную свойства. Более того, многие из этих типов данных поступают из внешних библиотек, как с открытым, так и с закрытым исходным кодом.
Новые требования, специфичные для предметной области, ввели общесистемные ограничения на методы установки / мутатора всех этих типов.
В менее совместном проекте можно было бы представить, как вручную вводить ограничения в каждый метод установки / мутатора каждого класса. Такой человек должен также представить сопутствующий и подверженный ошибкам процесс замены каждого автоматически сгенерированного свойства на свойство, написанное от руки. Лучше не представлять себе это, но здесь такие размышления приводят к кошмарам попыток заставить всех сопровождающих каждой вспомогательной библиотеки взяться за это как скучно. Кроме того, переопределение автоматически сгенерированных методов доступа не будет работать из-за:
К счастью, эксперименты с выборкой пораженных типов дали надежду.
Код, удовлетворяющий общесистемному ограничению, соответствует всем признакам этого термина: шаблон, за исключением одного. От метода к методу код меняется только публичным именем рассматриваемого свойства. Забудьте о регулярных выражениях, найдите и замените из самых примитивных текстовых редакторов, которые могут отлично сгенерировать каждую требуемую строку кода.
Как тогда можно было бы расширить автоматически сгенерированные методы установки / мутатора для свойств scala всех классов, которые наследуются от определенного признака, без изменения исходного кода самих классов? Последствия? Аннотации? Макросы? Плагины SBT? Генераторы источников? Плагины компилятора?
В качестве альтернативы, если сами типы не могут неявно наследовать эту функциональность, может ли какой-либо процесс генерировать идентичные определения классов, размещенные в разных, но предсказуемых местах на пути к классам?
Спасибо за внимание!