2017-06-09 75 views
3

我使用Scalameta(v1.8.0)註釋到DEF聲明:Scalameta Decl.Def不是工作在一個特質DEF方法

trait MyTrait { 
    @MyDeclDef 
    def f2(): Int 
} 

定義只是返回輸入註解類,因爲這:

import scala.meta._ 

class MyDeclDef extends scala.annotation.StaticAnnotation { 
    inline def apply(defn: Any): Any = meta { 
    defn match { 
     case defn: Decl.Def => 
     defn 
     case _ => 
     println(defn.structure) 
     abort("@MyDeclDef most annotate a Decl.Def") 
    } 
    } 
} 

一些編譯器錯誤的邂逅:

Error:'=' expected but eof found. 
def f2(): Unit 
Error:illegal start of simple expression 
def f2(): Unit 

而且,如果我使用Decl.Varvar v2: Int它工作正常。

如何正確註釋性狀def?謝謝

回答

0

我以前沒有與scala-meta一起工作,並試過你的例子。看起來我們必須在宏中實現此方法。例如,如果我們指定一個默認的實現:

class MyDeclDef extends scala.annotation.StaticAnnotation { 
    inline def apply(defn: Any): Any = meta { 
    defn match { 
     case defn: Decl.Def => 
     val q"def $name(): $tpe" = defn 
     q"def $name(): $tpe = 1" 

我們將能夠創造MyTrait一個實例,並打印f2方法:)

val x = new MyTrait 
println(x.f2) // Prints 1 

var v2: Int值正常工作,因爲它適合於case _其中我們abort的彙編。

+0

你的實現工作正常,但我希望你可以嘗試我的例子。另外,如果你定義了'q「def $ name():$ tpe」',它會引發與遇到的問題相同的問題。[github問題](https://github.com/scalameta/paradise /問題/ 211) – LoranceChen

相關問題