blob: b7a2f1c414ea468c557cb25b5584bb12c6c61c41 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
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 { })
}
}
|