scala - 解析scala宏中的类型投影
问题描述
考虑以下特征:
sealed trait Test
//Test's branches
trait Base {
type Action = Test
}
现在我需要将ClassSymbol
其Test
称为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
推荐阅读
- android - How to use different datepickers using same function by passing parameters in flutter?
- vue.js - 更改特定索引而不在 Vuejs 中重新渲染整个数组
- git - 从合并冲突评估中忽略特定行?
- flutter - 无法将动态向下转换为列表
在地图上使用时 - entity-framework - 按具有多对多关系的实体中的计数属性排序
- mongodb - 查询节点的所有后代
- mongodb - MongoDB 在使用 PL 时正确插入和查找,但记录未显示在 mongo shell 上
- java - 不能改变整型变量的值
- asp.net-core - 使用数据库优先方法在 Blazor WebAssembly 中进行身份验证和授权
- javafx - JavaFX 更改字体大小会导致小文本出现几分之一秒