Skip to content

Commit 2d6d576

Browse files
committed
Merge bracnh 'main' into tr-path-mapping-optional
2 parents c798cc4 + 34fdd10 commit 2d6d576

File tree

143 files changed

+870
-337
lines changed

Some content is hidden

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

143 files changed

+870
-337
lines changed

.github/workflows/run-tests.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ jobs:
150150
- java-version: 21
151151
millargs: "example.javalib.__.local.daemon"
152152

153+
- java-version: 21
154+
millargs: "example.springboot.__.local.daemon"
155+
153156
- java-version: 17
154157
millargs: "'example.androidlib.__.local.daemon'"
155158
setup-android: true

build.mill

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//| mill-version: 1.0.6-46-c0a7df
1+
//| mill-version: 1.0.6-88-54d201
22
//| mill-jvm-opts: ["-XX:NonProfiledCodeHeapSize=250m", "-XX:ReservedCodeCacheSize=500m"]
33
//| mill-opts: ["--jobs=0.5C"]
44

core/api/src/mill/api/Evaluator.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ trait Evaluator extends AutoCloseable with EvaluatorApi {
134134
* APIs related to selective execution
135135
*/
136136
def selective: SelectiveExecution
137+
138+
private[mill] def resolveScriptModuleDep(s: String): Option[mill.api.Module] = None
137139
}
138140
object Evaluator {
139141
// This needs to be a ThreadLocal because we need to pass it into the body of

core/api/src/mill/api/EvaluatorProxy.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,6 @@ final class EvaluatorProxy(var delegate0: () => Evaluator) extends Evaluator {
114114
def close = delegate0 = null
115115

116116
def selective = delegate.selective
117+
override private[mill] def resolveScriptModuleDep(s: String): Option[mill.api.Module] =
118+
delegate.resolveScriptModuleDep(s)
117119
}

core/api/src/mill/api/internal/Cacher.scala

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package mill.api.internal
22

3-
import collection.mutable.LinkedHashSet
3+
import scala.collection.immutable.VectorMap
44
import scala.collection.mutable
55
import scala.util.DynamicVariable
66
import scala.quoted.*
@@ -12,7 +12,8 @@ trait Cacher extends mill.moduledefs.Cacher {
1212
if (Cacher.taskEvaluationStack.value.contains((c, this))) {
1313
sys.error(
1414
"Circular task dependency detected:\n" +
15-
(Cacher.taskEvaluationStack.value.toList ++ Seq((c, this)))
15+
16+
(Cacher.taskEvaluationStack.value.keys ++ Seq((c, this)))
1617
.map { case (c, o) =>
1718
val taskName = c.value.split("\\.|#| ").filter(!_.startsWith("$anon")).last
1819
o.toString match {
@@ -24,19 +25,16 @@ trait Cacher extends mill.moduledefs.Cacher {
2425
)
2526
}
2627

27-
try {
28-
Cacher.taskEvaluationStack.value.add((c, this))
28+
Cacher.taskEvaluationStack.withValue(Cacher.taskEvaluationStack.value ++ Seq((c, this) -> ())) {
2929
cacherLazyMap.getOrElseUpdate(c, t).asInstanceOf[T]
30-
} finally {
31-
Cacher.taskEvaluationStack.value.remove((c, this))
3230
}
3331
}
3432
}
3533

3634
private[mill] object Cacher {
37-
// Use a LinkedHashSet for fast contains checking while preserving insertion order
35+
// Use a VectorMap for fast contains checking while preserving insertion order
3836
private[mill] val taskEvaluationStack =
39-
DynamicVariable[LinkedHashSet[(sourcecode.Enclosing, Any)]](LinkedHashSet())
37+
DynamicVariable[VectorMap[(sourcecode.Enclosing, Any), Unit]](VectorMap())
4038
private[mill] def withMacroOwner[T](using Quotes)(op: quotes.reflect.Symbol => T): T = {
4139
import quotes.reflect.*
4240
// In Scala 3, the top level splice of a macro is owned by a symbol called "macro" with the macro flag set,

core/eval/src/mill/eval/EvaluatorImpl.scala

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,7 @@ final class EvaluatorImpl private[mill] (
2525
private[mill] val allowPositionalCommandArgs: Boolean,
2626
private[mill] val selectiveExecution: Boolean = false,
2727
private val execution: Execution,
28-
scriptModuleResolver: (
29-
String,
30-
String => Option[mill.Module],
31-
Boolean,
32-
Option[String]
33-
) => Seq[Result[mill.api.ExternalModule]]
28+
scriptModuleResolver: (String, String => Option[Module]) => Seq[Result[ExternalModule]]
3429
) extends Evaluator {
3530

3631
private[mill] def workspace = execution.workspace
@@ -50,7 +45,7 @@ final class EvaluatorImpl private[mill] (
5045
scriptModuleResolver
5146
)
5247

53-
private[mill] def resolveSingleModule(s: String): Option[mill.Module] = {
48+
override private[mill] def resolveScriptModuleDep(s: String): Option[mill.Module] = {
5449
resolveModulesOrTasks(Seq(s), SelectMode.Multi)
5550
.toOption
5651
.toSeq
@@ -75,7 +70,7 @@ final class EvaluatorImpl private[mill] (
7570
selectMode,
7671
allowPositionalCommandArgs,
7772
resolveToModuleTasks,
78-
scriptModuleResolver = scriptModuleResolver(_, resolveSingleModule, _, _)
73+
scriptModuleResolver = scriptModuleResolver(_, resolveScriptModuleDep)
7974
)
8075
}
8176
}
@@ -92,7 +87,7 @@ final class EvaluatorImpl private[mill] (
9287
selectMode,
9388
allowPositionalCommandArgs,
9489
resolveToModuleTasks,
95-
scriptModuleResolver = scriptModuleResolver(_, resolveSingleModule, _, _)
90+
scriptModuleResolver = scriptModuleResolver(_, resolveScriptModuleDep)
9691
)
9792
}
9893
}
@@ -115,7 +110,7 @@ final class EvaluatorImpl private[mill] (
115110
selectMode,
116111
allowPositionalCommandArgs,
117112
resolveToModuleTasks,
118-
scriptModuleResolver = scriptModuleResolver(_, resolveSingleModule, _, _)
113+
scriptModuleResolver = scriptModuleResolver(_, resolveScriptModuleDep)
119114
)
120115
}
121116
}
@@ -134,7 +129,7 @@ final class EvaluatorImpl private[mill] (
134129
selectMode,
135130
allowPositionalCommandArgs,
136131
resolveToModuleTasks,
137-
scriptModuleResolver = scriptModuleResolver(_, resolveSingleModule, _, _)
132+
scriptModuleResolver = scriptModuleResolver(_, resolveScriptModuleDep)
138133
)
139134
}
140135
}
@@ -296,7 +291,7 @@ final class EvaluatorImpl private[mill] (
296291
scriptArgs,
297292
selectMode,
298293
allowPositionalCommandArgs,
299-
scriptModuleResolver = scriptModuleResolver(_, resolveSingleModule, _, _)
294+
scriptModuleResolver = scriptModuleResolver(_, resolveScriptModuleDep)
300295
)
301296
}
302297
}

core/resolve/src/mill/resolve/Resolve.scala

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,10 @@ private[mill] trait Resolve[T] {
310310
selectMode: SelectMode,
311311
allowPositionalCommandArgs: Boolean = false,
312312
resolveToModuleTasks: Boolean = false,
313-
scriptModuleResolver: (
314-
String,
315-
Boolean,
316-
Option[String]
317-
) => Seq[Result[mill.api.ExternalModule]]
313+
scriptModuleResolver: String => Seq[Result[mill.api.ExternalModule]]
318314
): Result[List[T]] = {
319315
val nullCommandDefaults = selectMode == SelectMode.Multi
320-
val cache = new ResolveCore.Cache(scriptModuleChildResolver = scriptModuleResolver(_, true, _))
316+
val cache = new ResolveCore.Cache()
321317
def handleScriptModule(args: Seq[String], fallback: => Result[Seq[T]]): Result[Seq[T]] = {
322318
val (first, selector, remaining) = args match {
323319
case Seq(s"$prefix:$suffix", rest*) => (prefix, Some(suffix), rest)
@@ -336,21 +332,14 @@ private[mill] trait Resolve[T] {
336332
Segments.labels(segments*),
337333
nullCommandDefaults,
338334
allowPositionalCommandArgs,
339-
resolveToModuleTasks,
340-
scriptModuleResolver
335+
resolveToModuleTasks
341336
)
342337
)
343338
}
344339

345-
scriptModuleResolver(first, false, None) match {
340+
scriptModuleResolver(first) match {
346341
case Seq(resolved) => handleResolved(resolved, selector.toSeq, remaining)
347-
case Nil =>
348-
if (selector.isEmpty) { // if the `:selector` is empty, try treating the `first` as a selector
349-
scriptModuleResolver(".", false, None) match {
350-
case Seq(resolved) => handleResolved(resolved, Seq(first), remaining)
351-
case Nil => fallback
352-
}
353-
} else fallback
342+
case Nil => fallback
354343
}
355344
}
356345
val resolvedGroups = ParseArgs.separate(scriptArgs).map { group =>
@@ -392,14 +381,9 @@ private[mill] trait Resolve[T] {
392381
sel: Segments,
393382
nullCommandDefaults: Boolean,
394383
allowPositionalCommandArgs: Boolean,
395-
resolveToModuleTasks: Boolean,
396-
scriptModuleResolver: (
397-
String,
398-
Boolean,
399-
Option[String]
400-
) => Seq[Result[mill.api.ExternalModule]]
384+
resolveToModuleTasks: Boolean
401385
): Result[Seq[T]] = {
402-
val cache = new ResolveCore.Cache(scriptModuleChildResolver = scriptModuleResolver(_, true, _))
386+
val cache = new ResolveCore.Cache()
403387
resolveNonEmptyAndHandle2(
404388
rootModule,
405389
args,

core/resolve/src/mill/resolve/ResolveCore.scala

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,7 @@ private object ResolveCore {
5959
java.lang.reflect.Method,
6060
String
6161
)]] =
62-
collection.mutable.Map(),
63-
val scriptModuleChildResolver: (
64-
String,
65-
Option[String]
66-
) => Seq[mill.api.Result[mill.api.ExternalModule]]
62+
collection.mutable.Map()
6763
) {
6864
def decode(s: String): String = {
6965
decodedNames.getOrElseUpdate(s, scala.reflect.NameTransformer.decode(s))
@@ -429,7 +425,7 @@ private object ResolveCore {
429425
)
430426
}
431427
} else mill.api.Result.Success {
432-
val reflectMemberObjects = Reflect
428+
Reflect
433429
.reflectNestedObjects02[Module](cls, namePred, cache.getMethods)
434430
.collect {
435431
case (name, memberCls, getter) =>
@@ -439,18 +435,6 @@ private object ResolveCore {
439435
(resolved, getter2)
440436
}
441437
.toSeq
442-
443-
val simpleModuleObjects =
444-
if (!segments.value.forall(_.isInstanceOf[Segment.Label])) Nil
445-
else {
446-
val scriptKey = segments.value.flatMap(_.pathSegments).mkString("/")
447-
val resolvedScript = cache.scriptModuleChildResolver(scriptKey, nameOpt)
448-
for (mod <- resolvedScript) yield {
449-
val newSegments = Segments.labels(mod.get.moduleSegments.last.value)
450-
(Resolved.Module(newSegments, mod.get.getClass), Some((_: Module) => mod))
451-
}
452-
}
453-
reflectMemberObjects ++ simpleModuleObjects
454438
}
455439
}
456440

core/resolve/test/src/mill/resolve/Checker.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class Checker[T <: RootModule0](module: T) {
5353
SelectMode.Separated,
5454
false,
5555
false,
56-
(_, _, _) => Nil
56+
_ => Nil
5757
)
5858
}
5959

@@ -64,7 +64,7 @@ class Checker[T <: RootModule0](module: T) {
6464
SelectMode.Separated,
6565
false,
6666
false,
67-
(_, _, _) => Nil
67+
_ => Nil
6868
).map(_.map(_.render))
6969
}
7070
}

example/javalib/basic/1-script/FooTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//| extends: [mill.script.JavaModule.Junit4]
2-
//| moduleDeps: [Foo.java]
2+
//| moduleDeps: [./Foo.java]
33
//| mvnDeps:
44
//| - "com.google.guava:guava:33.3.0-jre"
55

0 commit comments

Comments
 (0)