https://mp.weixin.qq.com/s/so-2x5KLfYF0IMCCqNThwQ
简单调试ValName实现;
1. 使用
Desugar之后如下:
这里补上了省略掉的implicit parameter,如下:
2. 实现
ValName的实现如下:
ValNameImpl的实现如下:
3. 提取
ValName和ValNameImpl实现相对独立,可以提取出来单独调试。
新建一个项目。因为ValNameImpl的实现使用了宏,所以需要单独处在一个编译单元(compile unit)中,在Intellij IDEA中为另一个module。需要在Module之间添加依赖。
ValNameImpl:
有一处需要调整;
ValName实现如下:
4. 调试
运行结果如下:
如下使用方式编译不通过:
5. 总结
ValName需要在一个节点变量定义中使用,如下:
)
6. 附录
ValNameImpl:
freechips.rocketchip.macros
macros
scala.reflect.macros.blackbox.Context
)
ValNameImpl
{
detail
[ValNameImpl] = {
c.universe._
] =
s +: allOwners(s.owner)
terms = allOwners(c.internal.enclosingOwner).filter(_.isTerm).map(_.asTerm)
).map { s =>
)
}
))
}
}
ValName:
freechips.rocketchip.diplomacy
macros
freechips.rocketchip.macros.ValNameImpl
)
ValName
{
(x.name)
}