From 0e48a4367d075babbca2a5b6c7b74142502d04a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Doeraene?= Date: Tue, 27 Aug 2019 11:28:59 +0200 Subject: [PATCH 1/4] Enable javalib/lang/IntegerTest for Scala.js. --- project/Build.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/project/Build.scala b/project/Build.scala index e3cbbe75a847..9963a3b81ba0 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -947,6 +947,7 @@ object Build { val dir = fetchScalaJSSource.value / "test-suite" ( (dir / "shared/src/test/scala/org/scalajs/testsuite/compiler" ** "IntTest.scala").get + ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "IntegerTest.scala").get ++ (dir / "shared/src/test/require-jdk8/org/scalajs/testsuite/javalib/util" ** "Base64Test.scala").get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/utils" ** "*.scala").get ) From b9792c36362376bb37695f7e6e742541e17579d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Doeraene?= Date: Tue, 27 Aug 2019 13:09:48 +0200 Subject: [PATCH 2/4] Do not rewrite trait method calls to static helpers in Scala.js. In Scala.js, even Scala 2 already relies on default methods, and does not use static method helpers. --- compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala b/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala index aafdc8968ab6..62d055e60e3c 100644 --- a/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala +++ b/compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala @@ -75,7 +75,7 @@ class LinkScala2Impls extends MiniPhase with IdentityDenotTransformer { thisPhas def currentClass = ctx.owner.enclosingClass.asClass app match { case Apply(sel @ Select(Super(_, _), _), args) - if sel.symbol.owner.is(Scala2x) && currentClass.mixins.contains(sel.symbol.owner) => + if sel.symbol.owner.is(Scala2x) && currentClass.mixins.contains(sel.symbol.owner) && !ctx.settings.scalajs.value => val impl = implMethod(sel.symbol) if (impl.exists) Apply(ref(impl), This(currentClass) :: args).withSpan(app.span) else app // could have been an abstract method in a trait linked to from a super constructor From 3543467aeed0c215fc1b89416c0d178e3e19e2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Doeraene?= Date: Tue, 27 Aug 2019 13:52:48 +0200 Subject: [PATCH 3/4] Scala.js: Fix references to fields in other compilation units. --- .../tools/backend/sjs/JSDefinitions.scala | 13 ++++++++++++ .../dotty/tools/backend/sjs/JSEncoding.scala | 20 ++++++++++--------- project/Build.scala | 1 + 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/compiler/src/dotty/tools/backend/sjs/JSDefinitions.scala b/compiler/src/dotty/tools/backend/sjs/JSDefinitions.scala index 5f165b82cbf4..14f86389ef3c 100644 --- a/compiler/src/dotty/tools/backend/sjs/JSDefinitions.scala +++ b/compiler/src/dotty/tools/backend/sjs/JSDefinitions.scala @@ -173,6 +173,19 @@ final class JSDefinitions()(implicit ctx: Context) { @threadUnsafe lazy val Reflect_registerInstantiatableClassR = ReflectModule.requiredMethodRef("registerInstantiatableClass") def Reflect_registerInstantiatableClass(implicit ctx: Context) = Reflect_registerInstantiatableClassR.symbol + private[this] var allRefClassesCache: Set[Symbol] = _ + def allRefClasses(implicit ctx: Context): Set[Symbol] = { + if (allRefClassesCache == null) { + val baseNames = List("Object", "Boolean", "Character", "Byte", "Short", + "Int", "Long", "Float", "Double") + val fullNames = baseNames.flatMap { base => + List(s"scala.runtime.${base}Ref", s"scala.runtime.Volatile${base}Ref") + } + allRefClassesCache = fullNames.map(name => ctx.requiredClass(name)).toSet + } + allRefClassesCache + } + /** If `cls` is a class in the scala package, its name, otherwise EmptyTypeName */ private def scalajsClassName(cls: Symbol)(implicit ctx: Context): TypeName = if (cls.isClass && cls.owner == ScalaJSJSPackageClass) cls.asClass.name diff --git a/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala b/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala index 67198cfdf7ea..38d79db76d2c 100644 --- a/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala +++ b/compiler/src/dotty/tools/backend/sjs/JSEncoding.scala @@ -1,13 +1,17 @@ package dotty.tools.backend.sjs +import scala.annotation.tailrec + import scala.collection.mutable import dotty.tools.FatalError import dotty.tools.dotc.core._ +import Decorators._ import Periods._ import SymDenotations._ import Contexts._ +import Flags._ import Types._ import Symbols._ import Denotations._ @@ -103,13 +107,6 @@ object JSEncoding { js.Ident(localNames.localSymbolName(sym), Some(sym.unexpandedName.decoded)) } - private def allRefClasses(implicit ctx: Context): Set[Symbol] = { - //TODO - /*(Set(ObjectRefClass, VolatileObjectRefClass) ++ - refClass.values ++ volatileRefClass.values)*/ - Set() - } - def encodeFieldSym(sym: Symbol)( implicit ctx: Context, pos: ir.Position): js.Ident = { require(sym.owner.isClass && sym.isTerm && !sym.is(Flags.Method) && !sym.is(Flags.Module), @@ -120,14 +117,19 @@ object JSEncoding { if (name0.charAt(name0.length()-1) != ' ') name0 else name0.substring(0, name0.length()-1) + @tailrec + def superClassCount(sym: Symbol, acc: Int): Int = + if (sym == defn.ObjectClass) acc + else superClassCount(sym.asClass.superClass, acc + 1) + /* We have to special-case fields of Ref types (IntRef, ObjectRef, etc.) * because they are emitted as private by our .scala source files, but * they are considered public at use site since their symbols come from * Java-emitted .class files. */ val idSuffix = - if (sym.is(Flags.Private) || allRefClasses.contains(sym.owner)) - sym.owner.asClass.baseClasses.size.toString + if (sym.is(Flags.Private) || jsdefn.allRefClasses.contains(sym.owner)) + superClassCount(sym.owner, 0).toString else "f" diff --git a/project/Build.scala b/project/Build.scala index 9963a3b81ba0..ad77b6ad11af 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -948,6 +948,7 @@ object Build { ( (dir / "shared/src/test/scala/org/scalajs/testsuite/compiler" ** "IntTest.scala").get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "IntegerTest.scala").get + ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "ObjectTest.scala").get ++ (dir / "shared/src/test/require-jdk8/org/scalajs/testsuite/javalib/util" ** "Base64Test.scala").get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/utils" ** "*.scala").get ) From fd81d5c1e4e6e117d4bb13528849ccaca20b8a34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Doeraene?= Date: Tue, 27 Aug 2019 18:03:16 +0200 Subject: [PATCH 4/4] Use an OrFilter for the two tests in javalib/lang/. --- project/Build.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/project/Build.scala b/project/Build.scala index ad77b6ad11af..cc6436a1106d 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -947,8 +947,7 @@ object Build { val dir = fetchScalaJSSource.value / "test-suite" ( (dir / "shared/src/test/scala/org/scalajs/testsuite/compiler" ** "IntTest.scala").get - ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "IntegerTest.scala").get - ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** "ObjectTest.scala").get + ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** (("IntegerTest.scala": FileFilter) || "ObjectTest.scala")).get ++ (dir / "shared/src/test/require-jdk8/org/scalajs/testsuite/javalib/util" ** "Base64Test.scala").get ++ (dir / "shared/src/test/scala/org/scalajs/testsuite/utils" ** "*.scala").get )