如何使用scala元注释获取方法返回类型?

时间:2017-04-25 02:22:44

标签: scala scala-meta

我想做一个日志注释使用scala meta.Usage simple as:

@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
    }
}

如何检查f1Future[ _ ]类型?由于
此外,我不想在Log注释中使用反射(性能成本),我认为方法结果类型可以在编译时决定。

1 个答案:

答案 0 :(得分:1)

使用scalameta宏注释无法做到这一点。宏注释是语法的,因此它们无法访问语义信息,例如树的类型。

PS。我不确定宏注释是否适合这种用例,你可以用这样的东西明确地写出日志语句

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
理想情况下,宏应该用作最后的手段,不仅仅是为了方便。