2016-04-22 13 views
1

Scalaのマクロを使用してパラメータを使用してJavaアノテーションを生成します。Scalaは:私は1つのパラメータで単純なJavaアノテーションを持って

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

I:また、私は、パラメータとしてAnnotの配列をとる、Javaのアノテーションを持って

public @interface Annot { 
    String value(); 
} 

次のようにScalaマクロを使用してパラメータ "値"で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")""") 
    } 
} 

while作品れる:

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

これは動作しません:

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

なぜ?そして、私はAnnotをどのように生成できますか?

答えて

0

私はマクロで望むことができないのではないかと恐れています。

Javaアノテーションの型チェックは非常に奇妙な方法で実装されています。これは型チェッカーの残りの部分とは大きく異なります。他のすべてはTreeからTreeに型チェックされていますが、Javaアノテーションの引数はTreeからClassfileAnnotArg(型はツリーではありません)からtypecheckedされています。マクロはTreeに展開されますが、型チェッカーはClassfileAnnotArgと予想されますので、機能しません(エラーメッセージが誤解を招くことがあります)。

私はあなたのケースで動作するように型チェッカーを変更することは可能だと思うが、それはコンパイラーにパッチを当てる必要があります。マクロ内からそれをどうやって行うのか分かりません。

関連する問題