получение источника автоматически сгенерированных методов case-класса

Как можно получить код всех автоматически сгенерированных методов case-класса, чтобы чисто сохранить любой из них при рефакторинге в обычный (не case) класс? есть ли какой-то флаг компиляции, который показывает автоматически сгенерированные методы класса case, или какой-то другой способ, который в конечном итоге сводит это к вырезанию и вставке?

У меня сложилось впечатление, что есть флаги компиляции для автоматического раскрытия расширенных определений....


person matanster    schedule 24.04.2015    source источник
comment
По какой-то конкретной причине вам нужно провести рефакторинг класса без регистра?   -  person Arne Claassen    schedule 25.04.2015
comment
Если вы делаете это по причинам, связанным с наследованием, вы можете найти некоторые полезные мысли в stackoverflow.com/questions/12705309/   -  person Ed Staub    schedule 25.04.2015
comment
Действительно, по причинам наследования и т.п.   -  person matanster    schedule 25.04.2015


Ответы (2)


Вы можете увидеть, во что компилятор десахарирует исходный код, с помощью флагов -Xprint:<phase>. Для вашего примера (увидев, какой код генерируется для классов case), запустите:

scalac -Xprint:typer YourScala.sca

С флагом -Xshow-phases вы увидите все доступные фазы.

Но вы видите не компилируемый исходный код scala, а некое промежуточное представление.

person Chirlo    schedule 28.04.2015
comment
Вы можете получить это специально в новом обновлении внутри sbt? Что-то вроде scalacOptions := Seq("-Xprint:typer"), должно работать внутри Build.scala? - person matanster; 28.04.2015
comment
Проверьте этот ответ для этого: stackoverflow.com/questions/22354102/ - person Chirlo; 28.04.2015

Это, может быть, не так просто.

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

Вы можете прочитать сгенерированный байт-код и воссоздать код Scala для аналогичных методов вручную. Это было бы немного трудоемко, но методы относительно просты, а понимание байт-кода — это хорошая вещь.

Если где-то есть пригодный для использования декомпилятор Scala, то декомпиляция скомпилированного класса case покажет код, который вам нужен.

Учитывая, что методы зависят от полей case-класса, они вряд ли будут доступны в реализации компилятора как что-то, что можно скопировать и вставить.

Возможно, лучше всего взглянуть на спецификацию языка и реализовать методы, как описано для case-классов.

person Stefan Sigurdsson    schedule 25.04.2015
comment
Компилятор также создает промежуточные артефакты кода. - person matanster; 25.04.2015
comment
Вы имеете в виду, как AST? Это правда, но помогает ли это? - person Stefan Sigurdsson; 25.04.2015