8000 Merge pull request #4334 from gzm0/handle-js-optional-default-params · scala-js/scala-js@eba131d · GitHub
[go: up one dir, main page]

Skip to content

Commit eba131d

Browse files
authored
Merge pull request #4334 from gzm0/handle-js-optional-default-params
Fix #4322: Handle JSOptional default parameters in JS traits
2 parents 5d36352 + a919611 commit eba131d

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

compiler/src/main/scala/org/scalajs/nscplugin/GenJSExports.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,10 @@ trait GenJSExports[G <: Global with Singleton] extends SubComponent {
767767

768768
if (isJSType(trgSym)) {
769769
if (isNonNativeJSClass(defaultGetter.owner)) {
770-
genApplyJSClassMethod(trgTree, defaultGetter, defaultGetterArgs)
770+
if (defaultGetter.hasAnnotation(JSOptionalAnnotation))
771+
js.Undefined()
772+
else
773+
genApplyJSClassMethod(trgTree, defaultGetter, defaultGetterArgs)
771774
} else {
772775
reporter.error(paramPos, "When overriding a native method " +
773776
"with default arguments, the overriding method must " +

test-suite/js/src/test/scala/org/scalajs/testsuite/jsinterop/JSOptionalTest.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,23 @@ class JSOptionalTest {
239239
assertEquals("function", js.typeOf(obj.f))
240240
assertEquals(6, obj.f.get(5))
241241
}
242+
243+
@Test def traitWithOptionalDefaultParameter(): Unit = {
244+
object InheritDefault extends TraitWithOptionalDefaultParameter {
245+
def foo(x: js.UndefOr[Int]): Int = x.getOrElse(5)
246+
}
247+
248+
assertEquals(5, InheritDefault.foo())
249+
assertEquals(10, InheritDefault.foo(10))
250+
251+
object NewDefault extends TraitWithOptionalDefaultParameter {
252+
def foo(x: js.UndefOr[Int] = 6): Int =
253+
x.getOrElse(throw new AssertionError("x was js.undefined"))
254+
}
255+
256+
assertEquals(6, NewDefault.foo())
257+
assertEquals(10, NewDefault.foo(10))
258+
}
242259
}
243260

244261
object JSOptionalTest {
@@ -303,4 +320,8 @@ object JSOptionalTest {
303320
trait TraitWithOptionalFunction extends js.Object {
304321
val f: js.UndefOr[js.Function1[Int, Int]] = js.undefined
305322
}
323+
324+
trait TraitWithOptionalDefaultParameter extends js.Object {
325+
def foo(x: js.UndefOr[Int] = js.undefined): Int
326+
}
306327
}

0 commit comments

Comments
 (0)
0