Skip to content

Commit 5e533a8

Browse files
authored
Upgrade to Scala.js 1.13.0. (#20273)
We are several versions behind. Here is a first step. The commit messages mention the upstream commits that were forward ported. Tests come for free in the "Upgrade to Scala.js 1.13.0." commit.
2 parents 79500f7 + 06c7f1a commit 5e533a8

File tree

8 files changed

+377
-363
lines changed

8 files changed

+377
-363
lines changed

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

Lines changed: 116 additions & 125 deletions
Large diffs are not rendered by default.

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

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.scalajs.ir.Names.DefaultModuleID
2727
import org.scalajs.ir.OriginalName.NoOriginalName
2828
import org.scalajs.ir.Position.NoPosition
2929
import org.scalajs.ir.Trees.OptimizerHints
30+
import org.scalajs.ir.Version.Unversioned
3031

3132
import dotty.tools.dotc.transform.sjs.JSExportUtils.*
3233
import dotty.tools.dotc.transform.sjs.JSSymUtils.*
@@ -185,18 +186,21 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
185186
}).toList
186187
}
187188

188-
def genStaticExports(classSym: Symbol): List[js.MemberDef] = {
189+
def genStaticExports(classSym: Symbol): (List[js.JSFieldDef], List[js.JSMethodPropDef]) = {
189190
val exports = for {
190191
sym <- classSym.info.decls.toList
191192
info <- staticExportsOf(sym)
192193
} yield {
193194
(info, sym)
194195
}
195196

196-
(for {
197+
val fields = List.newBuilder[js.JSFieldDef]
198+
val methodProps = List.newBuilder[js.JSMethodPropDef]
199+
200+
for {
197201
(info, tups) <- exports.groupBy(_._1)
198202
kind <- checkSameKind(tups)
199-
} yield {
203+
} {
200204
def alts = tups.map(_._2)
201205

202206
implicit val pos = info.pos
@@ -205,10 +209,12 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
205209

206210
kind match {
207211
case Method =>
208-
genMemberExportOrDispatcher(JSName.Literal(info.jsName), isProp = false, alts, static = true)
212+
methodProps +=
213+
genMemberExportOrDispatcher(JSName.Literal(info.jsName), isProp = false, alts, static = true)
209214

210215
case Property =>
211-
genMemberExportOrDispatcher(JSName.Literal(info.jsName), isProp = true, alts, static = true)
216+
methodProps +=
217+
genMemberExportOrDispatcher(JSName.Literal(info.jsName), isProp = true, alts, static = true)
212218

213219
case Field =>
214220
val sym = checkSingleField(tups)
@@ -219,19 +225,21 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
219225
.withMutable(true)
220226
val name = js.StringLiteral(info.jsName)
221227
val irTpe = genExposedFieldIRType(sym)
222-
js.JSFieldDef(flags, name, irTpe)
228+
fields += js.JSFieldDef(flags, name, irTpe)
223229

224230
case kind =>
225231
throw new AssertionError(s"unexpected static export kind: $kind")
226232
}
227-
}).toList
233+
}
234+
235+
(fields.result(), methodProps.result())
228236
}
229237

230238
/** Generates exported methods and properties for a class.
231239
*
232240
* @param classSym symbol of the class we export for
233241
*/
234-
def genMemberExports(classSym: ClassSymbol): List[js.MemberDef] = {
242+
def genMemberExports(classSym: ClassSymbol): List[js.JSMethodPropDef] = {
235243
val classInfo = classSym.info
236244
val allExports = classInfo.memberDenots(takeAllFilter, { (name, buf) =>
237245
if (isExportName(name))
@@ -251,7 +259,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
251259
newlyDeclaredExportNames.map(genMemberExport(classSym, _))
252260
}
253261

254-
private def genMemberExport(classSym: ClassSymbol, name: TermName): js.MemberDef = {
262+
private def genMemberExport(classSym: ClassSymbol, name: TermName): js.JSMethodPropDef = {
255263
/* This used to be `.member(name)`, but it caused #3538, since we were
256264
* sometimes selecting mixin forwarders, whose type history does not go
257265
* far enough back in time to see varargs. We now explicitly exclude
@@ -284,11 +292,11 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
284292
genMemberExportOrDispatcher(JSName.Literal(jsName), isProp, alts.map(_.symbol), static = false)
285293
}
286294

287-
def genJSClassDispatchers(classSym: Symbol, dispatchMethodsNames: List[JSName]): List[js.MemberDef] = {
295+
def genJSClassDispatchers(classSym: Symbol, dispatchMethodsNames: List[JSName]): List[js.JSMethodPropDef] = {
288296
dispatchMethodsNames.map(genJSClassDispatcher(classSym, _))
289297
}
290298

291-
private def genJSClassDispatcher(classSym: Symbol, name: JSName): js.MemberDef = {
299+
private def genJSClassDispatcher(classSym: Symbol, name: JSName): js.JSMethodPropDef = {
292300
val alts = classSym.info.membersBasedOnFlags(required = Method, excluded = Bridge)
293301
.map(_.symbol)
294302
.filter { sym =>
@@ -311,14 +319,14 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
311319
em"Conflicting properties and methods for ${classSym.fullName}::$name.",
312320
firstAlt.srcPos)
313321
implicit val pos = firstAlt.span
314-
js.JSPropertyDef(js.MemberFlags.empty, genExpr(name)(firstAlt.sourcePos), None, None)
322+
js.JSPropertyDef(js.MemberFlags.empty, genExpr(name)(firstAlt.sourcePos), None, None)(Unversioned)
315323
} else {
316324
genMemberExportOrDispatcher(name, isProp, alts, static = false)
317325
}
318326
}
319327

320328
private def genMemberExportOrDispatcher(jsName: JSName, isProp: Boolean,
321-
alts: List[Symbol], static: Boolean): js.MemberDef = {
329+
alts: List[Symbol], static: Boolean): js.JSMethodPropDef = {
322330
withNewLocalNameScope {
323331
if (isProp)
324332
genExportProperty(alts, jsName, static)
@@ -362,7 +370,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
362370
}
363371
}
364372

365-
js.JSPropertyDef(flags, genExpr(jsName)(alts.head.sourcePos), getterBody, setterArgAndBody)
373+
js.JSPropertyDef(flags, genExpr(jsName)(alts.head.sourcePos), getterBody, setterArgAndBody)(Unversioned)
366374
}
367375

368376
private def genExportMethod(alts0: List[Symbol], jsName: JSName, static: Boolean)(using Context): js.JSMethodDef = {
@@ -389,7 +397,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
389397
genOverloadDispatch(jsName, overloads, jstpe.AnyType)
390398

391399
js.JSMethodDef(flags, genExpr(jsName), formalArgs, restParam, body)(
392-
OptimizerHints.empty, None)
400+
OptimizerHints.empty, Unversioned)
393401
}
394402

395403
def genOverloadDispatch(jsName: JSName, alts: List[Exported], tpe: jstpe.Type)(

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import NameKinds.*
1818
import NameOps.*
1919
import ast.Trees.*
2020

21+
import dotty.tools.dotc.transform.sjs.JSSymUtils.isJSType
22+
2123
object Mixin {
2224
val name: String = "mixin"
2325
val description: String = "expand trait fields and trait initializers"
@@ -273,7 +275,15 @@ class Mixin extends MiniPhase with SymTransformer { thisPhase =>
273275
else if (getter.is(Lazy, butNot = Module))
274276
transformFollowing(superRef(getter).appliedToNone)
275277
else if (getter.is(Module))
276-
New(getter.info.resultType, List(This(cls)))
278+
if ctx.settings.scalajs.value && getter.moduleClass.isJSType then
279+
if getter.is(Scala2x) then
280+
report.error(
281+
em"""Implementation restriction: cannot extend the Scala 2 trait $mixin
282+
|containing the object $getter that extends js.Any""",
283+
cls.srcPos)
284+
transformFollowing(superRef(getter).appliedToNone)
285+
else
286+
New(getter.info.resultType, List(This(cls)))
277287
else
278288
Underscore(getter.info.resultType)
279289
// transformFollowing call is needed to make memoize & lazy vals run

0 commit comments

Comments
 (0)