매크로 주석을 만들려고하지만 매개 변수를 전달해야합니다.scalameta 낙원 매크로에 매개 변수 전달
@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
메서드에서 액세스 할 수 없습니다.
스칼라 메타를 사용하여이를 극복하는 가장 쉬운 방법을 가르쳐 주시겠습니까? 두 개의 주석을 사용하는 것에 대해 생각했습니다.
@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 파라다이스 설명에 설명 된 바와 같이