Я пишу макрос, который должен получить значение параметра конструктора по умолчанию. Этот ответ показывает, что это можно сделать, обратившись к сгенерированному компилятором методу apply$default$i
в сопутствующем объекте, где apply
— имя конструктора а i
— это индекс параметра, основанный на 1.
Однако это не работает, если макрос вызывается из самого объекта-компаньона. Предположительно, проверка типов кода в сопутствующем объекте происходит до того, как компилятор сгенерирует метод apply$default$i
.
Этот код работает (будь то написан вручную или сгенерирован макросом):
case class C(i: Int = 1)
object C
def x: Int = C.apply$default$1
Но это не так:
case class C(i: Int = 1)
object C {
def x: Int = C.apply$default$1
}
scalac жалуется, что value apply$default$1 is not a member of object C
.
Мне нужно вызвать макрос из объекта-компаньона, потому что макрос определяет неявный экземпляр класса типов.
Я мог бы сгенерировать код, который во время выполнения будет использовать отражение для доступа к методу apply$default$i
. Но это неэлегантно. Если я знаю, что компилятор сгенерирует определенный метод, как я могу получить к нему доступ в скомпилированном коде?