Skip to content

Commit 1f7f334

Browse files
authored
Shade scalajs.ir under dotty.tools (#21765)
Because `scala3-compiler` contains a copy of `scalajs-ir`, they conflict with each other when being in the same classpath. This was found when trying to migrate the `sbt-scalajs` to sbt 2, because `sbt-scalajs` depends on `scalajs-ir` and on `sbt`, which depends on `scala3-compiler`. The related issue is sbt/sbt#7709. The solution is to shade the compiler version of `scalajs-ir` under its own package: `dotty.tool.sjs.ir`. The compiler uses the `scalajs-ir` internally but it does not need to expose it.
2 parents 9db68e9 + 731f61e commit 1f7f334

File tree

13 files changed

+73
-52
lines changed

13 files changed

+73
-52
lines changed

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ import dotty.tools.dotc.transform.{Erasure, ValueClasses}
2525
import dotty.tools.dotc.util.SourcePosition
2626
import dotty.tools.dotc.report
2727

28-
import org.scalajs.ir
29-
import org.scalajs.ir.{ClassKind, Position, Names => jsNames, Trees => js, Types => jstpe}
30-
import org.scalajs.ir.Names.{ClassName, MethodName, SimpleMethodName}
31-
import org.scalajs.ir.OriginalName
32-
import org.scalajs.ir.OriginalName.NoOriginalName
33-
import org.scalajs.ir.Trees.OptimizerHints
34-
import org.scalajs.ir.Version.Unversioned
28+
import dotty.tools.sjs.ir
29+
import dotty.tools.sjs.ir.{ClassKind, Position, Names => jsNames, Trees => js, Types => jstpe}
30+
import dotty.tools.sjs.ir.Names.{ClassName, MethodName, SimpleMethodName}
31+
import dotty.tools.sjs.ir.OriginalName
32+
import dotty.tools.sjs.ir.OriginalName.NoOriginalName
33+
import dotty.tools.sjs.ir.Trees.OptimizerHints
34+
import dotty.tools.sjs.ir.Version.Unversioned
3535

3636
import dotty.tools.dotc.transform.sjs.JSSymUtils.*
3737

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import StdNames.*
1515

1616
import dotty.tools.dotc.transform.sjs.JSSymUtils.*
1717

18-
import org.scalajs.ir
19-
import org.scalajs.ir.{Trees => js, Types => jstpe}
20-
import org.scalajs.ir.Names.{LocalName, LabelName, SimpleFieldName, FieldName, SimpleMethodName, MethodName, ClassName}
21-
import org.scalajs.ir.OriginalName
22-
import org.scalajs.ir.OriginalName.NoOriginalName
23-
import org.scalajs.ir.UTF8String
18+
import dotty.tools.sjs.ir
19+
import dotty.tools.sjs.ir.{Trees => js, Types => jstpe}
20+
import dotty.tools.sjs.ir.Names.{LocalName, LabelName, SimpleFieldName, FieldName, SimpleMethodName, MethodName, ClassName}
21+
import dotty.tools.sjs.ir.OriginalName
22+
import dotty.tools.sjs.ir.OriginalName.NoOriginalName
23+
import dotty.tools.sjs.ir.UTF8String
2424

2525
import dotty.tools.backend.jvm.DottyBackendInterface.symExtensions
2626

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ import TypeErasure.ErasedValueType
2222
import dotty.tools.dotc.util.{SourcePosition, SrcPos}
2323
import dotty.tools.dotc.report
2424

25-
import org.scalajs.ir.{Position, Names => jsNames, Trees => js, Types => jstpe}
26-
import org.scalajs.ir.Names.DefaultModuleID
27-
import org.scalajs.ir.OriginalName.NoOriginalName
28-
import org.scalajs.ir.Position.NoPosition
29-
import org.scalajs.ir.Trees.OptimizerHints
30-
import org.scalajs.ir.Version.Unversioned
25+
import dotty.tools.sjs.ir.{Position, Names => jsNames, Trees => js, Types => jstpe}
26+
import dotty.tools.sjs.ir.Names.DefaultModuleID
27+
import dotty.tools.sjs.ir.OriginalName.NoOriginalName
28+
import dotty.tools.sjs.ir.Position.NoPosition
29+
import dotty.tools.sjs.ir.Trees.OptimizerHints
30+
import dotty.tools.sjs.ir.Version.Unversioned
3131

3232
import dotty.tools.dotc.transform.sjs.JSExportUtils.*
3333
import dotty.tools.dotc.transform.sjs.JSSymUtils.*
@@ -932,7 +932,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
932932
InstanceOfTypeTest(tpe.tycon.typeSymbol.typeRef)
933933

934934
case _ =>
935-
import org.scalajs.ir.Names
935+
import dotty.tools.sjs.ir.Names
936936

937937
(toIRType(tpe): @unchecked) match {
938938
case jstpe.AnyType => NoTypeTest

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import dotty.tools.dotc.report
1313
import dotty.tools.dotc.util.{SourceFile, SourcePosition}
1414
import dotty.tools.dotc.util.Spans.Span
1515

16-
import org.scalajs.ir
16+
import dotty.tools.sjs.ir
1717

1818
/** Conversion utilities from dotty Positions to IR Positions. */
1919
class JSPositions()(using Context) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class CheckReentrant extends MiniPhase {
4343
requiredClass("scala.annotation.internal.unshared"))
4444

4545
private val scalaJSIRPackageClass = new CtxLazy(
46-
getPackageClassIfDefined("org.scalajs.ir"))
46+
getPackageClassIfDefined("dotty.tools.sjs.ir"))
4747

4848
def isIgnored(sym: Symbol)(using Context): Boolean =
4949
sym.hasAnnotation(sharableAnnot()) ||

compiler/src/dotty/tools/dotc/transform/sjs/JSSymUtils.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import Types.*
1717

1818
import dotty.tools.backend.sjs.JSDefinitions.jsdefn
1919

20-
import org.scalajs.ir.{Trees => js}
20+
import dotty.tools.sjs.ir.{Trees => js}
2121

2222
/** Additional extensions for `Symbol`s that are only relevant for Scala.js. */
2323
object JSSymUtils {

compiler/src/dotty/tools/dotc/transform/sjs/PrepJSExports.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import dotty.tools.backend.sjs.JSDefinitions.jsdefn
2121
import JSExportUtils.*
2222
import JSSymUtils.*
2323

24-
import org.scalajs.ir.Names.DefaultModuleID
25-
import org.scalajs.ir.Trees.TopLevelExportDef.isValidTopLevelExportName
24+
import dotty.tools.sjs.ir.Names.DefaultModuleID
25+
import dotty.tools.sjs.ir.Trees.TopLevelExportDef.isValidTopLevelExportName
2626

2727
object PrepJSExports {
2828
import tpd.*

compiler/src/dotty/tools/dotc/transform/sjs/PrepJSInterop.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import Types.*
2323

2424
import JSSymUtils.*
2525

26-
import org.scalajs.ir.Trees.JSGlobalRef
26+
import dotty.tools.sjs.ir.Trees.JSGlobalRef
2727

2828
import dotty.tools.backend.sjs.JSDefinitions.jsdefn
2929

project/Build.scala

+28-7
Original file line numberDiff line numberDiff line change
@@ -616,18 +616,36 @@ object Build {
616616
def findArtifactPath(classpath: Def.Classpath, name: String): String =
617617
findArtifact(classpath, name).getAbsolutePath
618618

619+
/** Replace package names in package definitions, for shading.
620+
* It assumes the full package def is written on a single line.
621+
* It does not adapt the imports accordingly.
622+
*/
623+
def replacePackage(lines: List[String])(replace: PartialFunction[String, String]): List[String] = {
624+
def recur(lines: List[String]): List[String] =
625+
lines match {
626+
case head :: tail =>
627+
if (head.startsWith("package ")) {
628+
val packageName = head.stripPrefix("package ").trim
629+
val newPackageName = replace.applyOrElse(packageName, (_: String) => packageName)
630+
s"package $newPackageName" :: tail
631+
} else head :: recur(tail)
632+
case _ => lines
633+
}
634+
recur(lines)
635+
}
636+
619637
/** Insert UnsafeNulls Import after package */
620-
def insertUnsafeNullsImport(lines: Seq[String]): Seq[String] = {
621-
def recur(ls: Seq[String], foundPackage: Boolean): Seq[String] = ls match {
622-
case Seq(l, rest @ _*) =>
638+
def insertUnsafeNullsImport(lines: List[String]): List[String] = {
639+
def recur(ls: List[String], foundPackage: Boolean): List[String] = ls match {
640+
case l :: rest =>
623641
val lt = l.trim()
624642
if (foundPackage) {
625643
if (!(lt.isEmpty || lt.startsWith("package ")))
626-
"import scala.language.unsafeNulls" +: ls
627-
else l +: recur(rest, foundPackage)
644+
"import scala.language.unsafeNulls" :: ls
645+
else l :: recur(rest, foundPackage)
628646
} else {
629647
if (lt.startsWith("package ")) l +: recur(rest, true)
630-
else l +: recur(rest, foundPackage)
648+
else l :: recur(rest, foundPackage)
631649
}
632650
case _ => ls
633651
}
@@ -928,7 +946,10 @@ object Build {
928946
val sjsSources = (trgDir ** "*.scala").get.toSet
929947
sjsSources.foreach(f => {
930948
val lines = IO.readLines(f)
931-
IO.writeLines(f, insertUnsafeNullsImport(lines))
949+
val linesWithPackage = replacePackage(lines) {
950+
case "org.scalajs.ir" => "dotty.tools.sjs.ir"
951+
}
952+
IO.writeLines(f, insertUnsafeNullsImport(linesWithPackage))
932953
})
933954
sjsSources
934955
} (Set(scalaJSIRSourcesJar)).toSeq

tests/pos-with-compiler-cc/backend/sjs/JSCodeGen.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ import dotty.tools.dotc.transform.SymUtils._
2525
import dotty.tools.dotc.util.SourcePosition
2626
import dotty.tools.dotc.report
2727

28-
import org.scalajs.ir
29-
import org.scalajs.ir.{ClassKind, Position, Names => jsNames, Trees => js, Types => jstpe}
30-
import org.scalajs.ir.Names.{ClassName, MethodName, SimpleMethodName}
31-
import org.scalajs.ir.OriginalName
32-
import org.scalajs.ir.OriginalName.NoOriginalName
33-
import org.scalajs.ir.Trees.OptimizerHints
28+
import dotty.tools.sjs.ir
29+
import dotty.tools.sjs.ir.{ClassKind, Position, Names => jsNames, Trees => js, Types => jstpe}
30+
import dotty.tools.sjs.ir.Names.{ClassName, MethodName, SimpleMethodName}
31+
import dotty.tools.sjs.ir.OriginalName
32+
import dotty.tools.sjs.ir.OriginalName.NoOriginalName
33+
import dotty.tools.sjs.ir.Trees.OptimizerHints
3434

3535
import dotty.tools.dotc.transform.sjs.JSSymUtils._
3636

tests/pos-with-compiler-cc/backend/sjs/JSEncoding.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ import StdNames._
1515

1616
import dotty.tools.dotc.transform.sjs.JSSymUtils._
1717

18-
import org.scalajs.ir
19-
import org.scalajs.ir.{Trees => js, Types => jstpe}
20-
import org.scalajs.ir.Names.{LocalName, LabelName, FieldName, SimpleMethodName, MethodName, ClassName}
21-
import org.scalajs.ir.OriginalName
22-
import org.scalajs.ir.OriginalName.NoOriginalName
23-
import org.scalajs.ir.UTF8String
18+
import dotty.tools.sjs.ir
19+
import dotty.tools.sjs.ir.{Trees => js, Types => jstpe}
20+
import dotty.tools.sjs.ir.Names.{LocalName, LabelName, FieldName, SimpleMethodName, MethodName, ClassName}
21+
import dotty.tools.sjs.ir.OriginalName
22+
import dotty.tools.sjs.ir.OriginalName.NoOriginalName
23+
import dotty.tools.sjs.ir.UTF8String
2424

2525
import dotty.tools.backend.jvm.DottyBackendInterface.symExtensions
2626

tests/pos-with-compiler-cc/backend/sjs/JSExportsGen.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import TypeErasure.ErasedValueType
2222
import dotty.tools.dotc.util.{SourcePosition, SrcPos}
2323
import dotty.tools.dotc.report
2424

25-
import org.scalajs.ir.{Position, Names => jsNames, Trees => js, Types => jstpe}
26-
import org.scalajs.ir.Names.DefaultModuleID
27-
import org.scalajs.ir.OriginalName.NoOriginalName
28-
import org.scalajs.ir.Position.NoPosition
29-
import org.scalajs.ir.Trees.OptimizerHints
25+
import dotty.tools.sjs.ir.{Position, Names => jsNames, Trees => js, Types => jstpe}
26+
import dotty.tools.sjs.ir.Names.DefaultModuleID
27+
import dotty.tools.sjs.ir.OriginalName.NoOriginalName
28+
import dotty.tools.sjs.ir.Position.NoPosition
29+
import dotty.tools.sjs.ir.Trees.OptimizerHints
3030

3131
import dotty.tools.dotc.transform.sjs.JSExportUtils._
3232
import dotty.tools.dotc.transform.sjs.JSSymUtils._
@@ -924,7 +924,7 @@ final class JSExportsGen(jsCodeGen: JSCodeGen)(using Context) {
924924
InstanceOfTypeTest(tpe.tycon.typeSymbol.typeRef)
925925

926926
case _ =>
927-
import org.scalajs.ir.Names
927+
import dotty.tools.sjs.ir.Names
928928

929929
(toIRType(tpe): @unchecked) match {
930930
case jstpe.AnyType => NoTypeTest

tests/pos-with-compiler-cc/backend/sjs/JSPositions.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import dotty.tools.dotc.report
1313
import dotty.tools.dotc.util.{SourceFile, SourcePosition}
1414
import dotty.tools.dotc.util.Spans.Span
1515

16-
import org.scalajs.ir
16+
import dotty.tools.sjs.ir
1717

1818
/** Conversion utilities from dotty Positions to IR Positions. */
1919
class JSPositions()(using Context) {

0 commit comments

Comments
 (0)