From c4efcc4df7d5e62432d5546887d2246c14fe2468 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Sun, 1 Sep 2013 16:32:31 +0200 Subject: [PATCH] Make the DelegatingReporter aware of -nowarn The test case compiles a project without and with this setting and checks that a warning is and isn't emitted respectively. It's a multi-project build; this bug didn't seem to turn up in a single-project build. --- .../src/main/scala/xsbt/Command.scala | 3 +++ .../main/scala/xsbt/DelegatingReporter.scala | 11 +++++---- sbt/src/sbt-test/reporter/nowarn/build.sbt | 24 +++++++++++++++++++ .../reporter/nowarn/sub1/warney.scala | 6 +++++ .../sbt-test/reporter/nowarn/sub2/sub2.scala | 1 + sbt/src/sbt-test/reporter/nowarn/test | 11 +++++++++ 6 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 sbt/src/sbt-test/reporter/nowarn/build.sbt create mode 100644 sbt/src/sbt-test/reporter/nowarn/sub1/warney.scala create mode 100644 sbt/src/sbt-test/reporter/nowarn/sub2/sub2.scala create mode 100644 sbt/src/sbt-test/reporter/nowarn/test diff --git a/compile/interface/src/main/scala/xsbt/Command.scala b/compile/interface/src/main/scala/xsbt/Command.scala index 457beda66..b54396718 100644 --- a/compile/interface/src/main/scala/xsbt/Command.scala +++ b/compile/interface/src/main/scala/xsbt/Command.scala @@ -23,4 +23,7 @@ object Command def getWarnFatal(settings: Settings): Boolean = settings.Xwarnfatal.value + + def getNoWarn(settings: Settings): Boolean = + settings.nowarn.value } diff --git a/compile/interface/src/main/scala/xsbt/DelegatingReporter.scala b/compile/interface/src/main/scala/xsbt/DelegatingReporter.scala index 495a4d7f8..35cc522df 100644 --- a/compile/interface/src/main/scala/xsbt/DelegatingReporter.scala +++ b/compile/interface/src/main/scala/xsbt/DelegatingReporter.scala @@ -9,13 +9,13 @@ package xsbt private object DelegatingReporter { def apply(settings: scala.tools.nsc.Settings, delegate: xsbti.Reporter): DelegatingReporter = - new DelegatingReporter(Command.getWarnFatal(settings), delegate) + new DelegatingReporter(Command.getWarnFatal(settings), Command.getNoWarn(settings), delegate) } // The following code is based on scala.tools.nsc.reporters.{AbstractReporter, ConsoleReporter} // Copyright 2002-2009 LAMP/EPFL // Original author: Martin Odersky -private final class DelegatingReporter(warnFatal: Boolean, private[this] var delegate: xsbti.Reporter) extends scala.tools.nsc.reporters.Reporter +private final class DelegatingReporter(warnFatal: Boolean, noWarn: Boolean, private[this] var delegate: xsbti.Reporter) extends scala.tools.nsc.reporters.Reporter { import scala.tools.nsc.util.{FakePos,NoPosition,Position} @@ -36,8 +36,11 @@ private final class DelegatingReporter(warnFatal: Boolean, private[this] var del } protected def info0(pos: Position, msg: String, rawSeverity: Severity, force: Boolean) { - val severity = if(warnFatal && rawSeverity == WARNING) ERROR else rawSeverity - delegate.log(convert(pos), msg, convert(severity)) + val skip = rawSeverity == WARNING && noWarn + if (!skip) { + val severity = if(warnFatal && rawSeverity == WARNING) ERROR else rawSeverity + delegate.log(convert(pos), msg, convert(severity)) + } } def convert(posIn: Position): xsbti.Position = { diff --git a/sbt/src/sbt-test/reporter/nowarn/build.sbt b/sbt/src/sbt-test/reporter/nowarn/build.sbt new file mode 100644 index 000000000..8381d9489 --- /dev/null +++ b/sbt/src/sbt-test/reporter/nowarn/build.sbt @@ -0,0 +1,24 @@ +lazy val sub1 = project + +lazy val sub2 = project + +val assertNoWarning = taskKey[Unit]("checks warning *is not* emitted") + +val assertWarning = taskKey[Unit]("checks warning *is* emitted") + +def check(expectation: Boolean) = Def.task[Unit] { + val lastLog: File = BuiltinCommands.lastLogFile(state.value).get + val last: String = IO.read(lastLog) + val contains = last.contains("a pure expression does nothing in statement position") + if (expectation && !contains) + sys.error("compiler output does not contain warning") + else if (!expectation && contains) + sys.error(s"compiler output still contains warning") + else { + IO.write(lastLog, "") // clear the backing log for for 'last'. + } +} + +assertWarning <<= check(true) + +assertNoWarning <<= check(false) diff --git a/sbt/src/sbt-test/reporter/nowarn/sub1/warney.scala b/sbt/src/sbt-test/reporter/nowarn/sub1/warney.scala new file mode 100644 index 000000000..5ca688749 --- /dev/null +++ b/sbt/src/sbt-test/reporter/nowarn/sub1/warney.scala @@ -0,0 +1,6 @@ +object warney { + def foo = { + 0 + 0 + } +} diff --git a/sbt/src/sbt-test/reporter/nowarn/sub2/sub2.scala b/sbt/src/sbt-test/reporter/nowarn/sub2/sub2.scala new file mode 100644 index 000000000..4cf3e6725 --- /dev/null +++ b/sbt/src/sbt-test/reporter/nowarn/sub2/sub2.scala @@ -0,0 +1 @@ +object sub2 \ No newline at end of file diff --git a/sbt/src/sbt-test/reporter/nowarn/test b/sbt/src/sbt-test/reporter/nowarn/test new file mode 100644 index 000000000..dd97887d7 --- /dev/null +++ b/sbt/src/sbt-test/reporter/nowarn/test @@ -0,0 +1,11 @@ +> compile + +> assertWarning + +> 'set every scalacOptions := Seq("-nowarn")' + +> clean + +> compile + +> assertNoWarning \ No newline at end of file