所以,我是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")
}
}
}
}
}