宏:在编译时检查类属性

时间:2018-06-25 11:21:35

标签: scala scala-macros

我正在使用宏,我想检查编译时间,是否创建的实例类包含在构造函数中传递的所有属性,或者其中一个为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"
  }

0 个答案:

没有答案