首页 > 解决方案 > 解析scala宏中的类型投影

问题描述

考虑以下特征:

sealed trait Test

//Test's branches

trait Base {
    type Action = Test
}

现在我需要将ClassSymbolTest称为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,这绝对是一门课。

ClassSymbol有没有办法通过类型投影从宏实现中引用它?

标签: scalametaprogrammingscala-macrostype-projection

解决方案


先试取一棵树的类型

tq"$actionType".tpe.typeSymbol.asClass

推荐阅读