是否可以限制编译器显示的错误数量?

时间:2015-10-20 17:04:14

标签: scala

有时在进行某些重构时,编译器可能会产生数百个错误。我喜欢从顶部开始解决这些错误,但是大量的错误会让你一直滚动起来非常麻烦。

是否可以让Scala编译器限制它显示的错误数量,以便更容易从顶部开始修复它们?显然是以牺牲可能必须多次运行编译器为代价。

1 个答案:

答案 0 :(得分:3)

是的,因为2.12可以使用自定义记者。

这是一个例子记者:

package myrep

import scala.tools.nsc.Settings
import scala.tools.nsc.reporters.ConsoleReporter

import scala.reflect.internal.util._

class MyReporter(ss: Settings) extends ConsoleReporter(ss) {
  var deprecationCount = 0
  override def warning(pos: Position, msg: String): Unit = {
    if (msg contains "is deprecated") deprecationCount += 1
    super.warning(pos, msg)
  }
  override def hasWarnings: Boolean = count(WARNING) - deprecationCount > 0
  override def reset() = { deprecationCount = 0 ; super.reset() }

  // limit total
  var limit = 5
  override def display(pos: Position, msg: String, severity: Severity): Unit =
    if (severity != ERROR || severity.count <= limit) print(pos, msg, severity)
}

您的记者课必须在工具类路径上:

$ ~/scala-2.12.0-M3/bin/scalac -toolcp . -Xreporter myrep.MyReporter test.scala

您可以选择以某种方式配置限制,可能使用系统属性,但配置不是内置的。

对于此示例文件,有六个错误,但报告了五个:

package tester

@deprecated("Don't use me", since="2.12.0")
class C

object Test extends App {
  Console println s"${new C}"

  val x: String = 42

  val y: Int = "42"

  val z: Int = 2.0

  Console println (42 drop 1)
  Console println (42 take 1)
  Console println (42 shift 1)
}