我正在使用宏,我想检查编译时间,是否创建的实例类包含在构造函数中传递的所有属性,或者其中一个为null,并且在这种情况下,编译时失败了?在运行时。
我已经读过很多关于它的博客,但对于这种特殊情况我没有发现,因此在编译时可能不可行。
如果有可能,并且有人知道一个博客,请阅读有关如何使用AST的论文,我将不胜感激。
这是我的生成器类
actorBuilder = F2eActorBuilder
.withApplicationConf(new File(applicationContext))
.withAkkaContext( "akkaContext.xml")
.withApplicationContext("applicationContext.xml")
.build()
我想检查一次actorBuilder的定义,由于是DSL,并且可能没有调用*,所以我想在编译时检查这些属性之一是否设置为null。
这是我的宏代码
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"
}