我可以强制scala在无穷无尽的比赛中出错吗?

时间:2013-07-06 02:14:47

标签: scala compiler-errors warnings

无穷无尽的比赛,例如

def foo[A](t: Seq[A]) = t match {
    Seq(x) => x
}

通常(并不总是,但通常)是我在运行时崩溃的错误。 Scala警告说,但是在增量构建中,文件可能已经编译好了,所以我会错过警告。

是否有一种方法,全局或本地(可能是注释)强制scala将警告转换为错误?

2 个答案:

答案 0 :(得分:3)

可以提供一个自定义报告器,任意将警告报告为错误(或相反),但API当前是基于字符串的,因此它会过滤字符串消息而不是键入警告。

没有内置方法可以对特定警告进行失败,但-Xlint -Xfatal-warnings是升级警告的常用方法。

已请求警告抑制,但被视为危险。有了致命的警告,要求就是禁止被认为是良性的警告。

如果您有剩余弃用,则可以通过从不推荐使用的方法调用警告来抑制警告(在-Xfatal-warnings下会失败);如果该方法是本地方法,则不会生成警告。

scala> @deprecated("","") def f = 8
f: Int

scala> f
<console>:9: warning: method f is deprecated: 
              f
              ^
scala> object A {
     | def a = {
     | @deprecated("","") def _f = f
     | _f
     | }}
defined object A

scala> A.a
res1: Int = 8

本地弃用技巧本身已被弃用,但您仍然可以使用转发合作伙伴:

scala> @deprecated("","") def f = 8
f: Int

scala> f
warning: there was one deprecation warning; re-run with -deprecation for details
res0: Int = 8

scala> @deprecated("","") class C { def g = f }; object C extends C
defined class C
defined object C

scala> C.g
res1: Int = 8

答案 1 :(得分:0)

考虑询问有关构建过程的问题。

  1. 您应该在代码提交/签入之前立即执行完整,干净的构建(非增量)并运行单元测试。这是为了避免(潜在的,剩余的)SBT或您的构建过程中的错误。当然,您应该监控错误和警告的结果。

  2. 您或者您应该做持续集成(自动,预定的构建/测试)吗?在这种情况下,您可以拥有或引入一些控制警告的处理方式(忽略或触发构建失败/警告)。

  3. 我没有看到从scalac命令行执行此操作的方法。如果所有其他方法都不能满足您的需求,那么请考虑作为最后的手段,然后仅在适合您的构建工具时:为scalac创建一个包装脚本,也称为scalac

    • 调用真scalac
    • 监视输出:打印特定错误时返回错误,并可能删除目标类文件[从错误语句中捕获]以进一步强制解决问题。