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)
}
 

相关文章: