我有一个带有一个参数的简单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?
答案 0 :(得分:0)
我担心你不能用宏做你想做的事。
Java注释的Typechecking以非常奇怪的方式实现,与typechecker的其他部分明显不同。虽然其他所有内容都从Tree
到Tree
进行了类型检查,但Java注释的参数从Tree
到ClassfileAnnotArg
进行了类型检查(后者不是树)。你的宏扩展为Tree
,而类型检查器需要ClassfileAnnotArg
,所以事情不起作用(错误信息很容易引起误解)。
我认为可以将typechecker更改为适用于您的情况,但这需要修补编译器。不知道如何在宏中做到这一点。