增强的断言scala宏

时间:2013-02-15 11:44:23

标签: scala-2.10 scala-macros

当使用断言时,我遇到了一些烦人的问题

  • 没有好的信息:为什么会失败,以及断言是什么
  • 断言信息被隐藏在不需要的信息的海洋之下,例如太多的scala函数层。 我已经把这些问题放在了脑后,现在有了新的scala宏,我打算继续使用Stack Overflow,为每个问题创建一个高价值的问答对。这样,下一个遇到问题的人就不必惹恼这么多错误的信息。如果其他专家用他们自己的知识充实,我甚至可能会更多地了解困扰我们的各种问题。

这是一个简单的scala宏示例。

1 个答案:

答案 0 :(得分:1)

这是一个解决方案,提供有关断言失败的更深入细节,并在抛出异常时消除内部函数的所有scala层:

def assert2(c: Context)(act: c.Expr[Any],exp: c.Expr[Any]): c.Expr[Unit] = {
    import c.universe._
    val actm = act.tree.toString
    val expm = exp.tree.toString
    reify({
        if(act.splice!=exp.splice) {
            try {
                throw new Exception("AssertionError: "+c.Expr[String](Literal(Constant(actm))).splice+"["+act.splice+"]==["+exp.splice+"]"+c.Expr[String](Literal(Constant(expm))).splice)
            } catch {
            case unknown: Throwable => System.err.println(""+unknown+unknown.getStackTrace.toList.filter(_.toString.indexOf("scala.")!=0).mkString("\n  ","\n  ","\n  ")); exit
            }
        }
    })
}
def myAssert2(act: Any, exp: Any) = macro assert2