From 22f98d5189b61200aaf11cec7a0a96d5cfa86a5e Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Mon, 19 Sep 2016 00:46:17 -0700 Subject: SI-8040 Warn unused parameters One can `-Ywarn-unused:params` or more narrowly warn only for unused implicit parameters with `-Ywarn-unused:implicits`. Params includes constructor parameters. The settings for privates and locals are not yet distinguished. ``` $ skalac -Ywarn-unused:help Enable or disable specific `unused' warnings imports Warn if an import selector is not referenced. patvars Warn if a variable bound in a pattern is unused. privates Warn if a private member is unused. locals Warn if a local definition is unused. params Warn if a value parameter is unused. implicits Warn if an implicit parameter is unused. ``` --- test/files/neg/warn-unused-implicits.check | 9 +++++ test/files/neg/warn-unused-implicits.flags | 1 + test/files/neg/warn-unused-implicits.scala | 32 ++++++++++++++++ test/files/neg/warn-unused-params.check | 18 +++++++++ test/files/neg/warn-unused-params.flags | 1 + test/files/neg/warn-unused-params.scala | 61 ++++++++++++++++++++++++++++++ test/files/neg/warn-unused-patvars.check | 6 +-- test/files/neg/warn-unused-patvars.scala | 2 + test/files/neg/warn-unused-privates.flags | 2 +- test/files/neg/warn-unused-privates.scala | 4 ++ 10 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 test/files/neg/warn-unused-implicits.check create mode 100644 test/files/neg/warn-unused-implicits.flags create mode 100644 test/files/neg/warn-unused-implicits.scala create mode 100644 test/files/neg/warn-unused-params.check create mode 100644 test/files/neg/warn-unused-params.flags create mode 100644 test/files/neg/warn-unused-params.scala (limited to 'test/files') diff --git a/test/files/neg/warn-unused-implicits.check b/test/files/neg/warn-unused-implicits.check new file mode 100644 index 0000000000..4cc5836800 --- /dev/null +++ b/test/files/neg/warn-unused-implicits.check @@ -0,0 +1,9 @@ +warn-unused-implicits.scala:11: warning: parameter value s in method f is never used + )(implicit s: String): Int = { // warn + ^ +warn-unused-implicits.scala:31: warning: parameter value s in method i is never used + def i(implicit s: String, t: Int) = t // yes, warn + ^ +error: No warnings can be incurred under -Xfatal-warnings. +two warnings found +one error found diff --git a/test/files/neg/warn-unused-implicits.flags b/test/files/neg/warn-unused-implicits.flags new file mode 100644 index 0000000000..18169f3218 --- /dev/null +++ b/test/files/neg/warn-unused-implicits.flags @@ -0,0 +1 @@ +-Ywarn-unused:implicits -Xfatal-warnings diff --git a/test/files/neg/warn-unused-implicits.scala b/test/files/neg/warn-unused-implicits.scala new file mode 100644 index 0000000000..54f924eac0 --- /dev/null +++ b/test/files/neg/warn-unused-implicits.scala @@ -0,0 +1,32 @@ + +trait InterFace { + /** Call something. */ + def call(a: Int, b: String, c: Double)(implicit s: String): Int +} + +trait BadAPI extends InterFace { + def f(a: Int, + b: String, + c: Double + )(implicit s: String): Int = { // warn + println(b + c) + a + } + @deprecated ("no warn in deprecated API", since="yesterday") + def g(a: Int, + b: String, + c: Double + )(implicit s: String): Int = { // no warn + println(b + c) + a + } + override def call(a: Int, + b: String, + c: Double + )(implicit s: String): Int = { // no warn, required by superclass + println(b + c) + a + } + + def i(implicit s: String, t: Int) = t // yes, warn +} diff --git a/test/files/neg/warn-unused-params.check b/test/files/neg/warn-unused-params.check new file mode 100644 index 0000000000..ca6320ccd9 --- /dev/null +++ b/test/files/neg/warn-unused-params.check @@ -0,0 +1,18 @@ +warn-unused-params.scala:9: warning: parameter value b in method f is never used + b: String, // warn + ^ +warn-unused-params.scala:32: warning: parameter value s in method i is never used + def i(implicit s: String) = 42 // yes, warn + ^ +warn-unused-params.scala:49: warning: parameter value u in class Unusing is never used +class Unusing(u: Int) { // warn + ^ +warn-unused-params.scala:57: warning: parameter value s in class CaseyAtTheBat is never used +case class CaseyAtTheBat(k: Int)(s: String) // warn + ^ +warn-unused-params.scala:60: warning: parameter value readResolve in method f is never used + def f(readResolve: Int) = 42 // warn + ^ +error: No warnings can be incurred under -Xfatal-warnings. +5 warnings found +one error found diff --git a/test/files/neg/warn-unused-params.flags b/test/files/neg/warn-unused-params.flags new file mode 100644 index 0000000000..795fb74272 --- /dev/null +++ b/test/files/neg/warn-unused-params.flags @@ -0,0 +1 @@ +-Ywarn-unused:params -Xfatal-warnings diff --git a/test/files/neg/warn-unused-params.scala b/test/files/neg/warn-unused-params.scala new file mode 100644 index 0000000000..c7578e53a4 --- /dev/null +++ b/test/files/neg/warn-unused-params.scala @@ -0,0 +1,61 @@ + +trait InterFace { + /** Call something. */ + def call(a: Int, b: String, c: Double): Int +} + +trait BadAPI extends InterFace { + def f(a: Int, + b: String, // warn + c: Double): Int = { + println(c) + a + } + @deprecated ("no warn in deprecated API", since="yesterday") + def g(a: Int, + b: String, // no warn + c: Double): Int = { + println(c) + a + } + override def call(a: Int, + b: String, // no warn, required by superclass + c: Double): Int = { + println(c) + a + } + + def meth(x: Int) = x + + override def equals(other: Any): Boolean = true // no warn + + def i(implicit s: String) = 42 // yes, warn + + /* + def future(x: Int): Int = { + val y = 42 + val x = y // maybe option to warn only if shadowed + x + } + */ +} + +// mustn't alter warnings in super +trait PoorClient extends BadAPI { + override def meth(x: Int) = ??? // no warn + override def f(a: Int, b: String, c: Double): Int = a + b.toInt + c.toInt +} + +class Unusing(u: Int) { // warn + def f = ??? +} + +class Valuing(val u: Int) // no warn + +case class CaseyKasem(k: Int) // no warn + +case class CaseyAtTheBat(k: Int)(s: String) // warn + +trait Ignorance { + def f(readResolve: Int) = 42 // warn +} diff --git a/test/files/neg/warn-unused-patvars.check b/test/files/neg/warn-unused-patvars.check index 002f7a07ca..2665126a36 100644 --- a/test/files/neg/warn-unused-patvars.check +++ b/test/files/neg/warn-unused-patvars.check @@ -1,10 +1,10 @@ -warn-unused-patvars.scala:7: warning: private val x in trait Boundings is never used +warn-unused-patvars.scala:9: warning: private val x in trait Boundings is never used private val x = 42 // warn, sanity check ^ -warn-unused-patvars.scala:26: warning: local val x in method v is never used +warn-unused-patvars.scala:28: warning: local val x in method v is never used val D(x) = d // warn, fixme ^ -warn-unused-patvars.scala:30: warning: local val x in method w is never used +warn-unused-patvars.scala:32: warning: local val x in method w is never used val D(x @ _) = d // warn, fixme (valdef pos is different) ^ error: No warnings can be incurred under -Xfatal-warnings. diff --git a/test/files/neg/warn-unused-patvars.scala b/test/files/neg/warn-unused-patvars.scala index 6f4620c0c7..3d35dfedd6 100644 --- a/test/files/neg/warn-unused-patvars.scala +++ b/test/files/neg/warn-unused-patvars.scala @@ -1,4 +1,6 @@ +// verify no warning when -Ywarn-unused:-patvars + case class C(a: Int, b: String, c: Option[String]) case class D(a: Int) diff --git a/test/files/neg/warn-unused-privates.flags b/test/files/neg/warn-unused-privates.flags index 25474aefb3..5ab4f36371 100644 --- a/test/files/neg/warn-unused-privates.flags +++ b/test/files/neg/warn-unused-privates.flags @@ -1 +1 @@ --Ywarn-unused -Xfatal-warnings +-Ywarn-unused:privates,locals,patvars -Xfatal-warnings diff --git a/test/files/neg/warn-unused-privates.scala b/test/files/neg/warn-unused-privates.scala index bc2799067e..f0580f02d5 100644 --- a/test/files/neg/warn-unused-privates.scala +++ b/test/files/neg/warn-unused-privates.scala @@ -189,3 +189,7 @@ trait Forever { } yield 42 // val emitted only if needed, hence nothing unused } } + +trait Ignorance { + private val readResolve = 42 // ignore +} -- cgit v1.2.3