Skip to content

Commit 524c978

Browse files
authored
Merge pull request #7112 from sjrd/enable-more-sjs-tests
Enable more Scala.js tests, fix two issues
2 parents 2bbfd17 + fd81d5c commit 524c978

File tree

4 files changed

+26
-10
lines changed

4 files changed

+26
-10
lines changed

compiler/src/dotty/tools/backend/sjs/JSDefinitions.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,19 @@ final class JSDefinitions()(implicit ctx: Context) {
173173
@threadUnsafe lazy val Reflect_registerInstantiatableClassR = ReflectModule.requiredMethodRef("registerInstantiatableClass")
174174
def Reflect_registerInstantiatableClass(implicit ctx: Context) = Reflect_registerInstantiatableClassR.symbol
175175

176+
private[this] var allRefClassesCache: Set[Symbol] = _
177+
def allRefClasses(implicit ctx: Context): Set[Symbol] = {
178+
if (allRefClassesCache == null) {
179+
val baseNames = List("Object", "Boolean", "Character", "Byte", "Short",
180+
"Int", "Long", "Float", "Double")
181+
val fullNames = baseNames.flatMap { base =>
182+
List(s"scala.runtime.${base}Ref", s"scala.runtime.Volatile${base}Ref")
183+
}
184+
allRefClassesCache = fullNames.map(name => ctx.requiredClass(name)).toSet
185+
}
186+
allRefClassesCache
187+
}
188+
176189
/** If `cls` is a class in the scala package, its name, otherwise EmptyTypeName */
177190
private def scalajsClassName(cls: Symbol)(implicit ctx: Context): TypeName =
178191
if (cls.isClass && cls.owner == ScalaJSJSPackageClass) cls.asClass.name

compiler/src/dotty/tools/backend/sjs/JSEncoding.scala

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package dotty.tools.backend.sjs
22

3+
import scala.annotation.tailrec
4+
35
import scala.collection.mutable
46

57
import dotty.tools.FatalError
68

79
import dotty.tools.dotc.core._
10+
import Decorators._
811
import Periods._
912
import SymDenotations._
1013
import Contexts._
14+
import Flags._
1115
import Types._
1216
import Symbols._
1317
import Denotations._
@@ -103,13 +107,6 @@ object JSEncoding {
103107
js.Ident(localNames.localSymbolName(sym), Some(sym.unexpandedName.decoded))
104108
}
105109

106-
private def allRefClasses(implicit ctx: Context): Set[Symbol] = {
107-
//TODO
108-
/*(Set(ObjectRefClass, VolatileObjectRefClass) ++
109-
refClass.values ++ volatileRefClass.values)*/
110-
Set()
111-
}
112-
113110
def encodeFieldSym(sym: Symbol)(
114111
implicit ctx: Context, pos: ir.Position): js.Ident = {
115112
require(sym.owner.isClass && sym.isTerm && !sym.is(Flags.Method) && !sym.is(Flags.Module),
@@ -120,14 +117,19 @@ object JSEncoding {
120117
if (name0.charAt(name0.length()-1) != ' ') name0
121118
else name0.substring(0, name0.length()-1)
122119

120+
@tailrec
121+
def superClassCount(sym: Symbol, acc: Int): Int =
122+
if (sym == defn.ObjectClass) acc
123+
else superClassCount(sym.asClass.superClass, acc + 1)
124+
123125
/* We have to special-case fields of Ref types (IntRef, ObjectRef, etc.)
124126
* because they are emitted as private by our .scala source files, but
125127
* they are considered public at use site since their symbols come from
126128
* Java-emitted .class files.
127129
*/
128130
val idSuffix =
129-
if (sym.is(Flags.Private) || allRefClasses.contains(sym.owner))
130-
sym.owner.asClass.baseClasses.size.toString
131+
if (sym.is(Flags.Private) || jsdefn.allRefClasses.contains(sym.owner))
132+
superClassCount(sym.owner, 0).toString
131133
else
132134
"f"
133135

compiler/src/dotty/tools/dotc/transform/LinkScala2Impls.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class LinkScala2Impls extends MiniPhase with IdentityDenotTransformer { thisPhas
7575
def currentClass = ctx.owner.enclosingClass.asClass
7676
app match {
7777
case Apply(sel @ Select(Super(_, _), _), args)
78-
if sel.symbol.owner.is(Scala2x) && currentClass.mixins.contains(sel.symbol.owner) =>
78+
if sel.symbol.owner.is(Scala2x) && currentClass.mixins.contains(sel.symbol.owner) && !ctx.settings.scalajs.value =>
7979
val impl = implMethod(sel.symbol)
8080
if (impl.exists) Apply(ref(impl), This(currentClass) :: args).withSpan(app.span)
8181
else app // could have been an abstract method in a trait linked to from a super constructor

project/Build.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@ object Build {
947947
val dir = fetchScalaJSSource.value / "test-suite"
948948
(
949949
(dir / "shared/src/test/scala/org/scalajs/testsuite/compiler" ** "IntTest.scala").get
950+
++ (dir / "shared/src/test/scala/org/scalajs/testsuite/javalib/lang" ** (("IntegerTest.scala": FileFilter) || "ObjectTest.scala")).get
950951
++ (dir / "shared/src/test/require-jdk8/org/scalajs/testsuite/javalib/util" ** "Base64Test.scala").get
951952
++ (dir / "shared/src/test/scala/org/scalajs/testsuite/utils" ** "*.scala").get
952953
)

0 commit comments

Comments
 (0)