1
1
package build
2
2
import mill.*, scalalib.*
3
3
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
8
6
9
7
object `package` extends ScalaModule {
10
8
def scalaVersion = "2.13.11"
@@ -18,26 +16,61 @@ object `package` extends ScalaModule {
18
16
def testFramework = "utest.runner.Framework"
19
17
}
20
18
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")
28
45
}
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
30
64
}
31
65
32
66
}
33
67
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
36
70
37
71
/** Usage
38
72
39
- > ./mill customSegmentCommand compile test
40
- Segment: compile
41
- Segment: test
73
+ > ./mill depMapper
74
+ --- Dependency Users Report ---
42
75
43
76
*/
0 commit comments