Skip to content

Commit bd2f51d

Browse files
committed
Update tests
1 parent 2966f04 commit bd2f51d

File tree

6 files changed

+244
-138
lines changed

6 files changed

+244
-138
lines changed

tests/explicit-nulls/pos/opaque-nullable.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ object Nullable {
1010
def some[A <: AnyRef](x: A): Nullable[A] = x
1111
def none: Nullable[Nothing] = null
1212

13-
implicit class NullableOps[A <: AnyRef](x: Nullable[A]) {
14-
def isEmpty: Boolean = x == null
15-
def flatMap[B <: AnyRef](f: A => Nullable[B]): Nullable[B] =
16-
if (x == null) null
17-
else f(x)
13+
given nullableOps as AnyRef {
14+
extension [A <: AnyRef](x: Nullable[A])
15+
def isEmpty: Boolean = x == null
16+
17+
extension [A <: AnyRef, B <: AnyRef](x: Nullable[A])
18+
def flatMap(f: A => Nullable[B]): Nullable[B] =
19+
if (x == null) null
20+
else f(x)
1821
}
1922

2023
val s1: Nullable[String] = "hello"
Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,47 @@
11
class Extensions {
2-
extension(s: String) def ext(ss: String): String = s + ss
32

4-
def f = {
5-
val x: String | Null = ???
6-
val y: String = ???
3+
extension (s1: String) def ext1(s2: String): Unit = ???
4+
extension (s1: String | Null) def ext2(s2: String | Null): Unit = ???
75

8-
x.ext(y) // error
9-
x.ext(x) // error
10-
y.ext(x) // error
11-
y.ext(y)
6+
val x: String = ???
7+
val y: String | Null = ???
8+
9+
locally {
10+
x.ext1(x)
11+
x.ext1(y) // error
12+
y.ext1(x) // error
13+
y.ext1(y) // error
14+
}
15+
16+
locally {
17+
x.ext2(x)
18+
x.ext2(y)
19+
y.ext2(x)
20+
y.ext2(y)
21+
}
22+
23+
extension (ss1: Array[String]) def exts1(ss2: Array[String]): Unit = ???
24+
extension (ss1: Array[String | Null]) def exts2(ss2: Array[String | Null]): Unit = ???
25+
26+
val xs: Array[String] = ???
27+
val ys: Array[String | Null] = ???
28+
29+
locally {
30+
xs.exts1(xs)
31+
xs.exts1(ys) // error
32+
ys.exts1(xs) // error
33+
ys.exts1(ys) // error
34+
}
35+
36+
locally {
37+
xs.exts2(xs) // error
38+
xs.exts2(ys) // error
39+
ys.exts2(xs) // error
40+
ys.exts2(ys)
1241
}
1342

1443
// i7828
15-
def g = {
44+
locally {
1645
val x = "hello, world!".split(" ").map(_.length) // error
1746
}
1847
}
Lines changed: 15 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
class S {
2+
3+
def f1(using String) = {}
4+
5+
def f2(using String | Null) = {}
6+
27
locally {
38
implicit val x: String = ???
49

@@ -16,143 +21,30 @@ class S {
1621
val y2: String | Null = summon
1722
}
1823

24+
def test3(using String) = {
25+
f1
26+
f2
27+
}
28+
1929
locally {
2030
implicit val x: String | Null = ???
2131

2232
val y1: String = summon // error
2333
val y2: String | Null = summon
2434
}
2535

26-
def test3(implicit x: String | Null) = {
36+
def test4(implicit x: String | Null) = {
2737
val y1: String = summon // error
2838
val y2: String | Null = summon
2939
}
3040

31-
def test4(using String | Null) = {
41+
def test5(using String | Null) = {
3242
val y1: String = summon // error
3343
val y2: String | Null = summon
3444
}
3545

36-
import scala.language.implicitConversions
37-
38-
locally {
39-
implicit def f(x: String): Array[String] = ???
40-
41-
val y1: String = ???
42-
val y2: String | Null = ???
43-
44-
val z1: Array[String] = y1
45-
val z2: Array[String | Null] = y1 // error
46-
val z3: Array[String] | Null = y1
47-
val z4: Array[String | Null] | Null = y1 // error
48-
49-
val z5: Array[String] = y2 // error
50-
val z6: Array[String | Null] = y2 // error
51-
val z7: Array[String] | Null = y2 // error
52-
val z8: Array[String | Null] | Null = y2 // error
53-
}
54-
55-
locally {
56-
implicit def g(x: Array[String]): String = ???
57-
58-
val y1: Array[String] = ???
59-
val y2: Array[String] | Null = ???
60-
val y3: Array[String | Null] | Null = ???
61-
62-
y1: String
63-
y2: String // error
64-
y3: String // error
65-
66-
y1: String | Null
67-
y2: String | Null // error
68-
y3: String | Null // error
69-
}
70-
71-
locally {
72-
implicit def g(x: Array[String | Null]): String | Null = ???
73-
74-
val y1: Array[String] = ???
75-
val y2: Array[String] | Null = ???
76-
val y3: Array[String | Null] = ???
77-
val y4: Array[String | Null] | Null = ???
78-
79-
y1: String // error
80-
y2: String // error
81-
y3: String // error
82-
y4: String // error
83-
84-
y1: String | Null // error
85-
y2: String | Null // error
86-
y3: String | Null
87-
y4: String | Null // error
88-
}
89-
90-
locally {
91-
given Conversion[String, Array[String]] = _ => ???
92-
93-
val y1: String = ???
94-
val y2: String | Null = ???
95-
96-
val z1: Array[String] = y1
97-
val z2: Array[String | Null] = y1 // error
98-
val z3: Array[String] | Null = y1
99-
val z4: Array[String | Null] | Null = y1 // error
100-
101-
val z5: Array[String] = y2 // error
102-
val z6: Array[String | Null] = y2 // error
103-
val z7: Array[String] | Null = y2 // error
104-
val z8: Array[String | Null] | Null = y2 // error
105-
}
106-
107-
locally {
108-
given Conversion[Array[String], String] = _ => ???
109-
110-
val y1: Array[String] = ???
111-
val y2: Array[String] | Null = ???
112-
val y3: Array[String | Null] | Null = ???
113-
114-
y1: String
115-
y2: String // error
116-
y3: String // error
117-
118-
y1: String | Null
119-
y2: String | Null // error
120-
y3: String | Null // error
121-
}
122-
123-
abstract class MyConversion[T] extends Conversion[T, Array[T]]
124-
125-
locally {
126-
given MyConversion[String] = _ => ???
127-
128-
val y1: String = ???
129-
val y2: String | Null = ???
130-
131-
val z1: Array[String] = y1
132-
val z2: Array[String | Null] = y1 // error
133-
val z3: Array[String] | Null = y1
134-
val z4: Array[String | Null] | Null = y1 // error
135-
136-
val z5: Array[String] = y2 // error
137-
val z6: Array[String | Null] = y2 // error
138-
val z7: Array[String] | Null = y2 // error
139-
val z8: Array[String | Null] | Null = y2 // error
140-
}
141-
142-
def test5[T <: AnyRef] = {
143-
given Conversion[T, Array[T]] = _ => ???
144-
145-
val y1: T = ???
146-
val y2: T | Null = ???
147-
148-
val z1: Array[T] = y1
149-
val z2: Array[T | Null] = y1 // error
150-
val z3: Array[T] | Null = y1
151-
val z4: Array[T | Null] | Null = y1 // error
152-
153-
val z5: Array[T] = y2 // error
154-
val z6: Array[T | Null] = y2 // error
155-
val z7: Array[T] | Null = y2 // error
156-
val z8: Array[T | Null] | Null = y2 // error
46+
def test6(using String | Null) = {
47+
f1 // error
48+
f2
15749
}
15850
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
class S {
2+
locally {
3+
implicit def f(x: String): Array[String] = ???
4+
5+
val y1: String = ???
6+
val y2: String | Null = ???
7+
8+
y1: Array[String]
9+
y1: Array[String | Null] // error
10+
y1: Array[String] | Null
11+
y1: Array[String | Null] | Null // error
12+
13+
y2: Array[String] // error
14+
y2: Array[String | Null] // error
15+
y2: Array[String] | Null // error
16+
y2: Array[String | Null] | Null // error
17+
}
18+
19+
locally {
20+
implicit def g(x: Array[String]): String = ???
21+
22+
val y1: Array[String] = ???
23+
val y2: Array[String] | Null = ???
24+
val y3: Array[String | Null] = ???
25+
val y4: Array[String | Null] | Null = ???
26+
27+
y1: String
28+
y2: String // error
29+
y3: String // error
30+
y4: String // error
31+
32+
y1: String | Null
33+
y2: String | Null // error
34+
y3: String | Null // error
35+
y4: String | Null // error
36+
}
37+
38+
locally {
39+
implicit def g(x: Array[String | Null]): String | Null = ???
40+
41+
val y1: Array[String] = ???
42+
val y2: Array[String] | Null = ???
43+
val y3: Array[String | Null] = ???
44+
val y4: Array[String | Null] | Null = ???
45+
46+
y1: String // error
47+
y2: String // error
48+
y3: String // error
49+
y4: String // error
50+
51+
y1: String | Null // error
52+
y2: String | Null // error
53+
y3: String | Null
54+
y4: String | Null // error
55+
}
56+
}

0 commit comments

Comments
 (0)