Skip to content

Commit ed1f2af

Browse files
sjrdWojciechMazur
authored andcommitted
Fix #18658: Handle varargs of generic types in JSExportsGen.
When extracting the type of a varargs parameter, we have to go back to before erasure. However, that gives us a non-erased type inside as well. We need to re-erase that type to get something sensible for the back-end. [Cherry-picked 4538875]
1 parent 5d62112 commit ed1f2af

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

compiler/src/dotty/tools/dotc/transform/sjs/JSSymUtils.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ object JSSymUtils {
185185
val list =
186186
for ((name, info) <- paramNamesAndTypes) yield {
187187
val v =
188-
if (info.isRepeatedParam) Some(info.repeatedToSingle.widenDealias)
188+
if (info.isRepeatedParam) Some(TypeErasure.erasure(info.repeatedToSingle))
189189
else None
190190
name -> v
191191
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.scalajs.testsuite.jsinterop
2+
3+
import org.junit.Assert.*
4+
import org.junit.Test
5+
6+
import scala.scalajs.js
7+
import scala.scalajs.js.annotation.*
8+
9+
class NonNativeJSTypeTestScala3 {
10+
import NonNativeJSTypeTestScala3.*
11+
12+
@Test
13+
def overloadWithVarargOfGenericType(): Unit = {
14+
class OverloadWithVarargOfGenericType extends js.Object {
15+
def overloaded(x: Int): Int = x
16+
def overloaded(xs: (Int, Int)*): Int = xs.size
17+
}
18+
19+
val obj = new OverloadWithVarargOfGenericType
20+
assertEquals(5, obj.overloaded(5))
21+
assertEquals(1, obj.overloaded((5, 6)))
22+
assertEquals(2, obj.overloaded((1, 2), (3, 4)))
23+
}
24+
25+
@Test
26+
def overloadWithVarargOfValueClass(): Unit = {
27+
class OverloadWithVarargOfValueClass extends js.Object {
28+
def overloaded(x: Int): Int = x
29+
def overloaded(xs: VC*): Int = xs.size
30+
}
31+
32+
val obj = new OverloadWithVarargOfValueClass
33+
assertEquals(5, obj.overloaded(5))
34+
assertEquals(1, obj.overloaded(new VC(5)))
35+
assertEquals(2, obj.overloaded(new VC(5), new VC(6)))
36+
}
37+
38+
@Test
39+
def overloadWithVarargOfGenericValueClass(): Unit = {
40+
class OverloadWithVarargOfGenericValueClass extends js.Object {
41+
def overloaded(x: Int): Int = x
42+
def overloaded(xs: GenVC[Int]*): Int = xs.size
43+
}
44+
45+
val obj = new OverloadWithVarargOfGenericValueClass
46+
assertEquals(5, obj.overloaded(5))
47+
assertEquals(1, obj.overloaded(new GenVC(5)))
48+
assertEquals(2, obj.overloaded(new GenVC(5), new GenVC(6)))
49+
}
50+
51+
@Test
52+
def overloadWithVarargOfOpaqueTypeAlias(): Unit = {
53+
import OpaqueContainer.*
54+
55+
class OverloadWithVarargOfOpaqueTypeAlias extends js.Object {
56+
def overloaded(x: String): Int = x.toInt
57+
def overloaded(xs: OpaqueInt*): Int = xs.size
58+
}
59+
60+
val obj = new OverloadWithVarargOfOpaqueTypeAlias
61+
assertEquals(5, obj.overloaded("5"))
62+
assertEquals(1, obj.overloaded(fromInt(5)))
63+
assertEquals(2, obj.overloaded(fromInt(5), fromInt(6)))
64+
}
65+
}
66+
67+
object NonNativeJSTypeTestScala3 {
68+
final class VC(val x: Int) extends AnyVal
69+
70+
final class GenVC[T](val x: T) extends AnyVal
71+
72+
object OpaqueContainer {
73+
opaque type OpaqueInt = Int
74+
75+
def fromInt(x: Int): OpaqueInt = x
76+
def toInt(x: OpaqueInt): Int = x
77+
}
78+
}

0 commit comments

Comments
 (0)