Skip to content

Commit a3a5340

Browse files
Refresh the excluded implementation (#484)
* Refresh the excluded implementation. * PR feedback: Using import. * PR feedback: Adding missing files. Make tests pass (again). * Running scalafmt * PR feedback: Restore the current behaviour (for excludedFiles). * Running scalafmt
1 parent a6eb374 commit a3a5340

File tree

5 files changed

+62
-32
lines changed

5 files changed

+62
-32
lines changed

README.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Search for scalac-scoverage-plugin.
8888
#### Excluding code from coverage stats
8989

9090
You can exclude whole classes or packages by name. Pass a semicolon separated
91-
list of regexes to the 'excludedPackages' option.
91+
list of regexes to the `excludedPackages` option.
9292

9393
For example:
9494

@@ -98,6 +98,15 @@ The regular expressions are matched against the fully qualified class name, and
9898

9999
Any matched classes will not be instrumented or included in the coverage report.
100100

101+
You can also exclude files from being considered for instrumentation.
102+
103+
-P:scoverage:excludedFiles:.*\/two\/GoodCoverage;.*\/three\/.*
104+
105+
Note: The `.scala` file extension needs to be omitted from the filename, if one is given.
106+
107+
Note: These two options only work for Scala2. Right now Scala3 does not support
108+
a way to exclude packages or files from being instrumented.
109+
101110
You can also mark sections of code with comments like:
102111

103112
// $COVERAGE-OFF$

plugin/src/main/scala/scoverage/CoverageFilter.scala

+9-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scoverage
33
import scala.collection.mutable
44
import scala.reflect.internal.util.Position
55
import scala.reflect.internal.util.SourceFile
6+
import scala.tools.nsc.reporters.Reporter
67
import scala.util.matching.Regex
78

89
/** Methods related to filtering the instrumentation and coverage.
@@ -28,8 +29,15 @@ object AllCoverageFilter extends CoverageFilter {
2829
class RegexCoverageFilter(
2930
excludedPackages: Seq[String],
3031
excludedFiles: Seq[String],
31-
excludedSymbols: Seq[String]
32+
excludedSymbols: Seq[String],
33+
reporter: Reporter
3234
) extends CoverageFilter {
35+
if (excludedPackages.nonEmpty)
36+
reporter.echo(s"scoverage excludedPackages: ${excludedPackages}")
37+
if (excludedFiles.nonEmpty)
38+
reporter.echo(s"scoverage excludedFiles: ${excludedFiles}")
39+
if (excludedSymbols.nonEmpty)
40+
reporter.echo(s"scoverage excludedSymbols: ${excludedSymbols}")
3341

3442
val excludedClassNamePatterns = excludedPackages.map(_.r.pattern)
3543
val excludedFilePatterns = excludedFiles.map(_.r.pattern)

plugin/src/main/scala/scoverage/ScoveragePlugin.scala

+6-4
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ class ScoverageInstrumentationComponent(
112112
coverageFilter = new RegexCoverageFilter(
113113
options.excludedPackages,
114114
options.excludedFiles,
115-
options.excludedSymbols
115+
options.excludedSymbols,
116+
reporter
116117
)
117118
new File(options.dataDir).mkdirs() // ensure data directory is created
118119
}
@@ -230,8 +231,9 @@ class ScoverageInstrumentationComponent(
230231
): Tree = {
231232
safeSource(tree) match {
232233
case None =>
233-
reporter.echo(
234-
s"[warn] Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]. No pos."
234+
reporter.warning(
235+
NoPosition,
236+
s"Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]."
235237
)
236238
tree
237239
case Some(source) =>
@@ -361,7 +363,7 @@ class ScoverageInstrumentationComponent(
361363
Location.fromGlobal(global)(t) match {
362364
case Some(loc) => this.location = loc
363365
case _ =>
364-
reporter.warning(t.pos, s"[warn] Cannot update location for $t")
366+
reporter.warning(t.pos, s"Cannot update location for $t")
365367
}
366368
}
367369

plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala

+37-25
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,56 @@ import scala.reflect.internal.util.BatchSourceFile
44
import scala.reflect.internal.util.NoFile
55
import scala.reflect.internal.util.SourceFile
66
import scala.reflect.io.VirtualFile
7+
import scala.tools.nsc.reporters.ConsoleReporter
8+
import scala.tools.nsc.Settings
79

810
import munit.FunSuite
911

1012
class RegexCoverageFilterTest extends FunSuite {
1113

14+
val reporter = new ConsoleReporter(new Settings())
15+
1216
test("isClassIncluded should return true for empty excludes") {
13-
assert(new RegexCoverageFilter(Nil, Nil, Nil).isClassIncluded("x"))
17+
assert(
18+
new RegexCoverageFilter(Nil, Nil, Nil, reporter).isClassIncluded("x")
19+
)
1420
}
1521

1622
test("should not crash for empty input") {
17-
assert(new RegexCoverageFilter(Nil, Nil, Nil).isClassIncluded(""))
23+
assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isClassIncluded(""))
1824
}
1925

2026
test("should exclude scoverage -> scoverage") {
2127
assert(
22-
!new RegexCoverageFilter(Seq("scoverage"), Nil, Nil)
28+
!new RegexCoverageFilter(Seq("scoverage"), Nil, Nil, reporter)
2329
.isClassIncluded("scoverage")
2430
)
2531
}
2632

2733
test("should include scoverage -> scoverageeee") {
2834
assert(
29-
new RegexCoverageFilter(Seq("scoverage"), Nil, Nil)
35+
new RegexCoverageFilter(Seq("scoverage"), Nil, Nil, reporter)
3036
.isClassIncluded("scoverageeee")
3137
)
3238
}
3339

3440
test("should exclude scoverage* -> scoverageeee") {
3541
assert(
36-
!new RegexCoverageFilter(Seq("scoverage*"), Nil, Nil)
42+
!new RegexCoverageFilter(Seq("scoverage*"), Nil, Nil, reporter)
3743
.isClassIncluded("scoverageeee")
3844
)
3945
}
4046

4147
test("should include eee -> scoverageeee") {
4248
assert(
43-
new RegexCoverageFilter(Seq("eee"), Nil, Nil)
49+
new RegexCoverageFilter(Seq("eee"), Nil, Nil, reporter)
4450
.isClassIncluded("scoverageeee")
4551
)
4652
}
4753

4854
test("should exclude .*eee -> scoverageeee") {
4955
assert(
50-
!new RegexCoverageFilter(Seq(".*eee"), Nil, Nil)
56+
!new RegexCoverageFilter(Seq(".*eee"), Nil, Nil, reporter)
5157
.isClassIncluded("scoverageeee")
5258
)
5359
}
@@ -56,91 +62,97 @@ class RegexCoverageFilterTest extends FunSuite {
5662

5763
test("isFileIncluded should return true for empty excludes") {
5864
val file = new BatchSourceFile(abstractFile, Array.emptyCharArray)
59-
assert(new RegexCoverageFilter(Nil, Nil, Nil).isFileIncluded(file))
65+
assert(
66+
new RegexCoverageFilter(Nil, Nil, Nil, reporter).isFileIncluded(file)
67+
)
6068
}
6169

6270
test("should exclude by filename") {
6371
val file = new BatchSourceFile(abstractFile, Array.emptyCharArray)
6472
assert(
65-
!new RegexCoverageFilter(Nil, Seq("sammy"), Nil)
73+
!new RegexCoverageFilter(Nil, Seq("sammy"), Nil, reporter)
6674
.isFileIncluded(file)
6775
)
6876
}
6977

7078
test("should exclude by regex wildcard") {
7179
val file = new BatchSourceFile(abstractFile, Array.emptyCharArray)
7280
assert(
73-
!new RegexCoverageFilter(Nil, Seq("sam.*"), Nil)
81+
!new RegexCoverageFilter(Nil, Seq("sam.*"), Nil, reporter)
7482
.isFileIncluded(file)
7583
)
7684
}
7785

7886
test("should not exclude non matching regex") {
7987
val file = new BatchSourceFile(abstractFile, Array.emptyCharArray)
8088
assert(
81-
new RegexCoverageFilter(Nil, Seq("qweqeqwe"), Nil)
89+
new RegexCoverageFilter(Nil, Seq("qweqeqwe"), Nil, reporter)
8290
.isFileIncluded(file)
8391
)
8492
}
8593

8694
val options = ScoverageOptions.default()
8795

8896
test("isSymbolIncluded should return true for empty excludes") {
89-
assert(new RegexCoverageFilter(Nil, Nil, Nil).isSymbolIncluded("x"))
97+
assert(
98+
new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("x")
99+
)
90100
}
91101

92102
test("should not crash for empty input") {
93-
assert(new RegexCoverageFilter(Nil, Nil, Nil).isSymbolIncluded(""))
103+
assert(
104+
new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("")
105+
)
94106
}
95107

96108
test("should exclude scoverage -> scoverage") {
97109
assert(
98-
!new RegexCoverageFilter(Nil, Nil, Seq("scoverage"))
110+
!new RegexCoverageFilter(Nil, Nil, Seq("scoverage"), reporter)
99111
.isSymbolIncluded("scoverage")
100112
)
101113
}
102114

103115
test("should include scoverage -> scoverageeee") {
104116
assert(
105-
new RegexCoverageFilter(Nil, Nil, Seq("scoverage"))
117+
new RegexCoverageFilter(Nil, Nil, Seq("scoverage"), reporter)
106118
.isSymbolIncluded("scoverageeee")
107119
)
108120
}
109121
test("should exclude scoverage* -> scoverageeee") {
110122
assert(
111-
!new RegexCoverageFilter(Nil, Nil, Seq("scoverage*"))
123+
!new RegexCoverageFilter(Nil, Nil, Seq("scoverage*"), reporter)
112124
.isSymbolIncluded("scoverageeee")
113125
)
114126
}
115127

116128
test("should include eee -> scoverageeee") {
117129
assert(
118-
new RegexCoverageFilter(Nil, Nil, Seq("eee"))
130+
new RegexCoverageFilter(Nil, Nil, Seq("eee"), reporter)
119131
.isSymbolIncluded("scoverageeee")
120132
)
121133
}
122134

123135
test("should exclude .*eee -> scoverageeee") {
124136
assert(
125-
!new RegexCoverageFilter(Nil, Nil, Seq(".*eee"))
137+
!new RegexCoverageFilter(Nil, Nil, Seq(".*eee"), reporter)
126138
.isSymbolIncluded("scoverageeee")
127139
)
128140
}
129141
test("should exclude scala.reflect.api.Exprs.Expr") {
130142
assert(
131-
!new RegexCoverageFilter(Nil, Nil, options.excludedSymbols)
143+
!new RegexCoverageFilter(Nil, Nil, options.excludedSymbols, reporter)
132144
.isSymbolIncluded("scala.reflect.api.Exprs.Expr")
133145
)
134146
}
135147
test("should exclude scala.reflect.macros.Universe.Tree") {
136148
assert(
137-
!new RegexCoverageFilter(Nil, Nil, options.excludedSymbols)
149+
!new RegexCoverageFilter(Nil, Nil, options.excludedSymbols, reporter)
138150
.isSymbolIncluded("scala.reflect.macros.Universe.Tree")
139151
)
140152
}
141153
test("should exclude scala.reflect.api.Trees.Tree") {
142154
assert(
143-
!new RegexCoverageFilter(Nil, Nil, options.excludedSymbols)
155+
!new RegexCoverageFilter(Nil, Nil, options.excludedSymbols, reporter)
144156
.isSymbolIncluded("scala.reflect.api.Trees.Tree")
145157
)
146158
}
@@ -158,7 +170,7 @@ class RegexCoverageFilterTest extends FunSuite {
158170
|8
159171
""".stripMargin
160172

161-
val numbers = new RegexCoverageFilter(Nil, Nil, Nil)
173+
val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter)
162174
.getExcludedLineNumbers(mockSourceFile(file))
163175
assertEquals(numbers, List.empty)
164176
}
@@ -182,7 +194,7 @@ class RegexCoverageFilterTest extends FunSuite {
182194
|16
183195
""".stripMargin
184196

185-
val numbers = new RegexCoverageFilter(Nil, Nil, Nil)
197+
val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter)
186198
.getExcludedLineNumbers(mockSourceFile(file))
187199
assertEquals(numbers, List(Range(4, 9), Range(12, 14)))
188200
}
@@ -205,7 +217,7 @@ class RegexCoverageFilterTest extends FunSuite {
205217
|15
206218
""".stripMargin
207219

208-
val numbers = new RegexCoverageFilter(Nil, Nil, Nil)
220+
val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter)
209221
.getExcludedLineNumbers(mockSourceFile(file))
210222
assertEquals(numbers, List(Range(4, 9), Range(12, 16)))
211223
}
@@ -228,7 +240,7 @@ class RegexCoverageFilterTest extends FunSuite {
228240
|15
229241
""".stripMargin
230242

231-
val numbers = new RegexCoverageFilter(Nil, Nil, Nil)
243+
val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter)
232244
.getExcludedLineNumbers(mockSourceFile(file))
233245
assertEquals(numbers, List(Range(4, 9), Range(12, 16)))
234246
}

reporter/src/test/scala/scoverage/reporter/IOUtilsTest.scala

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import java.util.UUID
66

77
import munit.FunSuite
88
import scoverage.domain.Constants
9-
import scoverage.reporter.IOUtils
109

1110
/** @author Stephen Samuel */
1211
class IOUtilsTest extends FunSuite {

0 commit comments

Comments
 (0)