如何使用 scala 元注释获取方法 return 类型?
How to get a method return type with scala meta annotation?
我想做一个日志注释使用 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
注释中使用反射(性能成本),我认为方法结果类型可以在编译时决定。
这对于 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
理想情况下,宏应该作为最后的手段使用,而不仅仅是为了方便。
我想做一个日志注释使用 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
注释中使用反射(性能成本),我认为方法结果类型可以在编译时决定。
这对于 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
理想情况下,宏应该作为最后的手段使用,而不仅仅是为了方便。