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