传递与传播验证Scala宏的多个值

时间:2015-08-03 15:46:57

标签: scala reflection scala-macros

所以,我是Scala中的新手,对我目前的目标有些困难。我有一个类来执行案例类的Json解析。如果给定的case类具有Enumeration类型的字段,则在调用解析器时需要提供这些枚举的隐式数组。

我想使用宏来验证解析器的用法(在编译时),检查发送给解析器的类并验证它是否有枚举。如果它确实有枚举,我想验证隐含的枚举数组不是空的。

这是我到目前为止所拥有的。如果可能的话,我想避免使用c.eval,所以如果有更好的方法,我会全力以赴。我一直在弄错"忘记拼接变量"没有比这更多的背景。我甚至在这里走在正确的轨道上吗?

object Macro {
  def compileTimeCheck(tpe: Any, enums: Array[Enumeration]) = macro impl
  def impl(c: Context)(tpe: c.Expr[Any], enums: c.Expr[Array[Enumeration]]) : c.Expr[Any] = {
    import c.universe._
    reify {
      if (c.eval(enums).isEmpty) {
        if (c.eval(tpe).getClass.getDeclaredFields.exists(_.getType.isInstanceOf[Enumeration])) {
          c.abort(c.macroApplication.pos,
            "You must provide an implicit list of enums in this case")
        }
      }
    }
  }
}

0 个答案:

没有答案