Опитвам се да извлека ClassSymbol
s за всички граници на параметрите на типа на метод.
Решението, което измислих:
Внедряване на анотации на макроси:
@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
чрез импортирано име?