Skip to content

Commit 0bbcafc

Browse files
bishaboshalihaoyi
andauthored
build.mill files compiled by Scala 3 (#3369)
This is work in progress to fix #3152 Numerous fixes were also needed to com-lihaoyi/mainargs, com-lihaoyi/sourcecode, and com-lihaoyi/mill-moduledefs With the current state, only 1 example/integration tests is still failing: - `integration.feature[plugin-classpath].local` known TODOs: - [x] Discover macro - [x] Applicative macro - [x] Caller macro - [x] Cross.Factory macro - [x] EnclosingClass macro - [x] Task macros - [x] Cacher macro - [x] Moduledefs compiler plugin (override inferrence) - [x] All core Mill modules compile with Scala 3.5.0 - [x] Fix Zinc reporter patch linenumbers of build scripts - [x] Check that bytecode analyzers work with Scala 3 - [x] cleanup library dependency conflicts - [x] Support new Scala 3 syntax in build.sc files - [x] ~Fix BSP reporter linenumbers for build scripts~ (Zinc reporter forwards to bsp) - [ ] Cleanup compiler warnings for outdated syntax known incompatibilities: - [ ] can't use `ExplicitResultTypes` scalafix rule - need to upgrade mill-scalafix - [x] ~`Cross.scala` uses the new quoted type syntax which scalafmt crashes on, (and version is frozen) so skip the file~ upgraded Scalafmt so not skipped anymore - [ ] skipping Mima currently due to 1000s of errors (perhaps we should generate filters?) - [ ] filtered one flaky test from `example.thirdparty[mockito]` - [ ] filtered out `integration.feature[plugin-classpath]` due to third party plugin dep --------- Co-authored-by: Li Haoyi <[email protected]>
1 parent c05e81b commit 0bbcafc

File tree

115 files changed

+4333
-1627
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

115 files changed

+4333
-1627
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ output/
55
.idea_modules
66
.idea
77
.vscode/
8+
.zed/
89
out/
910
/.bloop/
1011
/.metals/

.scalafix-3.conf

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
rules = [
2+
RemoveUnused,
3+
NoAutoTupling
4+
# ExplicitResultTypes
5+
]

.scalafmt.conf

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ newlines.source = keep
1919

2020
project.git = true
2121

22-
runner.dialect = scala213
22+
runner.dialect = scala3
2323

2424
project {
2525
excludePaths = [
@@ -36,4 +36,4 @@ fileOverride {
3636
docstrings.style = keep
3737
}
3838
"glob:**/example/scalalib/native/**/*.scala" = scala3
39-
}
39+
}

bsp/src/mill/bsp/BspServerResult.scala

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package mill.bsp
22

33
import mill.api.internal
4+
import mill.api.Mirrors
5+
import mill.api.Mirrors.autoMirror
46

57
@internal
68
sealed trait BspServerResult
@@ -28,4 +30,7 @@ object BspServerResult {
2830

2931
implicit val jsonify: upickle.default.ReadWriter[BspServerResult] =
3032
upickle.default.macroRW
33+
34+
private given Root_BspServerResult: Mirrors.Root[BspServerResult] =
35+
Mirrors.autoRoot[BspServerResult]
3136
}

build.mill

+116-46
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ object Deps {
5151
// The Scala version to use
5252
// When updating, run "Publish Bridges" Github Actions for the new version
5353
// and then add to it `bridgeScalaVersions`
54-
val scalaVersion = "2.13.15"
54+
val scalaVersion = "3.6.2"
5555
val scala2Version = "2.13.15"
5656
// The Scala 2.12.x version to use for some workers
5757
val workerScalaVersion212 = "2.12.20"
@@ -65,14 +65,21 @@ object Deps {
6565

6666
object Scalajs_1 {
6767
val scalaJsVersion = "1.18.1"
68-
val scalajsEnvJsdomNodejs = ivy"org.scala-js::scalajs-env-jsdom-nodejs:1.1.0"
69-
val scalajsEnvExoegoJsdomNodejs = ivy"net.exoego::scalajs-env-jsdom-nodejs:2.1.0"
70-
val scalajsEnvNodejs = ivy"org.scala-js::scalajs-env-nodejs:1.4.0"
71-
val scalajsEnvPhantomjs = ivy"org.scala-js::scalajs-env-phantomjs:1.0.0"
72-
val scalajsEnvSelenium = ivy"org.scala-js::scalajs-env-selenium:1.1.1"
73-
val scalajsSbtTestAdapter = ivy"org.scala-js::scalajs-sbt-test-adapter:${scalaJsVersion}"
74-
val scalajsLinker = ivy"org.scala-js::scalajs-linker:${scalaJsVersion}"
75-
val scalajsImportMap = ivy"com.armanbilge::scalajs-importmap:0.1.1"
68+
val scalajsEnvJsdomNodejs =
69+
ivy"org.scala-js::scalajs-env-jsdom-nodejs:1.1.0".withDottyCompat(scalaVersion)
70+
val scalajsEnvExoegoJsdomNodejs =
71+
ivy"net.exoego::scalajs-env-jsdom-nodejs:2.1.0".withDottyCompat(scalaVersion)
72+
val scalajsEnvNodejs = ivy"org.scala-js::scalajs-env-nodejs:1.4.0".withDottyCompat(scalaVersion)
73+
val scalajsEnvPhantomjs =
74+
ivy"org.scala-js::scalajs-env-phantomjs:1.0.0".withDottyCompat(scalaVersion)
75+
val scalajsEnvSelenium =
76+
ivy"org.scala-js::scalajs-env-selenium:1.1.1".withDottyCompat(scalaVersion)
77+
val scalajsSbtTestAdapter =
78+
ivy"org.scala-js::scalajs-sbt-test-adapter:${scalaJsVersion}".withDottyCompat(scalaVersion)
79+
val scalajsLinker =
80+
ivy"org.scala-js::scalajs-linker:${scalaJsVersion}".withDottyCompat(scalaVersion)
81+
val scalajsImportMap =
82+
ivy"com.armanbilge::scalajs-importmap:0.1.1".withDottyCompat(scalaVersion)
7683
}
7784

7885
object Scalanative_0_5 {
@@ -99,9 +106,11 @@ object Deps {
99106
}
100107
object Play_2_7 extends Play {
101108
val playVersion = "2.7.9"
109+
override def scalaVersion: String = Deps.scala2Version
102110
}
103111
object Play_2_8 extends Play {
104112
val playVersion = "2.8.22"
113+
override def scalaVersion: String = Deps.scala2Version
105114
}
106115
object Play_2_9 extends Play {
107116
val playVersion = "2.9.6"
@@ -115,12 +124,13 @@ object Deps {
115124
val acyclic = ivy"com.lihaoyi:::acyclic:0.3.15"
116125
val ammoniteVersion = "3.0.1"
117126
val asmTree = ivy"org.ow2.asm:asm-tree:9.7.1"
118-
val bloopConfig = ivy"ch.epfl.scala::bloop-config:1.5.5"
127+
val bloopConfig = ivy"ch.epfl.scala::bloop-config:1.5.5".withDottyCompat(scalaVersion)
119128

120129
val coursierVersion = "2.1.24"
121-
val coursier = ivy"io.get-coursier::coursier:$coursierVersion"
130+
val coursier = ivy"io.get-coursier::coursier:$coursierVersion".withDottyCompat(scalaVersion)
122131
val coursierInterface = ivy"io.get-coursier:interface:1.0.27"
123-
val coursierJvm = ivy"io.get-coursier::coursier-jvm:$coursierVersion"
132+
val coursierJvm =
133+
ivy"io.get-coursier::coursier-jvm:$coursierVersion".withDottyCompat(scalaVersion)
124134

125135
val cask = ivy"com.lihaoyi::cask:0.9.4"
126136
val castor = ivy"com.lihaoyi::castor:0.3.0"
@@ -151,38 +161,45 @@ object Deps {
151161
val osLib = ivy"com.lihaoyi::os-lib:0.11.4-M5"
152162
val pprint = ivy"com.lihaoyi::pprint:0.9.0"
153163
val mainargs = ivy"com.lihaoyi::mainargs:0.7.6"
154-
val millModuledefsVersion = "0.11.2"
164+
val millModuledefsVersion = "0.11.3-M3"
155165
val millModuledefsString = s"com.lihaoyi::mill-moduledefs:${millModuledefsVersion}"
156166
val millModuledefs = ivy"${millModuledefsString}"
157167
val millModuledefsPlugin =
158168
ivy"com.lihaoyi:::scalac-mill-moduledefs-plugin:${millModuledefsVersion}"
159169
// can't use newer versions, as these need higher Java versions
160170
val testng = ivy"org.testng:testng:7.5.1"
161171
val sbtTestInterface = ivy"org.scala-sbt:test-interface:1.0"
162-
def scalaCompiler(scalaVersion: String) = ivy"org.scala-lang:scala-compiler:${scalaVersion}"
163-
val scalafmtDynamic = ivy"org.scalameta::scalafmt-dynamic:3.8.5"
172+
def scalaCompiler(scalaVersion: String) = {
173+
if (ZincWorkerUtil.isScala3(scalaVersion)) ivy"org.scala-lang:scala3-compiler_3:${scalaVersion}"
174+
else ivy"org.scala-lang:scala-compiler:${scalaVersion}"
175+
}
176+
val scalafmtDynamic = ivy"org.scalameta::scalafmt-dynamic:3.8.5".withDottyCompat(scalaVersion)
164177
def scalap(scalaVersion: String) = ivy"org.scala-lang:scalap:${scalaVersion}"
165-
def scalaReflect(scalaVersion: String) = ivy"org.scala-lang:scala-reflect:${scalaVersion}"
178+
def scalaReflect(scalaVersion: String) =
179+
if (ZincWorkerUtil.isScala3(scalaVersion))
180+
ivy"org.scala-lang:scala-reflect:${Deps.scala2Version}"
181+
else ivy"org.scala-lang:scala-reflect:${scalaVersion}"
166182
val scoverage2Version = "2.2.1"
167183
val scalacScoverage2Plugin = ivy"org.scoverage:::scalac-scoverage-plugin:${scoverage2Version}"
168184
val scalacScoverage2Reporter = ivy"org.scoverage::scalac-scoverage-reporter:${scoverage2Version}"
169185
val scalacScoverage2Domain = ivy"org.scoverage::scalac-scoverage-domain:${scoverage2Version}"
170186
val scalacScoverage2Serializer =
171187
ivy"org.scoverage::scalac-scoverage-serializer:${scoverage2Version}"
172188
val scalaparse = ivy"com.lihaoyi::scalaparse:${fastparse.version}"
173-
val scalatags = ivy"com.lihaoyi::scalatags:0.13.1"
189+
val scalatags = ivy"com.lihaoyi::scalatags:0.13.1".withDottyCompat(scalaVersion)
174190
def scalaXml = ivy"org.scala-lang.modules::scala-xml:2.3.0"
175191
// keep in sync with doc/antora/antory.yml
176192
val semanticDBscala = ivy"org.scalameta:::semanticdb-scalac:4.12.4"
177193
val semanticDbJava = ivy"com.sourcegraph:semanticdb-java:0.10.3"
178-
val sourcecode = ivy"com.lihaoyi::sourcecode:0.4.2"
194+
val sourcecode = ivy"com.lihaoyi::sourcecode:0.4.3-M5"
179195
val upickle = ivy"com.lihaoyi::upickle:3.3.1"
180196
val windowsAnsi = ivy"io.github.alexarchambault.windows-ansi:windows-ansi:0.0.6"
181-
val zinc = ivy"org.scala-sbt::zinc:1.10.7"
197+
val zinc = ivy"org.scala-sbt::zinc:1.10.7".withDottyCompat(scalaVersion)
182198
// keep in sync with doc/antora/antory.yml
183199
val bsp4j = ivy"ch.epfl.scala:bsp4j:2.2.0-M2"
184200
val fansi = ivy"com.lihaoyi::fansi:0.5.0"
185-
val jarjarabrams = ivy"com.eed3si9n.jarjarabrams::jarjar-abrams-core:1.14.0"
201+
val jarjarabrams =
202+
ivy"com.eed3si9n.jarjarabrams::jarjar-abrams-core:1.14.0".withDottyCompat(scalaVersion)
186203
val requests = ivy"com.lihaoyi::requests:0.9.0"
187204
val logback = ivy"ch.qos.logback:logback-classic:1.5.16"
188205
val sonatypeCentralClient = ivy"com.lumidion::sonatype-central-client-requests:0.3.0"
@@ -302,7 +319,7 @@ def millBinPlatform: T[String] = Task {
302319
def baseDir = build.millSourcePath
303320

304321
val essentialBridgeScalaVersions =
305-
Seq(Deps.scalaVersion, Deps.workerScalaVersion212)
322+
Seq(Deps.scalaVersion, Deps.scala2Version, Deps.workerScalaVersion212)
306323
// published compiler bridges
307324
val bridgeScalaVersions = Seq(
308325
// Our version of Zinc doesn't work with Scala 2.12.0 and 2.12.4 compiler
@@ -448,30 +465,60 @@ trait MillPublishJavaModule extends MillJavaModule with PublishModule {
448465
*/
449466
trait MillScalaModule extends ScalaModule with MillJavaModule with ScalafixModule { outer =>
450467
def scalaVersion = Deps.scalaVersion
451-
def scalafixScalaBinaryVersion = ZincWorkerUtil.scalaBinaryVersion(scalaVersion())
468+
def scalapVersion: T[String] = Deps.scala2Version
469+
def scalafixScalaBinaryVersion = T {
470+
def sv = scalaVersion()
471+
if (ZincWorkerUtil.isScala3(sv)) "2.13"
472+
else ZincWorkerUtil.scalaBinaryVersion(sv)
473+
}
474+
475+
def scalafixConfig = T {
476+
if (ZincWorkerUtil.isScala3(scalaVersion())) Some(T.workspace / ".scalafix-3.conf") else None
477+
}
452478
def semanticDbVersion = Deps.semanticDBscala.version
453479
def scalacOptions =
454480
super.scalacOptions() ++ Seq(
455481
"-deprecation",
456-
"-P:acyclic:force",
457-
"-feature",
458-
"-Xlint:unused",
459-
"-Xlint:adapted-args",
460-
"-Xsource:3",
461-
"-Wconf:msg=inferred type changes:silent",
462-
"-Wconf:msg=case companions no longer extend FunctionN:silent",
463-
"-Wconf:msg=access modifiers for:silent",
464-
"-Wconf:msg=found in a package prefix of the required type:silent"
482+
"-feature"
483+
) ++ (
484+
if (ZincWorkerUtil.isScala3(scalaVersion())) Seq(
485+
// "-Werror",
486+
"-Wunused:all"
487+
// "-no-indent",
488+
// "-Wvalue-discard",
489+
// "-Wshadow:all",
490+
// "-Wsafe-init",
491+
// "-Wnonunit-statement",
492+
// "-Wimplausible-patterns",
493+
)
494+
else Seq(
495+
"-P:acyclic:force",
496+
"-Xlint:unused",
497+
"-Xlint:adapted-args",
498+
"-Xsource:3",
499+
"-Wconf:msg=inferred type changes:silent",
500+
"-Wconf:msg=case companions no longer extend FunctionN:silent",
501+
"-Wconf:msg=access modifiers for:silent",
502+
"-Wconf:msg=found in a package prefix of the required type:silent"
503+
)
465504
)
466505

467-
def scalacPluginIvyDeps =
506+
def scalacPluginIvyDeps = T {
507+
val sv = scalaVersion()
508+
val binaryVersion = ZincWorkerUtil.scalaBinaryVersion(sv)
509+
val hasModuleDefs = binaryVersion == "2.13" || binaryVersion == "3"
468510
super.scalacPluginIvyDeps() ++
469-
Agg(Deps.acyclic) ++
470-
Agg.when(scalaVersion().startsWith("2.13."))(Deps.millModuledefsPlugin)
511+
Agg.when(binaryVersion != "3")(Deps.acyclic) ++
512+
Agg.when(hasModuleDefs)(Deps.millModuledefsPlugin)
513+
}
471514

472-
def mandatoryIvyDeps =
515+
def mandatoryIvyDeps = T {
516+
val sv = scalaVersion()
517+
val binaryVersion = ZincWorkerUtil.scalaBinaryVersion(sv)
518+
val hasModuleDefs = binaryVersion == "2.13" || binaryVersion == "3"
473519
super.mandatoryIvyDeps() ++
474-
Agg.when(scalaVersion().startsWith("2.13."))(Deps.millModuledefs)
520+
Agg.when(hasModuleDefs)(Deps.millModuledefs)
521+
}
475522

476523
/** Default tests module. */
477524
lazy val test: MillScalaTests = new MillScalaTests {}
@@ -487,7 +534,8 @@ trait MillScalaModule extends ScalaModule with MillJavaModule with ScalafixModul
487534
trait MillBaseTestsModule extends TestModule {
488535
def forkArgs = Task {
489536
Seq(
490-
s"-DMILL_SCALA_2_13_VERSION=${Deps.scalaVersion}",
537+
s"-DMILL_SCALA_3_NEXT_VERSION=${Deps.scalaVersion}",
538+
s"-DMILL_SCALA_2_13_VERSION=${Deps.scala2Version}",
491539
s"-DMILL_SCALA_2_12_VERSION=${Deps.workerScalaVersion212}",
492540
s"-DTEST_SCALA_2_13_VERSION=${Deps.testScala213Version}",
493541
s"-DTEST_SCALA_2_13_VERSION_FOR_SCALANATIVE_4_2=${Deps.testScala213VersionForScalaNative42}",
@@ -506,6 +554,7 @@ trait MillBaseTestsModule extends TestModule {
506554
}
507555

508556
def testFramework = "mill.UTestFramework"
557+
def testForkGrouping = discoveredTestClasses().grouped(1).toSeq
509558
}
510559

511560
/** Published module which does not contain strictly handled API. */
@@ -618,15 +667,31 @@ trait MillStableScalaModule extends MillPublishScalaModule with Mima {
618667
Agg.from(
619668
Settings.mimaBaseVersions
620669
.filter(v => !skipPreviousVersions().contains(v))
621-
.map(version =>
622-
ivy"${pomSettings().organization}:${artifactId()}:${version}"
623-
)
670+
.map({ version =>
671+
val patchedSuffix = {
672+
val base = artifactSuffix()
673+
version match {
674+
case s"0.$minor.$_" if minor.toIntOption.exists(_ < 12) =>
675+
base match {
676+
case "_3" => "_2.13"
677+
case s"_3_$suffix" => s"_2.13_$suffix"
678+
case _ => base
679+
}
680+
case _ => base
681+
}
682+
}
683+
val patchedId = artifactName() + patchedSuffix
684+
ivy"${pomSettings().organization}:${patchedId}:${version}"
685+
})
624686
)
625687
}
626688

627689
def mimaExcludeAnnotations = Seq("mill.api.internal", "mill.api.experimental")
628-
def mimaCheckDirection = CheckDirection.Backward
629-
def skipPreviousVersions: T[Seq[String]] = T(Seq.empty[String])
690+
// def mimaCheckDirection = CheckDirection.Backward
691+
def skipPreviousVersions: T[Seq[String]] = T {
692+
T.log.info("Skipping mima for previous versions (!!1000s of errors due to Scala 3)")
693+
mimaPreviousVersions() // T(Seq.empty[String])
694+
}
630695
}
631696

632697
object bridge extends Cross[BridgeModule](compilerBridgeScalaVersions)
@@ -638,8 +703,11 @@ trait BridgeModule extends MillPublishJavaModule with CrossScalaModule {
638703
def crossFullScalaVersion = true
639704
def ivyDeps = Agg(
640705
ivy"org.scala-sbt:compiler-interface:${Deps.zinc.version}",
641-
ivy"org.scala-sbt:util-interface:${Deps.zinc.version}",
642-
ivy"org.scala-lang:scala-compiler:${crossScalaVersion}"
706+
ivy"org.scala-sbt:util-interface:${Deps.zinc.version}"
707+
) ++ Agg(
708+
if (ZincWorkerUtil.isScala3(crossScalaVersion))
709+
ivy"org.scala-lang::scala3-compiler:${crossScalaVersion}"
710+
else ivy"org.scala-lang:scala-compiler:${crossScalaVersion}"
643711
)
644712

645713
def resources = Task {
@@ -648,7 +716,9 @@ trait BridgeModule extends MillPublishJavaModule with CrossScalaModule {
648716
}
649717

650718
def compilerBridgeIvyDeps: T[Agg[Dep]] = Agg(
651-
ivy"org.scala-sbt::compiler-bridge:${Deps.zinc.version}".exclude("*" -> "*")
719+
(if (ZincWorkerUtil.isScala3(crossScalaVersion))
720+
ivy"org.scala-lang:scala3-sbt-bridge:${crossScalaVersion}"
721+
else ivy"org.scala-sbt::compiler-bridge:${Deps.zinc.version}").exclude("*" -> "*")
652722
)
653723

654724
def compilerBridgeSourceJars: T[Agg[PathRef]] = Task {
@@ -723,6 +793,6 @@ implicit object DepSegment extends Cross.ToSegments[Dep]({ dep =>
723793
*/
724794
object dummy extends Cross[DependencyFetchDummy](dummyDeps)
725795
trait DependencyFetchDummy extends ScalaModule with Cross.Module[Dep] {
726-
def scalaVersion = Deps.scalaVersion
796+
def scalaVersion = Deps.scala2Version
727797
def compileIvyDeps = Agg(crossValue)
728798
}

0 commit comments

Comments
 (0)