Skip to content

Commit c2e5de7

Browse files
committed
Merge pull request scala-js#1885 from sjrd/js-native-annotation
Fix scala-js#1868: Add an annotation `@js.native` for native JS types.
2 parents f80641f + e2325e4 commit c2e5de7

File tree

64 files changed

+404
-86
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+404
-86
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ trait JSDefinitions { self: JSGlobalAddons =>
2929
lazy val JSPackage_debugger = getMemberMethod(ScalaJSJSPackage, newTermName("debugger"))
3030
lazy val JSPackage_native = getMemberMethod(ScalaJSJSPackage, newTermName("native"))
3131

32+
lazy val JSNativeAnnotation = getRequiredClass("scala.scalajs.js.native")
33+
3234
lazy val JSAnyClass = getRequiredClass("scala.scalajs.js.Any")
3335
lazy val JSDynamicClass = getRequiredClass("scala.scalajs.js.Dynamic")
3436
lazy val JSDictionaryClass = getRequiredClass("scala.scalajs.js.Dictionary")

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,18 @@ abstract class PrepJSInterop extends plugins.PluginComponent
404404

405405
val isJSNative = !sym.hasAnnotation(ScalaJSDefinedAnnotation)
406406

407+
if (isJSNative && !isJSAnonFun &&
408+
!sym.hasAnnotation(JSNativeAnnotation)) {
409+
reporter.warning(implDef.pos,
410+
"Classes, traits and objects inheriting from js.Any should be " +
411+
"annotated with @js.native, unless they have @ScalaJSDefined. " +
412+
"The default will switch to Scala.js-defined in the next major " +
413+
"version of Scala.js.")
414+
} else if (!isJSNative && sym.hasAnnotation(JSNativeAnnotation)) {
415+
reporter.error(implDef.pos,
416+
"@ScalaJSDefined and @js.native cannot be used together")
417+
}
418+
407419
def strKind =
408420
if (sym.isTrait) "trait"
409421
else if (sym.isModuleClass) "object"

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class DiverseErrorsTest extends DirectTest with TestHelpers {
1515
def noIsInstanceOnJSRaw: Unit = {
1616

1717
"""
18+
@js.native
1819
trait JSRaw extends js.Object
1920
2021
class A {
@@ -23,7 +24,7 @@ class DiverseErrorsTest extends DirectTest with TestHelpers {
2324
}
2425
""" hasErrors
2526
"""
26-
|newSource1.scala:7: error: isInstanceOf[JSRaw] not supported because it is a raw JS trait
27+
|newSource1.scala:8: error: isInstanceOf[JSRaw] not supported because it is a raw JS trait
2728
| def x = a.isInstanceOf[JSRaw]
2829
| ^
2930
"""
@@ -57,9 +58,9 @@ class DiverseErrorsTest extends DirectTest with TestHelpers {
5758
"""
5859

5960
"""
60-
class NativeJSClass extends js.Object
61-
trait NativeJSTrait extends js.Object
62-
object NativeJSObject extends js.Object
61+
@js.native class NativeJSClass extends js.Object
62+
@js.native trait NativeJSTrait extends js.Object
63+
@js.native object NativeJSObject extends js.Object
6364
6465
@ScalaJSDefined class JSClass extends js.Object
6566
@ScalaJSDefined trait JSTrait extends js.Object
@@ -124,7 +125,7 @@ class DiverseErrorsTest extends DirectTest with TestHelpers {
124125
import scala.scalajs.runtime
125126
126127
object ScalaObject
127-
object NativeJSObject extends js.Object
128+
@js.native object NativeJSObject extends js.Object
128129
@ScalaJSDefined object JSObject extends js.Object
129130
130131
object A {
@@ -151,9 +152,9 @@ class DiverseErrorsTest extends DirectTest with TestHelpers {
151152
class ScalaClass
152153
trait ScalaTrait
153154
154-
class NativeJSClass extends js.Object
155-
trait NativeJSTrait extends js.Object
156-
object NativeJSObject extends js.Object
155+
@js.native class NativeJSClass extends js.Object
156+
@js.native trait NativeJSTrait extends js.Object
157+
@js.native object NativeJSObject extends js.Object
157158
158159
@ScalaJSDefined class JSClass extends js.Object
159160
@ScalaJSDefined trait JSTrait extends js.Object

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ class JSExportTest extends DirectTest with TestHelpers {
375375
@ScalaJSDefined trait Test2 extends js.Object
376376
377377
@JSExport
378+
@js.native
378379
trait Test3 extends js.Object
379380
""" hasErrors
380381
"""
@@ -564,6 +565,7 @@ class JSExportTest extends DirectTest with TestHelpers {
564565
import scala.scalajs.js
565566
566567
@JSExport
568+
@js.native
567569
object A extends js.Object
568570
""" hasErrors
569571
"""
@@ -576,6 +578,7 @@ class JSExportTest extends DirectTest with TestHelpers {
576578
import scala.scalajs.js
577579
578580
@JSExport
581+
@js.native
579582
trait A extends js.Object
580583
""" hasErrors
581584
"""
@@ -588,6 +591,7 @@ class JSExportTest extends DirectTest with TestHelpers {
588591
import scala.scalajs.js
589592
590593
@JSExport
594+
@js.native
591595
class A extends js.Object {
592596
@JSExport
593597
def this(x: Int) = this()
@@ -597,7 +601,7 @@ class JSExportTest extends DirectTest with TestHelpers {
597601
|newSource1.scala:5: error: You may not export a native JS class or object
598602
| @JSExport
599603
| ^
600-
|newSource1.scala:7: error: You may not export a constructor of a subclass of js.Any
604+
|newSource1.scala:8: error: You may not export a constructor of a subclass of js.Any
601605
| @JSExport
602606
| ^
603607
"""
@@ -610,13 +614,14 @@ class JSExportTest extends DirectTest with TestHelpers {
610614
"""
611615
import scala.scalajs.js
612616
617+
@js.native
613618
class A extends js.Object {
614619
@JSExport
615620
def foo: Int = js.native
616621
}
617622
""" hasErrors
618623
"""
619-
|newSource1.scala:6: error: You may not export a method of a subclass of js.Any
624+
|newSource1.scala:7: error: You may not export a method of a subclass of js.Any
620625
| @JSExport
621626
| ^
622627
"""

0 commit comments

Comments
 (0)