gpt4 book ai didi

Scalameta Decl.Def 不适用于 trait def 方法

转载 作者:行者123 更新时间:2023-12-04 23:45:12 29 4
gpt4 key购买 nike

我在 def 声明中使用 Scalameta(v1.8.0) 注释:

trait MyTrait {
@MyDeclDef
def f2(): Int
}

定义的注释类只返回输入,如下所示:

import scala.meta._

class MyDeclDef extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case defn: Decl.Def =>
defn
case _ =>
println(defn.structure)
abort("@MyDeclDef most annotate a Decl.Def")
}
}
}

遇到一些编译器错误:

Error:'=' expected but eof found.
def f2(): Unit
Error:illegal start of simple expression
def f2(): Unit

此外,如果我使用 Decl.Varvar v2: Int 它工作正常。

如何正确注释特征def?谢谢

最佳答案

我之前没有使用过 scala-meta 并尝试过你的例子。看起来我们必须在宏中实现这个方法。例如,如果我们指定一个默认实现:

class MyDeclDef extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case defn: Decl.Def =>
val q"def $name(): $tpe" = defn
q"def $name(): $tpe = 1"

我们将能够创建 MyTrait 的实例并打印 f2 方法的值 :)

val x = new MyTrait
println(x.f2) // Prints 1

var v2: Int 工作正常,因为它适合我们中止 编译的case _

关于Scalameta Decl.Def 不适用于 trait def 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44450237/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com