2016-04-22 80 views
1

我有簡單的Java註解與一個參數生成具有參數的Java註解:Scala的:使用的Scala宏

public @interface Annot { 
    String value(); 
} 

另外我有爪哇註釋,需要阿諾的數組作爲參數:

public @interface Annotations { 
    Annot[] 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")""") 
    } 
} 

雖然th在作品:

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

這不起作用:

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

爲什麼?我怎樣才能生成Annot?

回答

0

恐怕你不能用宏來做你想要的。

Java註釋的類型檢查以非常奇怪的方式實現,這與其他類型檢查器顯着不同。當從TreeTree的所有其他類型被查看時,Java註釋的參數從Tree轉換爲ClassfileAnnotArg(後者不是樹)。你的宏擴展爲Tree,而類型檢測器預計ClassfileAnnotArg,所以事情不起作用(和錯誤信息是相當誤導)。

我認爲有可能改變typechecker工作在你的情況下,但這將需要修補編譯器。不知道如何從宏內做到這一點。