11package build
22import mill.*, scalalib.*
33
4- import mill.define._
5- import mill.define.SelectMode
6- import mill.api.Result.create
7- import mill.api.Result
4+ import mill.api._
5+ import mill.api.daemon.SelectMode
86
97object `package` extends ScalaModule {
108 def scalaVersion = "2.13.11"
@@ -18,26 +16,61 @@ object `package` extends ScalaModule {
1816 def testFramework = "utest.runner.Framework"
1917 }
2018
21- def customSegmentCommand(evaluator: Evaluator, tasks: String*) = Task.Command(exclusive = true) {
22- val segmentsResult = evaluator
23- .resolveSegments(tasks, SelectMode.Multi)
24- .get
25-
26- segmentsResult.foreach { segment =>
27- println(s"Segment: ${segment.render}")
19+ def depMapper(evaluator: Evaluator) = Task.Command(exclusive = true) {
20+ val tasks = Seq("mvnDeps", "test.mvnDeps", "allSourceFiles")
21+ val resolvedTasks = evaluator.resolveTasks(tasks, SelectMode.Multi).get
22+ val executeResult = evaluator.execute(resolvedTasks)
23+
24+ executeResult.values match {
25+ case mill.api.Result.Success(values) =>
26+ val mainDeps = values(0).asInstanceOf[Seq[mill.javalib.Dep]]
27+ val testDeps = values(1).asInstanceOf[Seq[mill.javalib.Dep]]
28+ val sourceFiles = values(2).asInstanceOf[Seq[mill.api.PathRef]].map(_.path)
29+
30+ println("--- Dependency Users Report ---")
31+ (mainDeps ++ testDeps).foreach { dep =>
32+ val depName = s"${dep.organization}:${dep.name}:${dep.version}"
33+ val usageInfo = findDependencyUsage(dep, sourceFiles)
34+ if (usageInfo.nonEmpty) {
35+ println(s"Dependency: $depName\nUsed By Files:")
36+ usageInfo.foreach { case (file, imports) =>
37+ println(s" - ${file.relativeTo(os.pwd)} (via: ${imports.mkString(", ")})")
38+ }
39+ println()
40+ }
41+ }
42+ println("--- End Report ---")
43+ case failure =>
44+ println(s"Task execution failed: $failure")
2845 }
29- ()
46+ }
47+
48+ def findDependencyUsage(dep: mill.javalib.Dep, sourceFiles: Seq[os.Path]): Seq[(os.Path, Seq[String])] = {
49+ sourceFiles.collect {
50+ case file =>
51+ val imports = extractImportsForDep(os.read(file), dep)
52+ if (imports.nonEmpty) Some((file, imports)) else None
53+ }.flatten
54+ }
55+
56+ def extractImportsForDep(content: String, dep: mill.javalib.Dep): Seq[String] = {
57+ val importRegex = """import\s+([^\s\n;]+)""".r
58+
59+ importRegex.findAllMatchIn(content)
60+ .map(_.group(1))
61+ .filter(_.startsWith(dep.name))
62+ .toSeq
63+ .distinct
3064 }
3165
3266}
3367
34- // This command resolves the segments of the given tasks and prints them .
35- // The segments are the parts of the task names that are used to group tasks.
68+ // This command generates a report of dependency usage in source files .
69+ // It uses resolveTasks and execute to gather information about dependencies and their usage in source files
3670
3771/** Usage
3872
39- > ./mill customSegmentCommand compile test
40- Segment: compile
41- Segment: test
73+ > ./mill depMapper
74+ --- Dependency Users Report ---
4275
4376*/
0 commit comments