在Scala refelection库中,是否有其他方法替代不推荐使用的enclosingClass方法?

在Scala refelection库中,是否有其他方法替代不推荐使用的enclosingClass方法?,scala,scala-macros,Scala,Scala Macros,我正在编写一个宏来获取封闭的val/var定义。我可以得到封闭的val/var符号,但无法得到定义树。这里有一个解决方案建议使用封闭类: 但所有封闭的树型API都不推荐使用: 是否有办法实现封闭类的功能?或者从符号中获取树?不推荐的原因如下 从Scala 2.11.0开始,使用API来获取封闭的树 当前宏应用程序已弃用,原因是什么 这是双重的。首先,我们希望朝着科学哲学的方向发展 本地扩展宏,因为它已被证明对 理解代码。第二,在当前的 scalac,我们无法让c.enclosingTree风格的

我正在编写一个宏来获取封闭的
val/var
定义。我可以得到封闭的
val/var
符号,但无法得到定义树。这里有一个解决方案建议使用
封闭类
: 但所有封闭的树型API都不推荐使用:
是否有办法实现
封闭类的功能?或者从符号中获取树?

不推荐的原因如下

从Scala 2.11.0开始,使用API来获取封闭的树 当前宏应用程序已弃用,原因是什么 这是双重的。首先,我们希望朝着科学哲学的方向发展 本地扩展宏,因为它已被证明对 理解代码。第二,在当前的 scalac,我们无法让
c.enclosingTree
风格的API工作 有力地。对typechecker所需的更改将大大超过 考虑到 目前存在更紧迫的问题。这有点 与2.11期间宏的总体演变保持一致 开发周期,其中我们使用了
c.introductiontoplevel
c.introductionmember
,但最终决定拒绝他们

如果你依赖现在不推荐的API,考虑使用新的API。

c.internal.enclosingOwner
可用于获取名称的方法 封闭定义的定义。或者尝试重新格式化宏 就完全局部扩张而言

关于从符号中获取树

从符号到定义树没有标准的方法

为什么需要def宏来获取封闭的
val
/
var
定义

也许宏注释就足够了

谢谢Dmytro。我有多个方法是宏展开的,可以链接或嵌套,我想将声明值的名称附加到最终对象。我可以使用运行时反射来实现这一点,但它只在类构造函数作用域中起作用,也就是说,如果我有嵌套的作用域,我就不能反射这些作用域中声明的值。@MuhammadSoliman您可以尝试宏注释、编译器插件或使用Scalameta/Scalafix重写源代码。虽然
c.enclosuringclass
是depencated,但它似乎仍然有效(至少在某些情况下),您可以尝试继续使用它(无论如何,当前的宏在Scala 3中会被弃用)。我希望避免显式注释。现在我可能会使用
enclosuringclass
。谢谢