私はマクロを持っており、そのマクロの一部は、特定のメソッドへのすべての呼び出しを別のものに置き換えることで構成されています。これを達成するために、私は a を使用し、メソッドに入るTransformer
すべてのものをquasiquote と照合しようとします。以下のように書くとうまくいきそうです。Tree
transform
package mypackage
object myobject {
implicit def mymethod[T](t: Option[T]): T = ???
}
object Macros {
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
def myMacro(c: Context)(expr: c.Tree): c.Tree = {
import c.universe._
val transformer = new Transformer {
private def doSomething(value: c.Tree): TermName = {
???
}
override def transform(tree: c.Tree) = tree match {
case q"mypackage.myobject.mymethod[..$_]($value)" =>
val result = doSomething(value)
q"$result"
case _ => super.transform(tree)
}
}
val transformed = transformer.transform(expr)
???
}
}
しかし、マクロでは常に完全修飾名を使用する必要があると考えました。そうしないと、問題が発生する可能性があります。だから私はそれを のように書きましたq"_root_.mypackage.myobject.mymethod[..$_]($value)"
が、それはもはや一致せず、 への呼び出しmymethod
は置き換えられなくなりました。scala docs
でシンボルの引用符を外す
という提案も見ましたが、それも機能しませんでした。
だから私の質問は: このコード (とq"mypackage.myobject.mymethod[..$_]($value)"
) は常にすべての呼び出しをmymethod
置き換え、他のメソッド呼び出しを決して置き換えませんか? そうでない場合、どうすればより堅牢にすることができますか?