@@ -75,18 +75,28 @@ object ScoverageSbtPlugin extends AutoPlugin {
75
75
private def isScala2 (scalaVersion : String ) =
76
76
CrossVersion
77
77
.partialVersion(scalaVersion)
78
- .collect { case (2 , _) =>
79
- true
78
+ .exists {
79
+ case (2 , _) => true
80
+ case _ => false
80
81
}
81
- .getOrElse(false )
82
82
83
83
private def isScala3SupportingScoverage (scalaVersion : String ) =
84
84
CrossVersion
85
85
.partialVersion(scalaVersion)
86
- .collect {
86
+ .exists {
87
87
case (3 , minor) if minor >= 2 => true
88
+ case _ => false
89
+ }
90
+
91
+ private def isScala3SupportingFilePackageExclusion (scalaVersion : String ) = {
92
+ def patch = scalaVersion.split('.' ).drop(2 ).headOption
93
+ CrossVersion
94
+ .partialVersion(scalaVersion)
95
+ .exists {
96
+ case (3 , minor) if minor >= 4 && patch.exists(_ >= " 2" ) => true
97
+ case _ => false
88
98
}
89
- .getOrElse( false )
99
+ }
90
100
91
101
private lazy val coverageSettings = Seq (
92
102
libraryDependencies ++= {
@@ -114,6 +124,18 @@ object ScoverageSbtPlugin extends AutoPlugin {
114
124
115
125
implicit val log = streams.value.log
116
126
127
+ val excludedPackages =
128
+ Option (coverageExcludedPackages.value.trim).filter(_.nonEmpty)
129
+ val excludedFiles = Option (coverageExcludedFiles.value.trim)
130
+ .filter(_.nonEmpty)
131
+ .map(v =>
132
+ // On windows, replace unix file separators with windows file
133
+ // separators. Note that we need to replace / with \\ because
134
+ // the plugin treats this string as a regular expression and
135
+ // backslashes must be escaped in regular expressions.
136
+ if (isWindows) v.replace(" /" , """ \\ """ ) else v
137
+ )
138
+
117
139
val updateReport = update.value
118
140
if (coverageEnabled.value && isScala2(scalaVersion.value)) {
119
141
val scoverageDeps : Seq [File ] =
@@ -156,19 +178,8 @@ object ScoverageSbtPlugin extends AutoPlugin {
156
178
Some (
157
179
s " -P:scoverage:sourceRoot: ${coverageSourceRoot.value.getAbsolutePath}"
158
180
),
159
- Option (coverageExcludedPackages.value.trim)
160
- .filter(_.nonEmpty)
161
- .map(v => s " -P:scoverage:excludedPackages: $v" ),
162
- Option (coverageExcludedFiles.value.trim)
163
- .filter(_.nonEmpty)
164
- .map(v =>
165
- // On windows, replace unix file separators with windows file
166
- // separators. Note that we need to replace / with \\ because
167
- // the plugin treats this string as a regular expression and
168
- // backslashes must be escaped in regular expressions.
169
- if (isWindows) v.replace(" /" , """ \\ """ ) else v
170
- )
171
- .map(v => s " -P:scoverage:excludedFiles: $v" ),
181
+ excludedPackages.map(v => s " -P:scoverage:excludedPackages: $v" ),
182
+ excludedFiles.map(v => s " -P:scoverage:excludedFiles: $v" ),
172
183
Some (" -P:scoverage:reportTestName" ),
173
184
// rangepos is broken in some releases of scala so option to turn it off
174
185
if (coverageHighlighting.value) Some (" -Yrangepos" ) else None
@@ -177,8 +188,26 @@ object ScoverageSbtPlugin extends AutoPlugin {
177
188
coverageEnabled.value && isScala3SupportingScoverage(scalaVersion.value)
178
189
) {
179
190
Seq (
180
- s " -coverage-out: ${coverageDataDir.value.getAbsolutePath()}/scoverage-data "
181
- )
191
+ Some (
192
+ s " -coverage-out: ${coverageDataDir.value.getAbsolutePath()}/scoverage-data "
193
+ ),
194
+ excludedPackages
195
+ .collect {
196
+ case v
197
+ if isScala3SupportingFilePackageExclusion(
198
+ scalaVersion.value
199
+ ) =>
200
+ s " -coverage-exclude-classlikes: $v"
201
+ },
202
+ excludedFiles
203
+ .collect {
204
+ case v
205
+ if isScala3SupportingFilePackageExclusion(
206
+ scalaVersion.value
207
+ ) =>
208
+ s " -coverage-exclude-files: $v"
209
+ }
210
+ ).flatten
182
211
} else if (coverageEnabled.value && ! isScala2(scalaVersion.value)) {
183
212
log.warn(
184
213
" coverage in Scala 3 needs at least 3.2.x. Please update your Scala version and try again."
0 commit comments