Skip to content

Commit 497ca3f

Browse files
committed
Fix scala-js#1983: Warn if @ScalaJSDefined overrides js names differ.
1 parent 83c1139 commit 497ca3f

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

compiler/src/main/scala/org/scalajs/core/compiler/PrepJSInterop.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,18 @@ abstract class PrepJSInterop extends plugins.PluginComponent
724724
"A Scala.js-defined JS trait cannot contain private members")
725725
}
726726
}
727+
728+
// @ScalaJSDefined overrides with different js names - issue #1983
729+
sym.allOverriddenSymbols.headOption match {
730+
case Some(overridedSym) =>
731+
if (jsInterop.jsNameOf(sym) != jsInterop.jsNameOf(overridedSym)) {
732+
reporter.warning(tree.pos,
733+
"A Scala.js-defined JS class member is overriding another " +
734+
"with a different exported name.")
735+
}
736+
737+
case None => // Do nothing
738+
}
727739
}
728740

729741
if (sym.isPrimaryConstructor || sym.isValueParameter ||

compiler/src/test/scala/org/scalajs/core/compiler/test/JSInteropTest.scala

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,4 +764,111 @@ class JSInteropTest extends DirectTest with TestHelpers {
764764

765765
}
766766

767+
@Test
768+
def scalaJSDefinedJSNameOverrideWarnings: Unit = {
769+
"""
770+
@ScalaJSDefined
771+
abstract class A extends js.Object {
772+
def bar(): Int
773+
}
774+
@ScalaJSDefined
775+
class B extends A {
776+
override def bar() = 1
777+
}
778+
""".hasNoWarns
779+
780+
"""
781+
@ScalaJSDefined
782+
abstract class A extends js.Object {
783+
@JSName("foo")
784+
def bar(): Int
785+
}
786+
@ScalaJSDefined
787+
class B extends A {
788+
@JSName("foo")
789+
override def bar() = 1
790+
}
791+
""".hasNoWarns
792+
793+
"""
794+
@ScalaJSDefined
795+
abstract class A extends js.Object {
796+
@JSName("foo")
797+
def bar(): Int
798+
}
799+
@ScalaJSDefined
800+
class B extends A {
801+
@JSName("baz")
802+
override def bar() = 1
803+
}
804+
""" hasWarns
805+
"""
806+
|newSource1.scala:13: warning: A Scala.js-defined JS class member is overriding another with a different exported name.
807+
| override def bar() = 1
808+
| ^
809+
"""
810+
811+
"""
812+
@ScalaJSDefined
813+
abstract class A extends js.Object {
814+
@JSName("foo")
815+
def bar(): Int
816+
}
817+
@ScalaJSDefined
818+
class B extends A {
819+
override def bar() = 1
820+
}
821+
""" hasWarns
822+
"""
823+
|newSource1.scala:12: warning: A Scala.js-defined JS class member is overriding another with a different exported name.
824+
| override def bar() = 1
825+
| ^
826+
"""
827+
828+
"""
829+
@ScalaJSDefined
830+
abstract class A extends js.Object {
831+
@JSName("foo")
832+
def bar(): Object
833+
}
834+
@ScalaJSDefined
835+
abstract class B extends A {
836+
override def bar(): String
837+
}
838+
@ScalaJSDefined
839+
class C extends B {
840+
override def bar() = "1"
841+
}
842+
""" hasWarns
843+
"""
844+
|newSource1.scala:12: warning: A Scala.js-defined JS class member is overriding another with a different exported name.
845+
| override def bar(): String
846+
| ^
847+
"""
848+
849+
"""
850+
@ScalaJSDefined
851+
abstract class A extends js.Object {
852+
def bar(): Object
853+
}
854+
@ScalaJSDefined
855+
abstract class B extends A {
856+
@JSName("foo")
857+
override def bar(): String
858+
}
859+
@ScalaJSDefined
860+
class C extends B {
861+
override def bar() = "1"
862+
}
863+
""" hasWarns
864+
"""
865+
|newSource1.scala:12: warning: A Scala.js-defined JS class member is overriding another with a different exported name.
866+
| override def bar(): String
867+
| ^
868+
|newSource1.scala:16: warning: A Scala.js-defined JS class member is overriding another with a different exported name.
869+
| override def bar() = "1"
870+
| ^
871+
"""
872+
}
873+
767874
}

0 commit comments

Comments
 (0)