2017-06-09 24 views
3

上Scalameta Decl.Defない作品私はDEF宣言に使用Scalameta(v1.8.0)注釈です:形質デフ方式

:このように、単に入力を返すように定義

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.Varを使用している場合それはうまく動作します。

形質に右の注釈を付ける方法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" 
我々は f2方法:)

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

var v2: Intの値をMyTraitのインスタンスを作成し、印刷することができます

があるため、正常に動作します case _に合っており、abortが編集されています。

+0

実装は正常ですが、私の例を試してみることを願っています。また、 'q 'def $ name():$ tpe" 'を定義すると、遭遇した問題と同じ問題が発生します。[github issue](https://github.com/scalameta/paradise)のバグのようです/ issues/211) – LoranceChen