【问题标题】:Is there an equivalent to SuppressWarnings in Scala?Scala 中是否有与 SuppressWarnings 等效的功能?
【发布时间】:2011-03-31 04:48:15
【问题描述】:

我想知道 scala 是否具有与 java 的 @SuppressWarnings 等效的功能,可以应用于函数或忽略该函数发出的任何弃用警告[1]?

1:在我的情况下,相关警告是:method stop in class Thread is deprecated: see corresponding Javadoc for more information. 我知道 stop 的问题,但仍有一些情况由于遗留代码我们必须使用它。

【问题讨论】:

  • 好问题!就我而言,我使用 -Xmigration 进行编译,因为它在测试在 Internet 上找到的代码时很有用,我得到“

标签: scala suppress-warnings


【解决方案1】:

否,针对此类功能的增强请求 [1] 已关闭为 wontfix

我同意它会很有用。我希望 Scala 核心团队不会反对这个想法,但他们拥有有限的资源和许多更高的优先级。

更新:此功能最终在 2020 年 4 月 22 日的 scala 2.13.2 版本中实现,请参阅 this answer

[1]https://issues.scala-lang.org/browse/SI-1781

【讨论】:

  • 该请求是针对 @unchecked 注释的。 OP 关注的是弃用警告,而不是不安全的强制转换警告。
  • 可惜了。无法区分好警告和坏警告使它们在大型项目的构建报告中几乎毫无用处。
  • @Ichthyo 你说的在理论上很好,但在实践中并不正确。警告在这里仅提供提示,它们通常是误报,即使在 Scala 中也是如此(否则它们将是错误!)。如果出现误报,最好添加注释说明为什么会这样,然后禁用它。否则,它会污染项目报告,使可能揭示对程序安全真正威胁真正警告不那么明显!
  • @Ichthyo 如果冒犯了你,我很抱歉;不是我的本意。我不确定您所说的“显然缺乏淹没在警告中的庞大而长期存在的代码库的经验”是什么意思。我确实从事过这样的项目(当然,不是在 Scala 中;它是 C++)。删除这些警告(无论是否由实际问题引起)确实是当务之急。我想每个项目和相关的政策都是不同的。我的观点是,在某些情况下,在特定位置隐藏特定警告是合理的,以保持其他一切简单和连贯
  • 虽然关闭了,但最终还是在 Scala 2.13.2 上实现了。
【解决方案2】:

编辑:你应该使用@nowarn


为此有一个简单的编译器插件:silencer(有点不要脸的插件)

【讨论】:

  • 你为什么觉得它不要脸?
  • @Simon 那是一个表达方式,不需要从字面上理解:)
  • @Simon “无耻插件”,因为他是插件的作者。
【解决方案3】:

这是在 sbt 中抑制所有警告的方法:

import sbt._
import Keys._
import KeyRanks.DTask
import xsbti.{Reporter, Problem, Position, Severity}

private lazy val compilerReporter = TaskKey[xsbti.Reporter](
  "compilerReporter",
  "Experimental hook to listen (or send) compilation failure messages.",
  DTask
)

val ignoreWarnings = Seq(
  compilerReporter in (Compile, compile) :=
    new xsbti.Reporter {
      private val buffer = collection.mutable.ArrayBuffer.empty[Problem]
      def reset(): Unit = buffer.clear()
      def hasErrors: Boolean = buffer.exists(_.severity == Severity.Error)
      def hasWarnings: Boolean = buffer.exists(_.severity == Severity.Warn)
      def printSummary(): Unit = {

        print("\033c")
        if (problems.nonEmpty) {
          problems.foreach{ p =>
            println("=====================================================")
            println(p.position)
            println(p.message)
            println()
            println()
          }
        }
      }
      def problems: Array[Problem] = buffer.toArray

      def log(problem: Problem): Unit = {
        if (problem.severity == Severity.Error) {
          buffer.append(problem)
        }
      }
      def log(pos: Position, msg: String, sev: Severity): Unit = {
        log(new Problem {
          def category: String = "foo"
          def severity: Severity = sev
          def message: String = msg
          def position: Position = pos
        })
      }
      def comment(pos: xsbti.Position, msg: String): Unit = ()
    }
)

【讨论】:

    【解决方案4】:

    Scala 2.13.2 提供了基于 ghik 的silencer 开发的@nowarn 注解,例如

    import scala.annotation.nowarn
    def t = { 0: @nowarn; 1 }
    

    不发出警告,同时

    def t = { 0; 1 }
    

    给予

    warning: a pure expression does nothing in statement position; multiline expressions might require enclosing parentheses
      def t = { 0; 1 }
                ^
    

    【讨论】:

    • @DanielC.Sobral 好像是 renamedsilentnowarn here
    • scalac -Wconf:help中可以使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多