解析 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

解决方法

首先尝试取树的类型

tq"$actionType".tpe.typeSymbol.asClass

相关问答

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