在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
。谢谢