0
マクロ注釈を作成しようとしていますが、パラメータを渡す必要があります。scalameta paradiseマクロにパラメータを渡す
@ToPojo("p1", "p2")
case class Entity(a: Int, m: Map[Long, Boolean])
上記コードの問題として使用さ
class ToPojo(param1: String, param2: String) extends StaticAnnotation {
inline def apply(defn: Any): Any = meta {
...
}
}
はEntity
既に注釈とapply
defn
ようになることであるストリッピング - 従って私はそこからパラメータを取得することができません。 param1
とparam2
フィールドは、インライン化されているので、apply
メソッドからアクセスできません。
スカラーメタを使用してこれを克服する最も簡単な方法を教えてください。私は2つの注釈を使用することを考えました
@ToPojo
@ToPojoParams("p1", "p2")
case class Entity(a: Int, m: Map[Long, Boolean])
しかし、それはハッキーと醜いです。
どうもありがとうこのコードがあることを
package scalaworld.macros
import scala.meta._
class Argument(arg: Int) extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
// `this` is a scala.meta tree.
println(this.structure)
val arg = this match {
// The argument needs to be a literal like `1` or a string like `"foobar"`.
// You can't pass in a variable name.
case q"new $_(${Lit.Int(arg)})" => arg
// Example if you have more than one argument.
case q"new $_(${Lit.Int(arg)}, ${Lit.String(foo)})" => arg
case _ => ??? // default value
}
println(s"Arg is $arg")
defn.asInstanceOf[Stat]
}
}
注Scalametaツリーとしてthis
に
あなたが一致How do I pass an argument to the macro annotation?セクションの下ScalaMetaパラダイスの説明で述べたように