Макросы: проверка атрибутов класса во время компиляции - PullRequest
0 голосов
/ 25 июня 2018

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

Я читал много блогов об этом, и я не нашел ни одного относительно этого конкретного сценария, так что, возможно, это не выполнимо во время компиляции.

Если это возможно, и кто-то знаетблог, статья, чтобы прочитать о том, как сделать это с AST, я был бы признателен.

Здесь мой класс строителя

actorBuilder = F2eActorBuilder
  .withApplicationConf(new File(applicationContext))
  .withAkkaContext( "akkaContext.xml")
  .withApplicationContext("applicationContext.xml")
  .build()

Я хочу проверить, определен ли actorBuilder, и поскольку это DSL, а некоторые с * могут не вызываться, я хочу проверить время компиляции, еслииз этих атрибутов установлены в нуль.

А вот мой код макроса

  import scala.language.experimental.macros

  def valid(action: F2eActorBuilder): F2eActorBuilder = macro checkActionImpl

  def checkActionImpl(c: blackbox.Context)(action: c.Tree): c.Tree = {
    import c.universe._
    def isValidAction(s: F2eActorBuilder): Boolean = checkMessage(s)

    action match {
      case _tree@Literal(Constant(s: F2eActorBuilder)) if isValidAction(s) => _tree
      case _tree@Literal(Constant(s: F2eActorBuilder)) => c.abort(c.enclosingPosition, getErrorMessage(s))
    }
  }

  def checkMessage(action: F2eActorBuilder): Boolean = {
    action.akkaContextPath != null
  }

  def getErrorMessage(action: F2eActorBuilder): String = {
    s"Some mandatory attributes are marked as null"
  }
...