@@ -7,6 +7,7 @@ import mill.contrib.scoverage.api.ScoverageReportWorkerApi.ReportType
7
7
import mill .define .{Command , Persistent , Sources , Target , Task }
8
8
import mill .scalalib .api .ZincWorkerUtil
9
9
import mill .scalalib .{Dep , DepSyntax , JavaModule , ScalaModule }
10
+ import mill .api .Result
10
11
11
12
/**
12
13
* Adds targets to a [[mill.scalalib.ScalaModule ]] to create test coverage reports.
@@ -59,35 +60,61 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
59
60
60
61
private def isScoverage2 : Task [Boolean ] = T .task { scoverageVersion().startsWith(" 2." ) }
61
62
63
+ private def isScala3 : Task [Boolean ] = T .task { ZincWorkerUtil .isScala3(outer.scalaVersion()) }
64
+
65
+ private def isScala2 : Task [Boolean ] = T .task { ! isScala3() }
66
+
62
67
/** Binary compatibility shim. */
63
68
@ deprecated(" Use scoverageRuntimeDeps instead." , " Mill after 0.10.7" )
64
69
def scoverageRuntimeDep : T [Dep ] = T {
65
- T .log.error(" scoverageRuntimeDep is no longer used. To customize your module, use scoverageRuntimeDeps." )
66
- scoverageRuntimeDeps().toIndexedSeq.head
70
+ T .log.error(
71
+ " scoverageRuntimeDep is no longer used. To customize your module, use scoverageRuntimeDeps."
72
+ )
73
+ val result : Result [Dep ] = if (isScala3()) {
74
+ Result .Failure (" When using Scala 3 there is no external runtime dependency" )
75
+ } else {
76
+ scoverageRuntimeDeps().toIndexedSeq.head
77
+ }
78
+ result
67
79
}
68
80
69
81
def scoverageRuntimeDeps : T [Agg [Dep ]] = T {
70
- Agg (ivy " org.scoverage::scalac-scoverage-runtime: ${outer.scoverageVersion()}" )
82
+ if (isScala3()) {
83
+ Agg .empty
84
+ } else {
85
+ Agg (ivy " org.scoverage::scalac-scoverage-runtime: ${outer.scoverageVersion()}" )
86
+ }
71
87
}
72
88
73
89
/** Binary compatibility shim. */
74
90
@ deprecated(" Use scoveragePluginDeps instead." , " Mill after 0.10.7" )
75
91
def scoveragePluginDep : T [Dep ] = T {
76
- T .log.error(" scoveragePluginDep is no longer used. To customize your module, use scoverageRuntimeDeps." )
77
- scoveragePluginDeps().toIndexedSeq.head
92
+ T .log.error(
93
+ " scoveragePluginDep is no longer used. To customize your module, use scoverageRuntimeDeps."
94
+ )
95
+ val result : Result [Dep ] = if (isScala3()) {
96
+ Result .Failure (" When using Scala 3 there is no external plugin dependency" )
97
+ } else {
98
+ scoveragePluginDeps().toIndexedSeq.head
99
+ }
100
+ result
78
101
}
79
102
80
103
def scoveragePluginDeps : T [Agg [Dep ]] = T {
81
104
val sv = scoverageVersion()
82
- if (isScoverage2()) {
83
- Agg (
84
- ivy " org.scoverage:::scalac-scoverage-plugin: ${sv}" ,
85
- ivy " org.scoverage::scalac-scoverage-domain: ${sv}" ,
86
- ivy " org.scoverage::scalac-scoverage-serializer: ${sv}" ,
87
- ivy " org.scoverage::scalac-scoverage-reporter: ${sv}"
88
- )
105
+ if (isScala3()) {
106
+ Agg .empty
89
107
} else {
90
- Agg (ivy " org.scoverage:::scalac-scoverage-plugin: ${sv}" )
108
+ if (isScoverage2()) {
109
+ Agg (
110
+ ivy " org.scoverage:::scalac-scoverage-plugin: ${sv}" ,
111
+ ivy " org.scoverage::scalac-scoverage-domain: ${sv}" ,
112
+ ivy " org.scoverage::scalac-scoverage-serializer: ${sv}" ,
113
+ ivy " org.scoverage::scalac-scoverage-reporter: ${sv}"
114
+ )
115
+ } else {
116
+ Agg (ivy " org.scoverage:::scalac-scoverage-plugin: ${sv}" )
117
+ }
91
118
}
92
119
}
93
120
@@ -96,23 +123,47 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
96
123
scoverageToolsClasspath()
97
124
}
98
125
126
+ private def checkVersions = T .task {
127
+ val sv = scalaVersion()
128
+ val isSov2 = scoverageVersion().startsWith(" 2." )
129
+ (sv.split('.' ), isSov2) match {
130
+ case (Array (" 3" , " 0" | " 1" , _* ), _) => Result .Failure (
131
+ " Scala 3.0 and 3.1 is not supported by Scoverage. You have to update to at least Scala 3.2 and Scoverage 2.0"
132
+ )
133
+ case (Array (" 3" , _* ), false ) => Result .Failure (
134
+ " Scoverage 1.x does not support Scala 3. You have to update to at least Scala 3.2 and Scoverage 2.0"
135
+ )
136
+ case (Array (" 2" , " 11" , _* ), true ) => Result .Failure (
137
+ " Scoverage 2.x is not compatible with Scala 2.11. Consider using Scoverage 1.x or switch to a newer Scala version."
138
+ )
139
+ case _ =>
140
+ }
141
+ }
142
+
99
143
def scoverageToolsClasspath : T [Agg [PathRef ]] = T {
144
+ checkVersions()
145
+
100
146
scoverageReportWorkerClasspath() ++
101
147
resolveDeps(T .task {
102
148
// we need to resolve with same Scala version used for Mill, not the project Scala version
103
149
val scalaBinVersion = ZincWorkerUtil .scalaBinaryVersion(BuildInfo .scalaVersion)
104
150
val sv = scoverageVersion()
105
- if (isScoverage2()) {
106
- Agg (
107
- ivy " org.scoverage:scalac-scoverage-plugin_ ${mill.BuildInfo .scalaVersion}: ${sv}" ,
108
- ivy " org.scoverage:scalac-scoverage-domain_ ${scalaBinVersion}: ${sv}" ,
109
- ivy " org.scoverage:scalac-scoverage-serializer_ ${scalaBinVersion}: ${sv}" ,
110
- ivy " org.scoverage:scalac-scoverage-reporter_ ${scalaBinVersion}: ${sv}"
111
- )
151
+
152
+ val baseDeps = Agg (
153
+ ivy " org.scoverage:scalac-scoverage-domain_ ${scalaBinVersion}: ${sv}" ,
154
+ ivy " org.scoverage:scalac-scoverage-serializer_ ${scalaBinVersion}: ${sv}" ,
155
+ ivy " org.scoverage:scalac-scoverage-reporter_ ${scalaBinVersion}: ${sv}"
156
+ )
157
+
158
+ val pluginDep =
159
+ Agg (ivy " org.scoverage:scalac-scoverage-plugin_ ${mill.BuildInfo .scalaVersion}: ${sv}" )
160
+
161
+ if (isScala3() && isScoverage2()) {
162
+ baseDeps
163
+ } else if (isScoverage2()) {
164
+ baseDeps ++ pluginDep
112
165
} else {
113
- Agg (
114
- ivy " org.scoverage:scalac-scoverage-plugin_ ${mill.BuildInfo .scalaVersion}: ${sv}"
115
- )
166
+ pluginDep
116
167
}
117
168
})()
118
169
}
@@ -141,6 +192,7 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
141
192
}
142
193
143
194
val scoverage : ScoverageData = new ScoverageData (implicitly)
195
+
144
196
class ScoverageData (ctx0 : mill.define.Ctx ) extends Module ()(ctx0) with ScalaModule {
145
197
146
198
def doReport (reportType : ReportType ): Task [Unit ] = T .task {
@@ -180,9 +232,16 @@ trait ScoverageModule extends ScalaModule { outer: ScalaModule =>
180
232
/** Add the scoverage specific plugin settings (`dataDir`). */
181
233
override def scalacOptions : Target [Seq [String ]] =
182
234
T {
183
- outer.scalacOptions() ++
184
- Seq (s " -P:scoverage:dataDir: ${data().path.toIO.getPath()}" ) ++
185
- (if (isScoverage2()) Seq (s " -P:scoverage:sourceRoot: ${T .workspace}" ) else Seq ())
235
+ val extras =
236
+ if (isScala3()) {
237
+ Seq (s " -coverage-out: ${data().path.toIO.getPath()}" )
238
+ } else {
239
+ val base = s " -P:scoverage:dataDir: ${data().path.toIO.getPath()}"
240
+ if (isScoverage2()) Seq (base, s " -P:scoverage:sourceRoot: ${T .workspace}" )
241
+ else Seq (base)
242
+ }
243
+
244
+ outer.scalacOptions() ++ extras
186
245
}
187
246
188
247
def htmlReport (): Command [Unit ] = T .command { doReport(ReportType .Html ) }
0 commit comments