在 Scala 宏中解析类型投影
Resolve type projection in scala macro
考虑以下特征:
sealed trait Test
//Test's branches
trait Base {
type Action = Test
}
现在我需要得到 Test
的 ClassSymbol
,将其称为 Base#Action
。
这是我的尝试:
def macroImpl[B <: Base: c.WeakTypeTag](c: blackbox.Context): c.Tree = {
import c.universe._
val baseType = weakTypeOf[B].typeSymbol.asType
val actionType = c.typecheck(tq"$baseType#Action", mode = c.TYPEMode)
println(tq"$actionType") //prints pack.age.Base#Action
println(tq"$actionType".symbol) //prints type Action
println(tq"$actionType".symbol.asClass) //raises scala.ScalaReflectionException: type Action is not a class
}
在我的例子中 Base#Action = Test
这绝对是 class.
有没有办法通过类型投影从宏实现中引用它的ClassSymbol
?
先尝试取树的类型
tq"$actionType".tpe.typeSymbol.asClass
考虑以下特征:
sealed trait Test
//Test's branches
trait Base {
type Action = Test
}
现在我需要得到 Test
的 ClassSymbol
,将其称为 Base#Action
。
这是我的尝试:
def macroImpl[B <: Base: c.WeakTypeTag](c: blackbox.Context): c.Tree = {
import c.universe._
val baseType = weakTypeOf[B].typeSymbol.asType
val actionType = c.typecheck(tq"$baseType#Action", mode = c.TYPEMode)
println(tq"$actionType") //prints pack.age.Base#Action
println(tq"$actionType".symbol) //prints type Action
println(tq"$actionType".symbol.asClass) //raises scala.ScalaReflectionException: type Action is not a class
}
在我的例子中 Base#Action = Test
这绝对是 class.
有没有办法通过类型投影从宏实现中引用它的ClassSymbol
?
先尝试取树的类型
tq"$actionType".tpe.typeSymbol.asClass