From 7d4a4d49b66ff07b9630fd81c40464c46e21ac44 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Sun, 3 Jul 2022 11:29:20 +0100 Subject: [PATCH 1/9] Refresh the excluded implementation. --- README.md | 9 ++++++++- plugin/src/main/scala/scoverage/CoverageFilter.scala | 9 +++++++-- plugin/src/main/scala/scoverage/ScoveragePlugin.scala | 9 +++++---- .../src/test/scala/scoverage/reporter/IOUtilsTest.scala | 1 - 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2fda42cc..bb619142 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Search for scalac-scoverage-plugin. #### Excluding code from coverage stats You can exclude whole classes or packages by name. Pass a semicolon separated -list of regexes to the 'excludedPackages' option. +list of regexes to the `excludedPackages` option. For example: @@ -98,6 +98,13 @@ The regular expressions are matched against the fully qualified class name, and Any matched classes will not be instrumented or included in the coverage report. +You can also exclude files from being considered for instrumentation. + + -P:scoverage:excludedFiles:.*\/two\/GoodCoverage\.scala;.*\/three\/.* + +Note: This only works for Scala2. Right now Scala3 does not support +a way to exclude packages or files from being instrumented. + You can also mark sections of code with comments like: // $COVERAGE-OFF$ diff --git a/plugin/src/main/scala/scoverage/CoverageFilter.scala b/plugin/src/main/scala/scoverage/CoverageFilter.scala index 189720ad..edae0e28 100644 --- a/plugin/src/main/scala/scoverage/CoverageFilter.scala +++ b/plugin/src/main/scala/scoverage/CoverageFilter.scala @@ -28,8 +28,13 @@ object AllCoverageFilter extends CoverageFilter { class RegexCoverageFilter( excludedPackages: Seq[String], excludedFiles: Seq[String], - excludedSymbols: Seq[String] + excludedSymbols: Seq[String], + reporter: scala.tools.nsc.reporters.Reporter + ) extends CoverageFilter { + reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") + reporter.echo(s"scoverage excludedFiles: ${excludedFiles}") + reporter.echo(s"scoverage excludedSymbols: ${excludedSymbols}") val excludedClassNamePatterns = excludedPackages.map(_.r.pattern) val excludedFilePatterns = excludedFiles.map(_.r.pattern) @@ -56,7 +61,7 @@ class RegexCoverageFilter( override def isFileIncluded(file: SourceFile): Boolean = { def isFileMatch(file: SourceFile) = excludedFilePatterns.exists( - _.matcher(file.path.replace(".scala", "")).matches + _.matcher(file.path).matches ) excludedFilePatterns.isEmpty || !isFileMatch(file) } diff --git a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala index 90235d7e..b52a7afe 100644 --- a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala +++ b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala @@ -112,7 +112,8 @@ class ScoverageInstrumentationComponent( coverageFilter = new RegexCoverageFilter( options.excludedPackages, options.excludedFiles, - options.excludedSymbols + options.excludedSymbols, + reporter ) new File(options.dataDir).mkdirs() // ensure data directory is created } @@ -230,8 +231,8 @@ class ScoverageInstrumentationComponent( ): Tree = { safeSource(tree) match { case None => - reporter.echo( - s"[warn] Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]. No pos." + reporter.warning( + NoPosition(), s"Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]." ) tree case Some(source) => @@ -361,7 +362,7 @@ class ScoverageInstrumentationComponent( Location.fromGlobal(global)(t) match { case Some(loc) => this.location = loc case _ => - reporter.warning(t.pos, s"[warn] Cannot update location for $t") + reporter.warning(t.pos, s"Cannot update location for $t") } } diff --git a/reporter/src/test/scala/scoverage/reporter/IOUtilsTest.scala b/reporter/src/test/scala/scoverage/reporter/IOUtilsTest.scala index 8f3bcfe2..a106988b 100644 --- a/reporter/src/test/scala/scoverage/reporter/IOUtilsTest.scala +++ b/reporter/src/test/scala/scoverage/reporter/IOUtilsTest.scala @@ -6,7 +6,6 @@ import java.util.UUID import munit.FunSuite import scoverage.domain.Constants -import scoverage.reporter.IOUtils /** @author Stephen Samuel */ class IOUtilsTest extends FunSuite { From 40ffb5768e94be255976f253efdf43282bcbf79e Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Mon, 4 Jul 2022 05:58:47 +0100 Subject: [PATCH 2/9] PR feedback: Using import. --- plugin/src/main/scala/scoverage/CoverageFilter.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin/src/main/scala/scoverage/CoverageFilter.scala b/plugin/src/main/scala/scoverage/CoverageFilter.scala index edae0e28..b8ff5bd1 100644 --- a/plugin/src/main/scala/scoverage/CoverageFilter.scala +++ b/plugin/src/main/scala/scoverage/CoverageFilter.scala @@ -3,6 +3,7 @@ package scoverage import scala.collection.mutable import scala.reflect.internal.util.Position import scala.reflect.internal.util.SourceFile +import scala.tools.nsc.reporters.Reporter import scala.util.matching.Regex /** Methods related to filtering the instrumentation and coverage. @@ -29,7 +30,7 @@ class RegexCoverageFilter( excludedPackages: Seq[String], excludedFiles: Seq[String], excludedSymbols: Seq[String], - reporter: scala.tools.nsc.reporters.Reporter + reporter: Reporter ) extends CoverageFilter { reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") From 4110c71013a18d624ce95ed49e6d804b9072be76 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Mon, 4 Jul 2022 08:07:12 +0100 Subject: [PATCH 3/9] PR feedback: Adding missing files. Make tests pass (again). --- .../scala/scoverage/ScoveragePlugin.scala | 2 +- .../scoverage/RegexCoverageFilterTest.scala | 54 ++++++++++--------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala index b52a7afe..9510ab1f 100644 --- a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala +++ b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala @@ -232,7 +232,7 @@ class ScoverageInstrumentationComponent( safeSource(tree) match { case None => reporter.warning( - NoPosition(), s"Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]." + NoPosition, s"Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]." ) tree case Some(source) => diff --git a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala index 781df1e0..804183ea 100644 --- a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala +++ b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala @@ -4,50 +4,54 @@ import scala.reflect.internal.util.BatchSourceFile import scala.reflect.internal.util.NoFile import scala.reflect.internal.util.SourceFile import scala.reflect.io.VirtualFile +import scala.tools.nsc.reporters.ConsoleReporter +import scala.tools.nsc.Settings import munit.FunSuite class RegexCoverageFilterTest extends FunSuite { + val reporter = new ConsoleReporter(new Settings()) + test("isClassIncluded should return true for empty excludes") { - assert(new RegexCoverageFilter(Nil, Nil, Nil).isClassIncluded("x")) + assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isClassIncluded("x")) } test("should not crash for empty input") { - assert(new RegexCoverageFilter(Nil, Nil, Nil).isClassIncluded("")) + assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isClassIncluded("")) } test("should exclude scoverage -> scoverage") { assert( - !new RegexCoverageFilter(Seq("scoverage"), Nil, Nil) + !new RegexCoverageFilter(Seq("scoverage"), Nil, Nil, reporter) .isClassIncluded("scoverage") ) } test("should include scoverage -> scoverageeee") { assert( - new RegexCoverageFilter(Seq("scoverage"), Nil, Nil) + new RegexCoverageFilter(Seq("scoverage"), Nil, Nil, reporter) .isClassIncluded("scoverageeee") ) } test("should exclude scoverage* -> scoverageeee") { assert( - !new RegexCoverageFilter(Seq("scoverage*"), Nil, Nil) + !new RegexCoverageFilter(Seq("scoverage*"), Nil, Nil, reporter) .isClassIncluded("scoverageeee") ) } test("should include eee -> scoverageeee") { assert( - new RegexCoverageFilter(Seq("eee"), Nil, Nil) + new RegexCoverageFilter(Seq("eee"), Nil, Nil, reporter) .isClassIncluded("scoverageeee") ) } test("should exclude .*eee -> scoverageeee") { assert( - !new RegexCoverageFilter(Seq(".*eee"), Nil, Nil) + !new RegexCoverageFilter(Seq(".*eee"), Nil, Nil, reporter) .isClassIncluded("scoverageeee") ) } @@ -56,13 +60,13 @@ class RegexCoverageFilterTest extends FunSuite { test("isFileIncluded should return true for empty excludes") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) - assert(new RegexCoverageFilter(Nil, Nil, Nil).isFileIncluded(file)) + assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isFileIncluded(file)) } test("should exclude by filename") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( - !new RegexCoverageFilter(Nil, Seq("sammy"), Nil) + !new RegexCoverageFilter(Nil, Seq("sammy\\.scala"), Nil, reporter) .isFileIncluded(file) ) } @@ -70,7 +74,7 @@ class RegexCoverageFilterTest extends FunSuite { test("should exclude by regex wildcard") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( - !new RegexCoverageFilter(Nil, Seq("sam.*"), Nil) + !new RegexCoverageFilter(Nil, Seq("sam.*"), Nil, reporter) .isFileIncluded(file) ) } @@ -78,7 +82,7 @@ class RegexCoverageFilterTest extends FunSuite { test("should not exclude non matching regex") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( - new RegexCoverageFilter(Nil, Seq("qweqeqwe"), Nil) + new RegexCoverageFilter(Nil, Seq("qweqeqwe"), Nil, reporter) .isFileIncluded(file) ) } @@ -86,61 +90,61 @@ class RegexCoverageFilterTest extends FunSuite { val options = ScoverageOptions.default() test("isSymbolIncluded should return true for empty excludes") { - assert(new RegexCoverageFilter(Nil, Nil, Nil).isSymbolIncluded("x")) + assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("x")) } test("should not crash for empty input") { - assert(new RegexCoverageFilter(Nil, Nil, Nil).isSymbolIncluded("")) + assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("")) } test("should exclude scoverage -> scoverage") { assert( - !new RegexCoverageFilter(Nil, Nil, Seq("scoverage")) + !new RegexCoverageFilter(Nil, Nil, Seq("scoverage"), reporter) .isSymbolIncluded("scoverage") ) } test("should include scoverage -> scoverageeee") { assert( - new RegexCoverageFilter(Nil, Nil, Seq("scoverage")) + new RegexCoverageFilter(Nil, Nil, Seq("scoverage"), reporter) .isSymbolIncluded("scoverageeee") ) } test("should exclude scoverage* -> scoverageeee") { assert( - !new RegexCoverageFilter(Nil, Nil, Seq("scoverage*")) + !new RegexCoverageFilter(Nil, Nil, Seq("scoverage*"), reporter) .isSymbolIncluded("scoverageeee") ) } test("should include eee -> scoverageeee") { assert( - new RegexCoverageFilter(Nil, Nil, Seq("eee")) + new RegexCoverageFilter(Nil, Nil, Seq("eee"), reporter) .isSymbolIncluded("scoverageeee") ) } test("should exclude .*eee -> scoverageeee") { assert( - !new RegexCoverageFilter(Nil, Nil, Seq(".*eee")) + !new RegexCoverageFilter(Nil, Nil, Seq(".*eee"), reporter) .isSymbolIncluded("scoverageeee") ) } test("should exclude scala.reflect.api.Exprs.Expr") { assert( - !new RegexCoverageFilter(Nil, Nil, options.excludedSymbols) + !new RegexCoverageFilter(Nil, Nil, options.excludedSymbols, reporter) .isSymbolIncluded("scala.reflect.api.Exprs.Expr") ) } test("should exclude scala.reflect.macros.Universe.Tree") { assert( - !new RegexCoverageFilter(Nil, Nil, options.excludedSymbols) + !new RegexCoverageFilter(Nil, Nil, options.excludedSymbols, reporter) .isSymbolIncluded("scala.reflect.macros.Universe.Tree") ) } test("should exclude scala.reflect.api.Trees.Tree") { assert( - !new RegexCoverageFilter(Nil, Nil, options.excludedSymbols) + !new RegexCoverageFilter(Nil, Nil, options.excludedSymbols, reporter) .isSymbolIncluded("scala.reflect.api.Trees.Tree") ) } @@ -158,7 +162,7 @@ class RegexCoverageFilterTest extends FunSuite { |8 """.stripMargin - val numbers = new RegexCoverageFilter(Nil, Nil, Nil) + val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter) .getExcludedLineNumbers(mockSourceFile(file)) assertEquals(numbers, List.empty) } @@ -182,7 +186,7 @@ class RegexCoverageFilterTest extends FunSuite { |16 """.stripMargin - val numbers = new RegexCoverageFilter(Nil, Nil, Nil) + val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter) .getExcludedLineNumbers(mockSourceFile(file)) assertEquals(numbers, List(Range(4, 9), Range(12, 14))) } @@ -205,7 +209,7 @@ class RegexCoverageFilterTest extends FunSuite { |15 """.stripMargin - val numbers = new RegexCoverageFilter(Nil, Nil, Nil) + val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter) .getExcludedLineNumbers(mockSourceFile(file)) assertEquals(numbers, List(Range(4, 9), Range(12, 16))) } @@ -228,7 +232,7 @@ class RegexCoverageFilterTest extends FunSuite { |15 """.stripMargin - val numbers = new RegexCoverageFilter(Nil, Nil, Nil) + val numbers = new RegexCoverageFilter(Nil, Nil, Nil, reporter) .getExcludedLineNumbers(mockSourceFile(file)) assertEquals(numbers, List(Range(4, 9), Range(12, 16))) } From d71c71c7b96a892ea0b999a7b82e08b2d39c2ab6 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Mon, 4 Jul 2022 09:06:41 +0100 Subject: [PATCH 4/9] Running scalafmt --- .../main/scala/scoverage/CoverageFilter.scala | 1 - .../main/scala/scoverage/ScoveragePlugin.scala | 3 ++- .../scoverage/RegexCoverageFilterTest.scala | 16 ++++++++++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/plugin/src/main/scala/scoverage/CoverageFilter.scala b/plugin/src/main/scala/scoverage/CoverageFilter.scala index b8ff5bd1..855828af 100644 --- a/plugin/src/main/scala/scoverage/CoverageFilter.scala +++ b/plugin/src/main/scala/scoverage/CoverageFilter.scala @@ -31,7 +31,6 @@ class RegexCoverageFilter( excludedFiles: Seq[String], excludedSymbols: Seq[String], reporter: Reporter - ) extends CoverageFilter { reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") reporter.echo(s"scoverage excludedFiles: ${excludedFiles}") diff --git a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala index 9510ab1f..c3f5d4c8 100644 --- a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala +++ b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala @@ -232,7 +232,8 @@ class ScoverageInstrumentationComponent( safeSource(tree) match { case None => reporter.warning( - NoPosition, s"Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]." + NoPosition, + s"Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]." ) tree case Some(source) => diff --git a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala index 804183ea..c5bbf90e 100644 --- a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala +++ b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala @@ -14,7 +14,9 @@ class RegexCoverageFilterTest extends FunSuite { val reporter = new ConsoleReporter(new Settings()) test("isClassIncluded should return true for empty excludes") { - assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isClassIncluded("x")) + assert( + new RegexCoverageFilter(Nil, Nil, Nil, reporter).isClassIncluded("x") + ) } test("should not crash for empty input") { @@ -60,7 +62,9 @@ class RegexCoverageFilterTest extends FunSuite { test("isFileIncluded should return true for empty excludes") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) - assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isFileIncluded(file)) + assert( + new RegexCoverageFilter(Nil, Nil, Nil, reporter).isFileIncluded(file) + ) } test("should exclude by filename") { @@ -90,11 +94,15 @@ class RegexCoverageFilterTest extends FunSuite { val options = ScoverageOptions.default() test("isSymbolIncluded should return true for empty excludes") { - assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("x")) + assert( + new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("x") + ) } test("should not crash for empty input") { - assert(new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("")) + assert( + new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("") + ) } test("should exclude scoverage -> scoverage") { From 81c7cf67c8f97c7cf5e7ed75f996fade8f46dcef Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Mon, 4 Jul 2022 13:56:47 +0100 Subject: [PATCH 5/9] PR feedback: Restore the current behaviour (for excludedFiles). --- README.md | 6 ++++-- plugin/src/main/scala/scoverage/CoverageFilter.scala | 8 ++++---- .../test/scala/scoverage/RegexCoverageFilterTest.scala | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bb619142..de07dabd 100644 --- a/README.md +++ b/README.md @@ -100,9 +100,11 @@ Any matched classes will not be instrumented or included in the coverage report. You can also exclude files from being considered for instrumentation. - -P:scoverage:excludedFiles:.*\/two\/GoodCoverage\.scala;.*\/three\/.* + -P:scoverage:excludedFiles:.*\/two\/GoodCoverage;.*\/three\/.* -Note: This only works for Scala2. Right now Scala3 does not support +Note: The `.scala` file extension needs to be omitted from the filename, if one is given. + +Note: These two options only work for Scala2. Right now Scala3 does not support a way to exclude packages or files from being instrumented. You can also mark sections of code with comments like: diff --git a/plugin/src/main/scala/scoverage/CoverageFilter.scala b/plugin/src/main/scala/scoverage/CoverageFilter.scala index 855828af..8efd4f86 100644 --- a/plugin/src/main/scala/scoverage/CoverageFilter.scala +++ b/plugin/src/main/scala/scoverage/CoverageFilter.scala @@ -32,9 +32,9 @@ class RegexCoverageFilter( excludedSymbols: Seq[String], reporter: Reporter ) extends CoverageFilter { - reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") - reporter.echo(s"scoverage excludedFiles: ${excludedFiles}") - reporter.echo(s"scoverage excludedSymbols: ${excludedSymbols}") + if (excludedPackages.nonEmpty) reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") + if (excludedFiles.nonEmpty) reporter.echo(s"scoverage excludedFiles: ${excludedFiles}") + if (excludedSymbols.nonEmpty) reporter.echo(s"scoverage excludedSymbols: ${excludedSymbols}") val excludedClassNamePatterns = excludedPackages.map(_.r.pattern) val excludedFilePatterns = excludedFiles.map(_.r.pattern) @@ -61,7 +61,7 @@ class RegexCoverageFilter( override def isFileIncluded(file: SourceFile): Boolean = { def isFileMatch(file: SourceFile) = excludedFilePatterns.exists( - _.matcher(file.path).matches + _.matcher(file.path.replace(".scala", "")).matches ) excludedFilePatterns.isEmpty || !isFileMatch(file) } diff --git a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala index c5bbf90e..eb429573 100644 --- a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala +++ b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala @@ -70,7 +70,7 @@ class RegexCoverageFilterTest extends FunSuite { test("should exclude by filename") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( - !new RegexCoverageFilter(Nil, Seq("sammy\\.scala"), Nil, reporter) + !new RegexCoverageFilter(Nil, Seq("sammy"), Nil, reporter) .isFileIncluded(file) ) } From 94f04b5fe74696ada24d6882a1a002686711f629 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Tue, 5 Jul 2022 09:11:07 +0100 Subject: [PATCH 6/9] Running scalafmt --- plugin/src/main/scala/scoverage/CoverageFilter.scala | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugin/src/main/scala/scoverage/CoverageFilter.scala b/plugin/src/main/scala/scoverage/CoverageFilter.scala index 8efd4f86..4d95bb01 100644 --- a/plugin/src/main/scala/scoverage/CoverageFilter.scala +++ b/plugin/src/main/scala/scoverage/CoverageFilter.scala @@ -32,9 +32,12 @@ class RegexCoverageFilter( excludedSymbols: Seq[String], reporter: Reporter ) extends CoverageFilter { - if (excludedPackages.nonEmpty) reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") - if (excludedFiles.nonEmpty) reporter.echo(s"scoverage excludedFiles: ${excludedFiles}") - if (excludedSymbols.nonEmpty) reporter.echo(s"scoverage excludedSymbols: ${excludedSymbols}") + if (excludedPackages.nonEmpty) + reporter.echo(s"scoverage excludedPackages: ${excludedPackages}") + if (excludedFiles.nonEmpty) + reporter.echo(s"scoverage excludedFiles: ${excludedFiles}") + if (excludedSymbols.nonEmpty) + reporter.echo(s"scoverage excludedSymbols: ${excludedSymbols}") val excludedClassNamePatterns = excludedPackages.map(_.r.pattern) val excludedFilePatterns = excludedFiles.map(_.r.pattern) From 8ffa9f6bff94f3cf920ddf9378533d5368636b78 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Tue, 5 Jul 2022 07:54:06 +0100 Subject: [PATCH 7/9] Add Coverage.remove() (to support coverageExclude). --- domain/src/main/scala/scoverage/domain/coverage.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/domain/src/main/scala/scoverage/domain/coverage.scala b/domain/src/main/scala/scoverage/domain/coverage.scala index a6b8764c..1bc60b6e 100644 --- a/domain/src/main/scala/scoverage/domain/coverage.scala +++ b/domain/src/main/scala/scoverage/domain/coverage.scala @@ -15,6 +15,7 @@ case class Coverage() private val statementsById = mutable.Map[Int, Statement]() override def statements = statementsById.values def add(stmt: Statement): Unit = statementsById.put(stmt.id, stmt) + def remove(id: Int): Unit = statementsById.remove(id) private val ignoredStatementsById = mutable.Map[Int, Statement]() override def ignoredStatements = ignoredStatementsById.values From 12b25f525818757232a71554725e88cd5254cf13 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Tue, 5 Jul 2022 07:55:26 +0100 Subject: [PATCH 8/9] Change RegexCoverage.isFileIncluded() to take a string ... ... (to support/to be used by coverageExclude) --- .../src/main/scala/scoverage/CoverageFilter.scala | 12 ++++++------ .../main/scala/scoverage/ScoveragePlugin.scala | 2 +- .../scala/scoverage/RegexCoverageFilterTest.scala | 15 +++++++++------ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/plugin/src/main/scala/scoverage/CoverageFilter.scala b/plugin/src/main/scala/scoverage/CoverageFilter.scala index 4d95bb01..a6db1108 100644 --- a/plugin/src/main/scala/scoverage/CoverageFilter.scala +++ b/plugin/src/main/scala/scoverage/CoverageFilter.scala @@ -12,7 +12,7 @@ import scala.util.matching.Regex */ trait CoverageFilter { def isClassIncluded(className: String): Boolean - def isFileIncluded(file: SourceFile): Boolean + def isFileIncluded(path: String): Boolean def isLineIncluded(position: Position): Boolean def isSymbolIncluded(symbolName: String): Boolean def getExcludedLineNumbers(sourceFile: SourceFile): List[Range] @@ -22,7 +22,7 @@ object AllCoverageFilter extends CoverageFilter { override def getExcludedLineNumbers(sourceFile: SourceFile): List[Range] = Nil override def isLineIncluded(position: Position): Boolean = true override def isClassIncluded(className: String): Boolean = true - override def isFileIncluded(file: SourceFile): Boolean = true + override def isFileIncluded(path: String): Boolean = true override def isSymbolIncluded(symbolName: String): Boolean = true } @@ -62,11 +62,11 @@ class RegexCoverageFilter( ) } - override def isFileIncluded(file: SourceFile): Boolean = { - def isFileMatch(file: SourceFile) = excludedFilePatterns.exists( - _.matcher(file.path.replace(".scala", "")).matches + override def isFileIncluded(path: String): Boolean = { + def isFileMatch(path: String) = excludedFilePatterns.exists( + _.matcher(path.replace(".scala", "")).matches ) - excludedFilePatterns.isEmpty || !isFileMatch(file) + excludedFilePatterns.isEmpty || !isFileMatch(path) } /** True if the line containing `position` has not been excluded by a magic comment. diff --git a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala index c3f5d4c8..dc8bceb3 100644 --- a/plugin/src/main/scala/scoverage/ScoveragePlugin.scala +++ b/plugin/src/main/scala/scoverage/ScoveragePlugin.scala @@ -353,7 +353,7 @@ class ScoverageInstrumentationComponent( def isClassIncluded(symbol: Symbol): Boolean = coverageFilter.isClassIncluded(symbol.fullNameString) def isFileIncluded(source: SourceFile): Boolean = - coverageFilter.isFileIncluded(source) + coverageFilter.isFileIncluded(source.path) def isStatementIncluded(pos: Position): Boolean = coverageFilter.isLineIncluded(pos) def isSymbolIncluded(symbol: Symbol): Boolean = diff --git a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala index eb429573..6fcc4f46 100644 --- a/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala +++ b/plugin/src/test/scala/scoverage/RegexCoverageFilterTest.scala @@ -63,7 +63,8 @@ class RegexCoverageFilterTest extends FunSuite { test("isFileIncluded should return true for empty excludes") { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( - new RegexCoverageFilter(Nil, Nil, Nil, reporter).isFileIncluded(file) + new RegexCoverageFilter(Nil, Nil, Nil, reporter) + .isFileIncluded(file.path) ) } @@ -71,7 +72,7 @@ class RegexCoverageFilterTest extends FunSuite { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( !new RegexCoverageFilter(Nil, Seq("sammy"), Nil, reporter) - .isFileIncluded(file) + .isFileIncluded(file.path) ) } @@ -79,7 +80,7 @@ class RegexCoverageFilterTest extends FunSuite { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( !new RegexCoverageFilter(Nil, Seq("sam.*"), Nil, reporter) - .isFileIncluded(file) + .isFileIncluded(file.path) ) } @@ -87,7 +88,7 @@ class RegexCoverageFilterTest extends FunSuite { val file = new BatchSourceFile(abstractFile, Array.emptyCharArray) assert( new RegexCoverageFilter(Nil, Seq("qweqeqwe"), Nil, reporter) - .isFileIncluded(file) + .isFileIncluded(file.path) ) } @@ -95,13 +96,15 @@ class RegexCoverageFilterTest extends FunSuite { test("isSymbolIncluded should return true for empty excludes") { assert( - new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("x") + new RegexCoverageFilter(Nil, Nil, Nil, reporter) + .isSymbolIncluded("x") ) } test("should not crash for empty input") { assert( - new RegexCoverageFilter(Nil, Nil, Nil, reporter).isSymbolIncluded("") + new RegexCoverageFilter(Nil, Nil, Nil, reporter) + .isSymbolIncluded("") ) } From cbc0120bdb1632921e96c06923fbba5d010a1ca3 Mon Sep 17 00:00:00 2001 From: Roland Tritsch Date: Tue, 5 Jul 2022 09:49:27 +0100 Subject: [PATCH 9/9] Fixing minor broken window. Rename coverage.scala. --- .../scala/scoverage/domain/{coverage.scala => Coverage.scala} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename domain/src/main/scala/scoverage/domain/{coverage.scala => Coverage.scala} (100%) diff --git a/domain/src/main/scala/scoverage/domain/coverage.scala b/domain/src/main/scala/scoverage/domain/Coverage.scala similarity index 100% rename from domain/src/main/scala/scoverage/domain/coverage.scala rename to domain/src/main/scala/scoverage/domain/Coverage.scala