Skip to content

Commit 9a8f7de

Browse files
authored
Inline scala compiler worker classloader in mill daemon (#5087)
Discussed in #4872 Rather than going through this whole repeated resolve-dependencies-populate-classloader thing, we just directly depend on and instantiate the `MillParserImpl` in the main `runner.daemon` code and pass it down through all the layers of classloaders via a shared `DynamicVariable`. `runner.compilerworker.api` was simplified and merged into `core.api` so the basic `MillScalaParser` types can be shared across all parts of Mill Apart from simplifying the code considerably, this should reduce the number of duplicate classloaders we have, which should also help with #4522
1 parent 41b1904 commit 9a8f7de

File tree

20 files changed

+139
-385
lines changed

20 files changed

+139
-385
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package mill.api.internal
2+
3+
import scala.util.DynamicVariable
4+
5+
trait MillScalaParser {
6+
def splitScript(rawCode: String, fileName: String): Either[String, (Seq[String], Seq[String])]
7+
8+
/* not sure if this is the right way, in case needs change, or if we should accept some
9+
* "generic" visitor over some "generic" trees?
10+
*/
11+
def parseObjectData(rawCode: String): Seq[MillScalaParser.ObjectData]
12+
}
13+
14+
object MillScalaParser {
15+
trait ObjectData {
16+
def obj: Snip
17+
18+
def name: Snip
19+
20+
def parent: Snip
21+
22+
def endMarker: Option[Snip]
23+
24+
def finalStat: Option[(String, Snip)]
25+
}
26+
27+
trait Snip {
28+
def text: String | Null
29+
30+
def start: Int
31+
32+
def end: Int
33+
34+
final def applyTo(s: String, replacement: String): String =
35+
s.patch(start, replacement.padTo(end - start, ' '), end - start)
36+
}
37+
38+
val current = new DynamicVariable[MillScalaParser](null)
39+
}

core/define/src/mill/define/RootModule0.scala

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,15 @@ abstract class RootModule0()(implicit
2929
@internal
3030
object RootModule0 {
3131
class Info(
32-
val compilerWorkerClasspath: Seq[os.Path],
3332
val projectRoot: os.Path,
3433
val output: os.Path,
3534
val topLevelProjectRoot: os.Path
3635
) {
3736
def this(
38-
compilerWorkerClasspath0: Seq[String],
3937
projectRoot0: String,
4038
output0: String,
4139
topLevelProjectRoot0: String
4240
) = this(
43-
compilerWorkerClasspath0.map(os.Path(_)),
4441
os.Path(projectRoot0),
4542
os.Path(output0),
4643
os.Path(topLevelProjectRoot0)

integration/feature/leak-hygiene/src/LeakHygieneTests.scala

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
4242
checkClassloaders(tester)(
4343
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
4444
"mill.codesig.ExternalSummary.apply upstreamClassloader" -> 1,
45-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
4645
"mill.scalalib.JvmWorkerModule#worker cl" -> 1,
4746
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 1
4847
)
@@ -67,7 +66,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
6766
"mill.codesig.ExternalSummary.apply upstreamClassloader" -> 1,
6867
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
6968
"mill.kotlinlib.KotlinWorkerFactory#setup cl" -> 1,
70-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
7169
"mill.scalalib.JvmWorkerModule#worker cl" -> 2,
7270
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 2
7371
)
@@ -93,7 +91,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
9391
"mill.codesig.ExternalSummary.apply upstreamClassloader" -> 1,
9492
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
9593
"mill.kotlinlib.KotlinWorkerFactory#setup cl" -> 1,
96-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
9794
"mill.scalalib.JvmWorkerModule#worker cl" -> 2,
9895
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 2
9996
)
@@ -117,7 +114,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
117114
tester.eval(("shutdown"))
118115
checkClassloaders(tester)(
119116
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
120-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
121117
"mill.scalalib.JvmWorkerModule#worker cl" -> 1
122118
)
123119
checkThreads(tester)(
@@ -140,7 +136,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
140136
checkClassloaders(tester)(
141137
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
142138
"mill.kotlinlib.KotlinWorkerFactory#setup cl" -> 1,
143-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
144139
"mill.scalalib.JvmWorkerModule#worker cl" -> 2,
145140
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 1
146141
)
@@ -166,7 +161,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
166161
checkClassloaders(tester)(
167162
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
168163
"mill.kotlinlib.KotlinWorkerFactory#setup cl" -> 1,
169-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
170164
"mill.scalalib.JvmWorkerModule#worker cl" -> 2,
171165
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 1
172166
)
@@ -194,7 +188,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
194188
checkClassloaders(tester)(
195189
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
196190
"mill.kotlinlib.KotlinWorkerFactory#setup cl" -> 1,
197-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
198191
"mill.scalalib.JvmWorkerModule#worker cl" -> 2,
199192
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 1
200193
)
@@ -219,7 +212,6 @@ object LeakHygieneTests extends UtestIntegrationTestSuite {
219212
"leaked classloader" -> 1,
220213
"mill.daemon.MillBuildBootstrap#processRunClasspath classLoader cl" -> 1,
221214
"mill.kotlinlib.KotlinWorkerFactory#setup cl" -> 1,
222-
"mill.meta.ScalaCompilerWorker.reflectUnsafe cl" -> 1,
223215
"mill.scalalib.JvmWorkerModule#worker cl" -> 2,
224216
"mill.scalalib.worker.JvmWorkerImpl#getCachedClassLoader cl" -> 1
225217
)

integration/ide/gen-idea/resources/extended/idea/mill_modules/mill-build.mill-build.iml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@
7979
<orderEntry type="library" name="mill-libs_3.jar" level="project"/>
8080
<orderEntry type="library" name="mill-moduledefs_3-0.11.4.jar" level="project"/>
8181
<orderEntry type="library" name="mill-runner-codesig_3.jar" level="project"/>
82-
<orderEntry type="library" name="mill-runner-compilerworker-api_3.jar" level="project"/>
8382
<orderEntry type="library" name="mill-runner-meta_3.jar" level="project"/>
8483
<orderEntry type="library" name="native-terminal-no-ffm-0.0.9.1.jar" level="project"/>
8584
<orderEntry type="library" name="os-lib_3-0.11.5-M2.jar" level="project"/>

runner/compilerworker/api/package.mill

Lines changed: 0 additions & 7 deletions
This file was deleted.

runner/compilerworker/api/src/ImportTree.scala

Lines changed: 0 additions & 8 deletions
This file was deleted.

runner/compilerworker/api/src/MillScalaParser.scala

Lines changed: 0 additions & 9 deletions
This file was deleted.

runner/compilerworker/api/src/ObjectData.scala

Lines changed: 0 additions & 8 deletions
This file was deleted.

runner/compilerworker/api/src/ScalaCompilerWorkerApi.scala

Lines changed: 0 additions & 2 deletions
This file was deleted.

runner/compilerworker/api/src/Snip.scala

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)