У меня есть интерполятор xxx
реализуется макросом (я владею кодом) и возвращает XXX. Я хочу реализовать интерполятор yyy
, когда у меня есть функция f: XXX => YYY
код
class XXXMacro(val c: blackbox.Context) {
import c.universe._
final def xxx(args: c.Expr[Any]*): c.Expr[XXX] = {
val Apply(_, Apply(_, parts) :: Nil) = c.prefix.tree
???
}
}
implicit class XXXInterpolator(sc: StringContext) {
def xxx(args: Any*): XXX = macro XXXMacro.xxx
}
class YYYMacro(val c: blackbox.Context) {
import c.universe._
final def yyy(args: c.Expr[Any]*): c.Expr[YYY] = q"yyy($xxx\"args\")"
}
implicit class YYYInterpolator(sc: StringContext) {
def yyy(args: Any*): YYY = macro XXXMacro.yyy
}
Проблема в том, что я не могу легко параметризовать код. Компилятор не позволит мне сделать macro XXXMacro(f).yyy
или macro XXXMacro.yyy(f)
.
Также, когда я обертываю это как def yyy(args: Any*): YYY = f(new XXXInterpolator(sc).xxx(args))
, контекст в макросе совершенно другой и усложняет его, и я не могу использовать его повторно. Есть ли способ сделать это проще?