1

私はマクロを持っており、そのマクロの一部は、特定のメソッドへのすべての呼び出しを別のものに置き換えることで構成されています。これを達成するために、私は a を使用し、メソッドに入るTransformerすべてのものをquasiquote と照合しようとします。以下のように書くとうまくいきそうです。Treetransform

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置き換え、他のメソッド呼び出しを決して置き換えませんか? そうでない場合、どうすればより堅牢にすることができますか?

4

1 に答える 1