提取方法参数边界的类符号



我正在尝试为方法的所有类型参数的边界提取ClassSymbols。

";解决方案";我想出了:

宏注释实现:

@compileTimeOnly("Compile-time only annotation")
class classSyms extends StaticAnnotation {
def macroTransform(annottees: Any*): Any = macro impl
}
object classSyms {
def impl(c: whitebox.Context)(annottees: c.Tree*) = {
import c.universe._
annottees.toList foreach {
case q"$mods def $templatename[..$typeparams](...$paramss): $tpt = $body" =>
typeparams foreach {
case q"$mods type $name[..$tparams] >: $low <: $high" =>
if (!high.isEmpty) {
//requires FQCN, does not work with imported names
val classSymbol = c.mirror.staticClass(high.toString)
println(classSymbol)
}
}
}
q"..$annottees"
}
}

示例

package pack.age
trait Test
package another.pack.age
import pack.age._
trait Bar{
@classSyms
def foo[M <: pack.age.Test, T](): Unit //works ok

@classSyms
def baz[M <: Test, T](): Unit //throws scala.ScalaReflectionException: class Test not found.
}

问题是,将完全限定类名指定为参数绑定的要求并不能使此宏实现非常有用(没有人想写这么长的fqcn内容,尤其是在导入名称的情况下(。

是否可以通过导入的名称提取ClassSymbol

尝试使用c.typecheck

更换

val classSymbol = c.mirror.staticClass(high.toString)

带有

val classSymbol = c.typecheck(tq"$high", mode = c.TYPEmode).symbol.asClass

相关内容

  • 没有找到相关文章

最新更新