查找符号在宏扩展点是否可见或阴影

Finding whether a symbol is visible or shadowed at the point of macro expansion

我有一个 Symbol 并想检查它在宏扩展点是否可见或被遮蔽(例如通过局部变量),以便在准引号中拼接符号名称不引用别的东西。

查看 http://docs.scala-lang.org/overviews/reflection/annotations-names-scopes.html,一个想法是查看封闭的词法范围并检查它们是否包含具有相同名称的符号;问题是我找不到获取宏的直接封闭范围的方法。

基于 som-snytt 对 scala-user 的回复的解决方案:

symbol.pos == c.typecheck(q"${symbol.name.toTermName}").symbol.pos

(我不得不比较位置,因为在我的一项测试中,尽管名称、所有者和位置相同,但符号并不相等。)