3

我在 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?谢谢

4

1 回答 1

0

我以前没有合作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 _我们abort的编译。

于 2017-07-02T12:42:34.077 回答