Могу ли я получить доступ к значению (ям) аргумента (ов) аннотации в теле переменной (val / var), которая аннотируется? - PullRequest
1 голос
/ 11 июня 2019

В моем проекте программисты могут аннотировать определенные поля класса как прогноз следующим образом:

class Foo() {
  @prediction('p1) var quality = // access 'p1 here
}

Символ задается в определении аннотации прогнозирования, котораяпредставляет его идентификатор (в этом случае идентификатор quality равен 'p1 ).

Моя проблема: я хочу получить доступ к значению этого символа в реализации переменной quality .Я думаю, что это достижимо с помощью макроса, но я не смог его реализовать.

Мой вопрос: как мне этого добиться (макросы разрешены)?

1 Ответ

2 голосов
/ 11 июня 2019

Да, вы можете.Попробуйте сделать prediction макроаннотацию

class Foo() {
  @prediction('p1) var quality = {
    println(access) //'p1
  }
}

import scala.annotation.{StaticAnnotation, compileTimeOnly}
import scala.language.experimental.macros
import scala.reflect.macros.whitebox

@compileTimeOnly("enable macro paradise to expand macro annotations")
class prediction(s: Symbol) extends StaticAnnotation {
  def macroTransform(annottees: Any*): Any = macro predictionMacro.impl
}

object predictionMacro {
  def impl(c: whitebox.Context)(annottees: c.Tree*): c.Tree = {
    import c.universe._
    val symb = c.prefix.tree match {
      case q"new prediction($s)" => s
    }
    annottees match {
      case q"$mods var $tname: $tpt = $expr" :: _ =>
        q"""$mods var $tname: $tpt = {
            val access = $symb
            $expr
          }"""
    }
  }
}
...