From 8c50d842a39e2a5f02aca462b834ab2b0c2a14af Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 7 Jan 2016 14:38:49 -0800 Subject: [backport] SI-9616 False positive in unused import warning This is a minimal backport of the fix for SI-9383. --- test/files/neg/warn-unused-imports.check | 46 ++++-- test/files/neg/warn-unused-imports.scala | 125 ----------------- test/files/neg/warn-unused-imports/sample_1.scala | 17 +++ .../warn-unused-imports_2.scala | 155 +++++++++++++++++++++ 4 files changed, 206 insertions(+), 137 deletions(-) delete mode 100644 test/files/neg/warn-unused-imports.scala create mode 100644 test/files/neg/warn-unused-imports/sample_1.scala create mode 100644 test/files/neg/warn-unused-imports/warn-unused-imports_2.scala (limited to 'test') diff --git a/test/files/neg/warn-unused-imports.check b/test/files/neg/warn-unused-imports.check index 36c6dd03c3..0a53d7a9cd 100644 --- a/test/files/neg/warn-unused-imports.check +++ b/test/files/neg/warn-unused-imports.check @@ -1,33 +1,55 @@ -warn-unused-imports.scala:57: warning: Unused import +warn-unused-imports_2.scala:133: error: type mismatch; + found : Int(42) + required: Sample.X + f(42) // error + ^ +warn-unused-imports_2.scala:57: warning: Unused import import p1.A // warn ^ -warn-unused-imports.scala:62: warning: Unused import +warn-unused-imports_2.scala:62: warning: Unused import import p1.{ A, B } // warn on A ^ -warn-unused-imports.scala:67: warning: Unused import +warn-unused-imports_2.scala:67: warning: Unused import import p1.{ A, B } // warn on both ^ -warn-unused-imports.scala:67: warning: Unused import +warn-unused-imports_2.scala:67: warning: Unused import import p1.{ A, B } // warn on both ^ -warn-unused-imports.scala:73: warning: Unused import +warn-unused-imports_2.scala:73: warning: Unused import import c._ // warn ^ -warn-unused-imports.scala:78: warning: Unused import +warn-unused-imports_2.scala:78: warning: Unused import import p1._ // warn ^ -warn-unused-imports.scala:85: warning: Unused import +warn-unused-imports_2.scala:85: warning: Unused import import c._ // warn ^ -warn-unused-imports.scala:91: warning: Unused import +warn-unused-imports_2.scala:91: warning: Unused import import p1.c._ // warn ^ -warn-unused-imports.scala:98: warning: Unused import +warn-unused-imports_2.scala:98: warning: Unused import import p1._ // warn ^ -warn-unused-imports.scala:118: warning: Unused import +warn-unused-imports_2.scala:118: warning: Unused import import p1.A // warn ^ -error: No warnings can be incurred under -Xfatal-warnings. -10 warnings found +warn-unused-imports_2.scala:132: warning: Unused import + import Sample.Implicits._ // warn + ^ +warn-unused-imports_2.scala:143: warning: Unused import + import Sample.Implicits.useless // warn + ^ +warn-unused-imports_2.scala:147: warning: Unused import + import java.io.File // warn + ^ +warn-unused-imports_2.scala:148: warning: Unused import + import scala.concurrent.Future // warn + ^ +warn-unused-imports_2.scala:149: warning: Unused import + import scala.concurrent.ExecutionContext.Implicits.global // warn + ^ +warn-unused-imports_2.scala:150: warning: Unused import + import p1.A // warn + ^ +16 warnings found one error found diff --git a/test/files/neg/warn-unused-imports.scala b/test/files/neg/warn-unused-imports.scala deleted file mode 100644 index b7a2f1c414..0000000000 --- a/test/files/neg/warn-unused-imports.scala +++ /dev/null @@ -1,125 +0,0 @@ -class Bippo { - def length: Int = 123 - class Tree -} - -package object p1 { - class A - implicit class B(val s: String) { def bippy = s } - val c: Bippo = new Bippo - type D = String -} -package object p2 { - class A - implicit class B(val s: String) { def bippy = s } - val c: Bippo = new Bippo - type D = Int -} - -trait NoWarn { - { - import p1._ // no warn - println("abc".bippy) - } - - { - import p1._ // no warn - println(new A) - } - - { - import p1.B // no warn - println("abc".bippy) - } - - { - import p1._ // no warn - import c._ // no warn - println(length) - } - - { - import p1._ // no warn - import c._ // no warn - val x: Tree = null - println(x) - } - - { - import p1.D // no warn - val x: D = null - println(x) - } -} - -trait Warn { - { - import p1.A // warn - println(123) - } - - { - import p1.{ A, B } // warn on A - println("abc".bippy) - } - - { - import p1.{ A, B } // warn on both - println(123) - } - - { - import p1._ // no warn (technically this could warn, but not worth the effort to unroll unusedness transitively) - import c._ // warn - println(123) - } - - { - import p1._ // warn - println(123) - } - - { - class Tree - import p1._ // no warn - import c._ // warn - val x: Tree = null - println(x) - } - - { - import p1.c._ // warn - println(123) - } -} - -trait Nested { - { - import p1._ // warn - trait Warn { // warn about unused local trait for good measure - import p2._ - println(new A) - println("abc".bippy) - } - println("") - } - - { - import p1._ // no warn - trait NoWarn { - import p2.B // no warn - println("abc".bippy) - println(new A) - } - println(new NoWarn { }) - } - - { - import p1.A // warn - trait Warn { - import p2.A - println(new A) - } - println(new Warn { }) - } -} diff --git a/test/files/neg/warn-unused-imports/sample_1.scala b/test/files/neg/warn-unused-imports/sample_1.scala new file mode 100644 index 0000000000..d2f86239db --- /dev/null +++ b/test/files/neg/warn-unused-imports/sample_1.scala @@ -0,0 +1,17 @@ + +import language._ + +object Sample { + trait X + trait Y + + // import of the non-implicit should be unused + object Implicits { + def `int to X`(i: Int): X = null + implicit def `int to Y`(i: Int): Y = null + implicit def useless(i: Int): String = null + } + + def f(x: X) = ??? + def g(y: Y) = ??? +} diff --git a/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala b/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala new file mode 100644 index 0000000000..ded1186209 --- /dev/null +++ b/test/files/neg/warn-unused-imports/warn-unused-imports_2.scala @@ -0,0 +1,155 @@ +class Bippo { + def length: Int = 123 + class Tree +} + +package object p1 { + class A + implicit class B(val s: String) { def bippy = s } + val c: Bippo = new Bippo + type D = String +} +package object p2 { + class A + implicit class B(val s: String) { def bippy = s } + val c: Bippo = new Bippo + type D = Int +} + +trait NoWarn { + { + import p1._ // no warn + println("abc".bippy) + } + + { + import p1._ // no warn + println(new A) + } + + { + import p1.B // no warn + println("abc".bippy) + } + + { + import p1._ // no warn + import c._ // no warn + println(length) + } + + { + import p1._ // no warn + import c._ // no warn + val x: Tree = null + println(x) + } + + { + import p1.D // no warn + val x: D = null + println(x) + } +} + +trait Warn { + { + import p1.A // warn + println(123) + } + + { + import p1.{ A, B } // warn on A + println("abc".bippy) + } + + { + import p1.{ A, B } // warn on both + println(123) + } + + { + import p1._ // no warn (technically this could warn, but not worth the effort to unroll unusedness transitively) + import c._ // warn + println(123) + } + + { + import p1._ // warn + println(123) + } + + { + class Tree + import p1._ // no warn + import c._ // warn + val x: Tree = null + println(x) + } + + { + import p1.c._ // warn + println(123) + } +} + +trait Nested { + { + import p1._ // warn + trait Warn { // warn about unused local trait for good measure + import p2._ + println(new A) + println("abc".bippy) + } + println("") + } + + { + import p1._ // no warn + trait NoWarn { + import p2.B // no warn + println("abc".bippy) + println(new A) + } + println(new NoWarn { }) + } + + { + import p1.A // warn + trait Warn { + import p2.A + println(new A) + } + println(new Warn { }) + } +} + +// test unusage of imports from other compilation units after implicit search +trait Outsiders { + { + //implicit search should not disable warning + import Sample._ + import Sample.Implicits._ // warn + f(42) // error + } + { + import Sample._ + import Sample.Implicits._ // nowarn + g(42) // ok + } + { + import Sample._ + import Sample.Implicits.`int to Y` // nowarn + import Sample.Implicits.useless // warn + g(42) // ok + } + { + import java.io.File // warn + import scala.concurrent.Future // warn + import scala.concurrent.ExecutionContext.Implicits.global // warn + import p1.A // warn + import p1.B // no warn + println("abc".bippy) + //Future("abc".bippy) + } +} -- cgit v1.2.3