提取ClassSymbols作为方法的参数范围

问题描述

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

我想到的“解决方案”:

宏注释实现:

@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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...