Skip to content

Commit a9d2666

Browse files
committed
Fix scala-js#1983: Warn if @ScalaJSDefined overrides js names differ.
1 parent 7eda38c commit a9d2666

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
@@ -719,6 +719,18 @@ abstract class PrepJSInterop extends plugins.PluginComponent
719719
"A Scala.js-defined JS trait cannot contain private members")
720720
}
721721
}
722+
723+
// @ScalaJSDefined overrides with different js names - issue #1983
724+
sym.allOverriddenSymbols.headOption match {
725+
case Some(overridedSym) =>
726+
if (jsInterop.jsNameOf(sym) != jsInterop.jsNameOf(overridedSym)) {
727+
reporter.warning(tree.pos,
728+
"A Scala.js-defined JS class member is overriding another " +
729+
"with a different exported name.")
730+
}
731+
732+
case None => // Do nothing
733+
}
722734
}
723735

724736
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
@@ -750,4 +750,111 @@ class JSInteropTest extends DirectTest with TestHelpers {
750750

751751
}
752752

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

0 commit comments

Comments
 (0)