@@ -158,6 +158,126 @@ class DottyBytecodeTests extends DottyBytecodeTest {
158
158
}
159
159
}
160
160
161
+ @ Test def switchOnUnionOfInts = {
162
+ val source =
163
+ """
164
+ |object Foo {
165
+ | def foo(x: 1 | 2 | 3 | 4 | 5) = x match {
166
+ | case 1 => println(3)
167
+ | case 2 | 3 => println(2)
168
+ | case 4 => println(1)
169
+ | case 5 => println(0)
170
+ | }
171
+ |}
172
+ """ .stripMargin
173
+
174
+ checkBCode(source) { dir =>
175
+ val moduleIn = dir.lookupName(" Foo$.class" , directory = false )
176
+ val moduleNode = loadClassNode(moduleIn.input)
177
+ val methodNode = getMethod(moduleNode, " foo" )
178
+ assert(verifySwitch(methodNode))
179
+ }
180
+ }
181
+
182
+ @ Test def switchOnUnionOfStrings = {
183
+ val source =
184
+ """
185
+ |object Foo {
186
+ | def foo(s: "one" | "two" | "three" | "four" | "five") = s match {
187
+ | case "one" => println(3)
188
+ | case "two" | "three" => println(2)
189
+ | case "four" | "five" => println(1)
190
+ | case _ => println(0)
191
+ | }
192
+ |}
193
+ """ .stripMargin
194
+
195
+ checkBCode(source) { dir =>
196
+ val moduleIn = dir.lookupName(" Foo$.class" , directory = false )
197
+ val moduleNode = loadClassNode(moduleIn.input)
198
+ val methodNode = getMethod(moduleNode, " foo" )
199
+ assert(verifySwitch(methodNode))
200
+ }
201
+ }
202
+
203
+ @ Test def switchOnUnionOfChars = {
204
+ val source =
205
+ """
206
+ |object Foo {
207
+ | def foo(ch: 'a' | 'b' | 'c' | 'd' | 'e'): Int = ch match {
208
+ | case 'a' => 1
209
+ | case 'b' => 2
210
+ | case 'c' => 3
211
+ | case 'd' => 4
212
+ | case 'e' => 5
213
+ | }
214
+ |}
215
+ """ .stripMargin
216
+
217
+ checkBCode(source) { dir =>
218
+ val moduleIn = dir.lookupName(" Foo$.class" , directory = false )
219
+ val moduleNode = loadClassNode(moduleIn.input)
220
+ val methodNode = getMethod(moduleNode, " foo" )
221
+ assert(verifySwitch(methodNode))
222
+ }
223
+ }
224
+
225
+ @ Test def switchOnUnionOfIntSingletons = {
226
+ val source =
227
+ """
228
+ |object Foo {
229
+ | final val One = 1
230
+ | final val Two = 2
231
+ | final val Three = 3
232
+ | final val Four = 4
233
+ | final val Five = 5
234
+ | type Values = One.type | Two.type | Three.type | Four.type | Five.type
235
+ |
236
+ | def foo(s: Values) = s match {
237
+ | case One => println(3)
238
+ | case Two | Three => println(2)
239
+ | case Four => println(1)
240
+ | case Five => println(0)
241
+ | }
242
+ |}
243
+ """ .stripMargin
244
+
245
+ checkBCode(source) { dir =>
246
+ val moduleIn = dir.lookupName(" Foo$.class" , directory = false )
247
+ val moduleNode = loadClassNode(moduleIn.input)
248
+ val methodNode = getMethod(moduleNode, " foo" )
249
+ assert(verifySwitch(methodNode))
250
+ }
251
+ }
252
+
253
+ @ Test def switchOnUnionOfStringSingletons = {
254
+ val source =
255
+ """
256
+ |object Foo {
257
+ | final val One = "one"
258
+ | final val Two = "two"
259
+ | final val Three = "three"
260
+ | final val Four = "four"
261
+ | final val Five = "five"
262
+ | type Values = One.type | Two.type | Three.type | Four.type | Five.type
263
+ |
264
+ | def foo(s: Values) = s match {
265
+ | case One => println(3)
266
+ | case Two | Three => println(2)
267
+ | case Four => println(1)
268
+ | case Five => println(0)
269
+ | }
270
+ |}
271
+ """ .stripMargin
272
+
273
+ checkBCode(source) { dir =>
274
+ val moduleIn = dir.lookupName(" Foo$.class" , directory = false )
275
+ val moduleNode = loadClassNode(moduleIn.input)
276
+ val methodNode = getMethod(moduleNode, " foo" )
277
+ assert(verifySwitch(methodNode))
278
+ }
279
+ }
280
+
161
281
@ Test def matchWithDefaultNoThrowMatchError = {
162
282
val source =
163
283
""" class Test {
0 commit comments