簡體   English   中英

Scala:使用Scala宏生成帶有參數的Java注釋

[英]Scala: generate Java annotation with parameter using Scala macros

我有一個帶有一個參數的簡單Java注釋:

public @interface Annot {
   String value();
}

我還有Java注釋,它將Annot數組作為參數:

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

我想使用Scala宏生成帶有參數“value”的Annot,如下所示:

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?

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

Java注釋的類型檢查以非常奇怪的方式實現,與typechecker的其他部分明顯不同。 雖然其他所有內容都是從TreeTree ,但Java注釋的參數是從TreeClassfileAnnotArg (后者不是樹)的類型。 你的宏擴展為一個Tree ,而ClassfileAnnotArg期望ClassfileAnnotArg ,所以事情不起作用(錯誤信息是非常誤導的)。

我認為可以將typechecker更改為適用於您的情況,但這需要修補編譯器。 不知道如何從宏中做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM