dsinfo
library允许您从使用Scala2宏编写函数的上下文中访问值的名称。他们给出的例子是,如果你有类似的东西
val name = myFunction(x, y)
除了其他参数外,myFunction
实际上还将被传递其val
的名称,即myFunction("name", x, y)
。
这对于DSL非常有用,因为您希望将命名值用于错误报告或其他类型的编码。唯一的另一种选择似乎是显式地将名称作为String
传递,这可能会导致无意中的不匹配。
对于Scala 3宏,这是可能的吗?如果可能,如何在宏的使用位置“爬上”树来找到它的id?
1条答案
按热度按时间vd8tlhqk1#
在Scala3中没有
c.macroApplication
。只有Position.ofMacroExpansion
而不是树。但我们可以分析Symbol.spliceOwner.maybeOwner
。我假设scalacOptions += "-Yretain-trees"
已打开。用途:
dsinfo
还在调用点处理名称twoargs
(作为模板$macro
),但我没有实现这一点。我猜这个名字(如果有必要的话)可以从Position.ofMacroExpansion.sourceCode
获得。**更新。**这里是内联方法(例如
twoargs
)的实现处理名称,除了Scala 3宏之外,还使用了Scalameta+Semancdb。顺便说一句,Semantidb在这里不能用Tasty代替,因为当
App
中的一个宏被展开时,文件App.scala.semantidb
已经存在(它是在编译的前端阶段生成的early),但App.tasty
还没有(它出现在App
已经编译时,即在宏展开之后,在Pickler阶段)。即使
.scala
文件没有编译(例如,如果宏展开有错误),.scala.semanticdb
文件也会出现,但.tasty
文件不会。scala.meta parent of parent of Defn.Object
Is it possible to using macro to modify the generated code of structural-typing instance invocation?
Scala conditional compilation
Macro annotation to override toString of Scala function
How to merge multiple imports in scala?
How to get the type of a variable with scalameta if the decltpe is empty?
另请参阅https://github.com/lampepfl/dotty-macro-examples/tree/main/accessEnclosingParameters
简化版本: