Как получить метод, возвращающий тип с мета-аннотацией scala?
Я хочу сделать аннотацию журнала, используя scala meta.Usage просто, как:
@Log
def f1(a: Int) {
Future(a + 1) //result is a Future
}
// after parsed ====>
def f1(a: Int) {
Future(a + 1).map{x =>
println(x)
x
}
}
Как я могу проверить, если f1
это Future[ _ ]
тип? Спасибо
Кроме того, я не хочу использовать отражение (стоимость исполнения) в Log
аннотации, и я думаю, что тип результата метода может быть решен во время компиляции.
1 ответ
Решение
Это невозможно при использовании аннотаций скалярных макросов. Макроаннотации являются синтаксическими, поэтому у них нет доступа к семантической информации, такой как типы деревьев.
PS. Я не уверен, подходит ли аннотация макроса для этого варианта использования, вы могли бы явно написать оператор log чем-то вроде этого
def log[T](x: T): T = { println(x); x }
Future(1).map(log)
или даже более кратко с помощью метода расширения
implicit class XtensionFuture[T](future: Future[T]) {
def logged: Future[T] = future.map(log)
}
Future(1).logged
Макросы в идеале должны использоваться как последнее средство, а не только для удобства.