0

私は囲みメソッドのアノテーションからいくつかの情報を読み込むいくつかのマクロライブラリを作成しています。StaticAnnotationの型チェックを防ぐには?

@info(foo(bar, baz)) 
def enclosing() = { 
    myMacro() 
} 

これらの情報はStaticAnnotation@infofoo(bar, baz)として符号化されます。

foo(bar, baz)は、情報が含まれていmyMacro必要が、しかし、foo(bar, baz)は型チェックして位置@infoに、そして時に型チェックfoo(bar, baz)コンパイラエラーを引き起こすことができません。

foo(bar, baz)タイプがチェックされないようにするマクロdontTypecheckを作成できるのだろうかと思います。 dontTypecheckマクロはuntype-確認foo(bar, baz)が含まれているTreeを生成する必要があり

@info(dontTypecheck { 
    foo(bar, baz) 
}) 
def enclosing() = { 
    myMacro() 
} 

:私のようなものを作成することができるように。

dontTypecheckマクロを作成するにはどうすればよいですか?

答えて

1

1アイデアは、あなたがeList(f(a, b))

+0

が印刷されます呼び出す場合は、 'デフF(Aを削除した場合、それは動作しますインフォ

class Info[T](t: T) extends scala.annotation.StaticAnnotation { } class AnnInfo extends StaticAnnotation { def macroTransform(annottees: Any*): Any = macro AnnInfImpl.impl } trait AnnotationUtils { val c: scala.reflect.macros.blackbox.Context import c.universe._ final def getAnnotation(x: MemberDef) = x.mods.annotations } class AnnInfImpl(val c: blackbox.Context) extends AnnotationUtils { import c.universe._ // edit 1 def impl(annottees: Tree*): Tree = { annottees.head match { case x: DefDef => // collect value from '@Info(value)' val info: List[Tree] = getAnnotation(x).collect { case q"new $name ($value)" => value } val newBody = q""" { val info = ${info.map(e => show(e))} println(info)// just print it ${x.rhs} }""" DefDef( mods = Modifiers(), //dropMods name = x.name, tparams = x.tparams, vparamss = x.vparamss, tpt = x.tpt, rhs = newBody ) } } } 

//テスト

class AnnInfoTest { val a = 1 val b = 2 def f(a: Int, b: Int) = a + b @Info(f(a, b)) @AnnInfo def e = ??? } 

を保存し、別のアノテーションを使用しています:Int、b:Int)= a + b'? –

+0

はい、それは働いています:) –

+0

マクロアノテーション '@ AnnInfo'が' @Info(f(a、b)) 'を削除したためコンパイルされます。 '@ Info'が削除された後、' e'の中のマクロで '@ Info'をどのように呼び出すことができますか? –