Я использую макросы, и я хотел бы проверить во время компиляции, содержит ли созданный класс экземпляра все атрибуты, переданные в конструкторе, или если один из них имеет значение 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"
}