Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix #1103: Scala 3 support for Scala.js
Browse files Browse the repository at this point in the history
lolgab committed Feb 28, 2021
1 parent 6cf96e4 commit ebf2ffa
Showing 5 changed files with 59 additions and 31 deletions.
38 changes: 31 additions & 7 deletions scalajslib/src/ScalaJSModule.scala
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@ package mill
package scalajslib

import mill.eval.{PathRef, Result}
import mill.scalalib.api.Util.isScala3
import mill.scalalib.Lib.resolveDependencies
import mill.scalalib.{DepSyntax, Lib, TestModule, TestRunner}
import mill.util.Ctx
@@ -147,12 +148,28 @@ trait ScalaJSModule extends scalalib.ScalaModule { outer =>
).map(PathRef(_))
}

def scalacOptions = super.scalacOptions() ++ {
if(isScala3(scalaVersion())) Seq("-scalajs")
else Seq.empty
}

override def scalacPluginIvyDeps = T{
super.scalacPluginIvyDeps() ++
Seq(ivy"org.scala-js:::scalajs-compiler:${scalaJSVersion()}")
super.scalacPluginIvyDeps() ++ {
if(isScala3(scalaVersion())) {
Seq.empty
} else {
Seq(ivy"org.scala-js:::scalajs-compiler:${scalaJSVersion()}")
}
}
}
override def scalaLibraryIvyDeps = T{
Seq(ivy"org.scala-js::scalajs-library:${scalaJSVersion()}")
if(isScala3(scalaVersion())) {
super.scalaLibraryIvyDeps() ++ Seq(
ivy"org.scala-js:scalajs-library_2.13:${scalaJSVersion()}"
)
} else {
Seq(ivy"org.scala-js::scalajs-library:${scalaJSVersion()}")
}
}

// publish artifact with name "mill_sjs0.6.4_2.12" instead of "mill_sjs0.6_2.12"
@@ -179,10 +196,17 @@ trait TestScalaJSModule extends ScalaJSModule with TestModule {
val bridgeOrInterface =
if (mill.scalalib.api.Util.scalaJSUsesTestBridge(scalaJSVersion())) "bridge"
else "interface"
Loose.Agg(
ivy"org.scala-js::scalajs-library:${scalaJSVersion()}",
ivy"org.scala-js::scalajs-test-$bridgeOrInterface:${scalaJSVersion()}"
)
if(isScala3(scalaVersion())) {
Loose.Agg(
ivy"org.scala-js:scalajs-library_2.13:${scalaJSVersion()}",
ivy"org.scala-js:scalajs-test-bridge_2.13:${scalaJSVersion()}"
)
} else {
Loose.Agg(
ivy"org.scala-js::scalajs-library:${scalaJSVersion()}",
ivy"org.scala-js::scalajs-test-$bridgeOrInterface:${scalaJSVersion()}"
)
}
})
}

Original file line number Diff line number Diff line change
@@ -3,14 +3,14 @@ import utest._
object ArgsParserTests extends TestSuite {

def tests: Tests = Tests {
'one - {
test("one") {
val result = ArgsParser.parse("hello:world")
assert(
result.length == 2,
result == Seq("hello", "world")
)
}
'two - { // we fail this test to check testing in scala.js
test("two") { // we fail this test to check testing in scala.js
val result = ArgsParser.parse("hello:world")
assert(
result.length == 80
Original file line number Diff line number Diff line change
@@ -3,13 +3,13 @@ import utest._
object MainTests extends TestSuite {

def tests: Tests = Tests {
'vmName - {
'containJs - {
test("vmName") {
test("containJs") {
assert(
Main.vmName.contains("js")
)
}
'containScala - {
test("containScala") {
assert(
Main.vmName.contains("Scala")
)
40 changes: 22 additions & 18 deletions scalajslib/test/src/HelloJSWorldTests.scala
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@ import mill._
import mill.define.Discover
import mill.eval.{Evaluator, Result}
import mill.scalalib.{CrossScalaModule, DepSyntax, Lib, PublishModule, TestRunner}
import mill.scalalib.api.Util.isScala3
import mill.scalalib.publish.{Developer, License, PomSettings, VersionControl}
import mill.util.{TestEvaluator, TestUtil}
import utest._
@@ -23,11 +24,12 @@ object HelloJSWorldTests extends TestSuite {
}

object HelloJSWorld extends TestUtil.BaseModule {
val scalaVersions = Seq("2.13.3", "2.12.12", "2.11.12")
val scalaJSVersionsAndUseECMA2015 = Seq(("1.3.1", false), ("1.3.1", true), ("1.0.1", false), ("0.6.33", false))
val scalaVersions = Seq("2.13.3", "3.0.0-RC1", "2.12.12", "2.11.12")
val scalaJSVersionsAndUseECMA2015 = Seq(("1.4.0", false), ("1.3.1", true), ("1.0.1", false), ("0.6.33", false))
val matrix = for {
scala <- scalaVersions
(scalaJS, useECMAScript2015) <- scalaJSVersionsAndUseECMA2015
if !(isScala3(scala) && scalaJS != scalaJSVersionsAndUseECMA2015.head._1)
} yield (scala, scalaJS, useECMAScript2015)

object helloJsWorld extends Cross[BuildModule](matrix:_*)
@@ -88,7 +90,7 @@ object HelloJSWorldTests extends TestSuite {

val outPath = result.classes.path
val outputFiles = os.walk(outPath)
val expectedClassfiles = compileClassfiles(outPath, scalaJSVersion)
val expectedClassfiles = compileClassfiles(outPath, scalaVersion, scalaJSVersion)
assert(
outputFiles.toSet == expectedClassfiles,
evalCount > 0
@@ -145,7 +147,7 @@ object HelloJSWorldTests extends TestSuite {
}
'artifactId_06 - testArtifactId(HelloJSWorld.scalaVersions.head, "0.6.33", "hello-js-world_sjs0.6_2.13")
'artifactId_10 - testArtifactId(HelloJSWorld.scalaVersions.head, "1.0.1", "hello-js-world_sjs1_2.13")
'artifactId_1 - testArtifactId(HelloJSWorld.scalaVersions.head, "1.3.1", "hello-js-world_sjs1_2.13")
'artifactId_1 - testArtifactId(HelloJSWorld.scalaVersions.head, "1.4.0", "hello-js-world_sjs1_2.13")
}

def runTests(testTask: define.NamedTask[(String, Seq[TestRunner.Result])]): Map[String, Map[String, TestRunner.Result]] = {
@@ -200,14 +202,14 @@ object HelloJSWorldTests extends TestSuite {

'test - {
val cached = false
testAllMatrix((scala, scalaJS, _) => checkUtest(scala, scalaJS, cached), skipScala = _.startsWith("2.11."))
testAllMatrix((scala, scalaJS, _) => checkScalaTest(scala, scalaJS, cached))
testAllMatrix((scala, scalaJS, _) => checkUtest(scala, scalaJS, cached), skipScala = v => v.startsWith("2.11.") || isScala3(v))
testAllMatrix((scala, scalaJS, _) => checkScalaTest(scala, scalaJS, cached), skipScala = isScala3)
}

'testCached - {
val cached = false
testAllMatrix((scala, scalaJS, _) => checkUtest(scala, scalaJS, cached), skipScala = _.startsWith("2.11."))
testAllMatrix((scala, scalaJS, _) => checkScalaTest(scala, scalaJS, cached))
testAllMatrix((scala, scalaJS, _) => checkUtest(scala, scalaJS, cached), skipScala = v => v.startsWith("2.11.") || isScala3(v))
testAllMatrix((scala, scalaJS, _) => checkScalaTest(scala, scalaJS, cached), skipScala = isScala3)
}

def checkRun(scalaVersion: String, scalaJSVersion: String, useECMAScript2015: Boolean): Unit = {
@@ -233,26 +235,28 @@ object HelloJSWorldTests extends TestSuite {
}
}

def compileClassfiles(parentDir: os.Path, scalaJSVersion: String) = {
def compileClassfiles(parentDir: os.Path, scalaVersion: String, scalaJSVersion: String) = {
val inAllVersions = Set(
parentDir / "ArgsParser$.class",
parentDir / "ArgsParser$.sjsir",
parentDir / "ArgsParser.class",
parentDir / "Main.class",
parentDir / "Main$.class",
parentDir / "Main$delayedInit$body.class",
parentDir / "Main$.sjsir",
)
val scalaJSVersionSpecific = if(scalaJSVersion.startsWith("1.")) Set(
parentDir / "ArgsParser.sjsir",
parentDir / "Main.sjsir"
) else Set.empty
val scalaVersionSpecific = if(isScala3(scalaVersion)) Set(
parentDir / "ArgsParser.tasty",
parentDir / "Main.tasty"
) else Set(
parentDir / "Main$delayedInit$body.class",
parentDir / "Main$delayedInit$body.sjsir"
)

if (scalaJSVersion.startsWith("1.")) {
inAllVersions ++ Set(
parentDir / "ArgsParser.sjsir",
parentDir / "Main.sjsir"
)
} else {
inAllVersions
}
inAllVersions ++ scalaJSVersionSpecific ++ scalaVersionSpecific
}

def prepareWorkspace(): Unit = {
2 changes: 1 addition & 1 deletion scalalib/src/Lib.scala
Original file line number Diff line number Diff line change
@@ -107,7 +107,7 @@ object Lib{
else if (mill.scalalib.api.Util.isScala3(scalaVersion))
Agg(
// note that dotty-library has a binary version suffix, hence the :: is necessary here
ivy"$scalaOrganization::scala3-library:$scalaVersion".forceVersion()
ivy"$scalaOrganization::scala3-library::$scalaVersion".forceVersion()
)
else
Agg(

0 comments on commit ebf2ffa

Please sign in to comment.