Как получить метод, возвращающий тип с мета-аннотацией 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

Макросы в идеале должны использоваться как последнее средство, а не только для удобства.

Другие вопросы по тегам