Scala:使用Scala宏生成带有参数的Java注释

时间:2016-04-22 17:50:00

标签: java scala macros annotations

我有一个带有一个参数的简单Java注释:

public @interface Annot {
   String value();
}

我还有Java注释,它将Annot数组作为参数:

public @interface Annotations {
    Annot[] value();
}

我想用参数生成Annot" value"像这样使用Scala宏:

object MyAnnotations {

  def MyAnnotation: Annot = macro myAnnotationMacro

  def myAnnotationMacro(c: whitebox.Context): c.Expr[Annot] = {
    import c.universe._
    c.Expr(q"""new Annot("value")""")
  }
}

虽然这有效:

@Annotations(Array(
  new Annot("value")
))
trait T

这不起作用:

@Annotations(Array(
  MyAnnotations.MyAnnotation
)) // too many arguments for constructor Annot: ()Annot
trait T

为什么呢?我怎样才能生成Annot?

1 个答案:

答案 0 :(得分:0)

我担心你不能用宏做你想做的事。

Java注释的Typechecking以非常奇怪的方式实现,与typechecker的其他部分明显不同。虽然其他所有内容都从TreeTree进行了类型检查,但Java注释的参数从TreeClassfileAnnotArg进行了类型检查(后者不是树)。你的宏扩展为Tree,而类型检查器需要ClassfileAnnotArg,所以事情不起作用(错误信息很容易引起误解)。

我认为可以将typechecker更改为适用于您的情况,但这需要修补编译器。不知道如何在宏中做到这一点。