From c1f2022862ad590ba1359c00fea8ab051e95bf9c Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Sat, 17 Feb 2024 01:04:02 +0100 Subject: [PATCH 1/6] Port coverage filter options - Add `-coverage-exclude-packages` option that excludes packages and classes from generating coverage - Add `-coverage-exclude-files` option that excludes files from generating coverage --- .../tools/dotc/config/ScalaSettings.scala | 2 ++ .../dotc/transform/InstrumentCoverage.scala | 27 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala index cb6d0bdab424..06fddac63df6 100644 --- a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala +++ b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala @@ -127,6 +127,8 @@ trait CommonScalaSettings: /* Coverage settings */ val coverageOutputDir = PathSetting("-coverage-out", "Destination for coverage classfiles and instrumentation data.", "", aliases = List("--coverage-out")) + val coverageExcludePackages: Setting[List[String]] = MultiStringSetting("-coverage-exclude-packages", "packages", "Semicolon separated list of regexes for packages to exclude from coverage.", aliases = List("--coverage-exclude-packages")) + val coverageExcludeFiles: Setting[List[String]] = MultiStringSetting("-coverage-exclude-files", "files", "Semicolon separated list of regexes for files to exclude from coverage.", aliases = List("--coverage-exclude-files")) /* Other settings */ val encoding: Setting[String] = StringSetting("-encoding", "encoding", "Specify character encoding used by source files.", Properties.sourceEncoding, aliases = List("--encoding")) diff --git a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala index eac44e982603..c759f0ad3734 100644 --- a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala +++ b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala @@ -13,12 +13,14 @@ import core.Constants.Constant import core.NameOps.isContextFunction import core.StdNames.nme import core.Types.* +import core.Decorators.* import coverage.* import typer.LiftCoverage import util.{SourcePosition, SourceFile} import util.Spans.Span import localopt.StringInterpolatorOpt import inlines.Inlines +import scala.util.matching.Regex /** Implements code coverage by inserting calls to scala.runtime.coverage.Invoker * ("instruments" the source code). @@ -58,6 +60,18 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: Serializer.serialize(coverage, outputPath, ctx.settings.sourceroot.value) + private def isClassIncluded(sym: Symbol)(using Context): Boolean = + val excludedClassNamePatterns = ctx.settings.coverageExcludePackages.value.map(_.r.pattern) + excludedClassNamePatterns.isEmpty || !excludedClassNamePatterns.exists( + _.matcher(sym.fullName.toText(ctx.printerFn(ctx)).show).nn.matches + ) + + private def isFileIncluded(file: SourceFile)(using Context): Boolean = + val excludedFilePatterns = ctx.settings.coverageExcludeFiles.value.map(_.r.pattern) + excludedFilePatterns.isEmpty || !excludedFilePatterns.exists( + _.matcher(file.path.replace(".scala", "")).nn.matches + ) + override protected def newTransformer(using Context) = CoverageTransformer(ctx.settings.coverageOutputDir.value) @@ -269,8 +283,17 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: transformDefDef(tree) case tree: PackageDef => - // only transform the statements of the package - cpy.PackageDef(tree)(tree.pid, transform(tree.stats)) + if (isFileIncluded(tree.srcPos.sourcePos.source) && isClassIncluded(tree.symbol)) + // only transform the statements of the package + cpy.PackageDef(tree)(tree.pid, transform(tree.stats)) + else + tree + + case tree: TypeDef => + if (isFileIncluded(tree.srcPos.sourcePos.source) && isClassIncluded(tree.symbol)) + super.transform(tree) + else + tree case tree: Assign => // only transform the rhs From 7affcee006bf26be59ebed98482b9551c9c1afda Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Sat, 17 Feb 2024 16:00:59 +0100 Subject: [PATCH 2/6] Add tests for coverage filters --- .gitignore | 4 -- .../tools/dotc/config/ScalaSettings.scala | 4 +- tests/coverage/pos/ExcludeClass.scala | 19 +++++ .../coverage/pos/ExcludeClass.scoverage.check | 71 +++++++++++++++++++ tests/coverage/pos/ExcludeDef.scala | 9 +++ tests/coverage/pos/ExcludeDef.scoverage.check | 20 ++++++ tests/coverage/pos/ExcludeFile.scala | 11 +++ .../coverage/pos/ExcludeFile.scoverage.check | 20 ++++++ tests/coverage/pos/ExcludeOtherStuff.scala | 15 ++++ .../pos/ExcludeOtherStuff.scoverage.check | 20 ++++++ tests/coverage/pos/ExcludePackage.scala | 11 +++ .../pos/ExcludePackage.scoverage.check | 20 ++++++ 12 files changed, 218 insertions(+), 6 deletions(-) create mode 100644 tests/coverage/pos/ExcludeClass.scala create mode 100644 tests/coverage/pos/ExcludeClass.scoverage.check create mode 100644 tests/coverage/pos/ExcludeDef.scala create mode 100644 tests/coverage/pos/ExcludeDef.scoverage.check create mode 100644 tests/coverage/pos/ExcludeFile.scala create mode 100644 tests/coverage/pos/ExcludeFile.scoverage.check create mode 100644 tests/coverage/pos/ExcludeOtherStuff.scala create mode 100644 tests/coverage/pos/ExcludeOtherStuff.scoverage.check create mode 100644 tests/coverage/pos/ExcludePackage.scala create mode 100644 tests/coverage/pos/ExcludePackage.scoverage.check diff --git a/.gitignore b/.gitignore index 3d44cdefb941..0fc39ecbae5b 100644 --- a/.gitignore +++ b/.gitignore @@ -99,7 +99,3 @@ docs/_spec/.jekyll-metadata # scaladoc related scaladoc/output/ - -#coverage -coverage/ - diff --git a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala index 06fddac63df6..3b13ad8d74e2 100644 --- a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala +++ b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala @@ -127,8 +127,8 @@ trait CommonScalaSettings: /* Coverage settings */ val coverageOutputDir = PathSetting("-coverage-out", "Destination for coverage classfiles and instrumentation data.", "", aliases = List("--coverage-out")) - val coverageExcludePackages: Setting[List[String]] = MultiStringSetting("-coverage-exclude-packages", "packages", "Semicolon separated list of regexes for packages to exclude from coverage.", aliases = List("--coverage-exclude-packages")) - val coverageExcludeFiles: Setting[List[String]] = MultiStringSetting("-coverage-exclude-files", "files", "Semicolon separated list of regexes for files to exclude from coverage.", aliases = List("--coverage-exclude-files")) + val coverageExcludePackages: Setting[List[String]] = MultiStringSetting("-coverage-exclude-packages", "packages", "List of regexes for packages to exclude from coverage.", aliases = List("--coverage-exclude-packages")) + val coverageExcludeFiles: Setting[List[String]] = MultiStringSetting("-coverage-exclude-files", "files", "List of regexes for files to exclude from coverage.", aliases = List("--coverage-exclude-files")) /* Other settings */ val encoding: Setting[String] = StringSetting("-encoding", "encoding", "Specify character encoding used by source files.", Properties.sourceEncoding, aliases = List("--encoding")) diff --git a/tests/coverage/pos/ExcludeClass.scala b/tests/coverage/pos/ExcludeClass.scala new file mode 100644 index 000000000000..d0832380cbb0 --- /dev/null +++ b/tests/coverage/pos/ExcludeClass.scala @@ -0,0 +1,19 @@ +//> using options -coverage-exclude-packages:covtest.Klass + +package covtest + +class Klass { + def abs(i: Int) = + if i > 0 then + i + else + -i +} + +class Klass2 { + def abs(i: Int) = + if i > 0 then + i + else + -i +} diff --git a/tests/coverage/pos/ExcludeClass.scoverage.check b/tests/coverage/pos/ExcludeClass.scoverage.check new file mode 100644 index 000000000000..2e4cec37066b --- /dev/null +++ b/tests/coverage/pos/ExcludeClass.scoverage.check @@ -0,0 +1,71 @@ +# Coverage data, format version: 3.0 +# Statement data: +# - id +# - source path +# - package name +# - class name +# - class type (Class, Object or Trait) +# - full class name +# - method name +# - start offset +# - end offset +# - line number +# - symbol name +# - tree name +# - is branch +# - invocations count +# - is ignored +# - description (can be multi-line) +# ' ' sign +# ------------------------------------------ +0 +ExcludeClass.scala +covtest +Klass2 +Class +covtest.Klass2 +abs +217 +218 +16 +i +Ident +true +0 +false +i + +1 +ExcludeClass.scala +covtest +Klass2 +Class +covtest.Klass2 +abs +234 +236 +18 +unary_- +Select +true +0 +false +-i + +2 +ExcludeClass.scala +covtest +Klass2 +Class +covtest.Klass2 +abs +175 +182 +14 +abs +DefDef +false +0 +false +def abs + diff --git a/tests/coverage/pos/ExcludeDef.scala b/tests/coverage/pos/ExcludeDef.scala new file mode 100644 index 000000000000..b1e414c4e605 --- /dev/null +++ b/tests/coverage/pos/ExcludeDef.scala @@ -0,0 +1,9 @@ +//> using options -coverage-exclude-packages:covtest\..* + +package covtest + +def abs(i: Int) = + if i > 0 then + i + else + -i diff --git a/tests/coverage/pos/ExcludeDef.scoverage.check b/tests/coverage/pos/ExcludeDef.scoverage.check new file mode 100644 index 000000000000..1bdba951d6ae --- /dev/null +++ b/tests/coverage/pos/ExcludeDef.scoverage.check @@ -0,0 +1,20 @@ +# Coverage data, format version: 3.0 +# Statement data: +# - id +# - source path +# - package name +# - class name +# - class type (Class, Object or Trait) +# - full class name +# - method name +# - start offset +# - end offset +# - line number +# - symbol name +# - tree name +# - is branch +# - invocations count +# - is ignored +# - description (can be multi-line) +# ' ' sign +# ------------------------------------------ diff --git a/tests/coverage/pos/ExcludeFile.scala b/tests/coverage/pos/ExcludeFile.scala new file mode 100644 index 000000000000..b9f15244ebe3 --- /dev/null +++ b/tests/coverage/pos/ExcludeFile.scala @@ -0,0 +1,11 @@ +//> using options -coverage-exclude-files:.*ExcludeFile + +package covtest + +class Klass { + def abs(i: Int) = + if i > 0 then + i + else + -i +} diff --git a/tests/coverage/pos/ExcludeFile.scoverage.check b/tests/coverage/pos/ExcludeFile.scoverage.check new file mode 100644 index 000000000000..1bdba951d6ae --- /dev/null +++ b/tests/coverage/pos/ExcludeFile.scoverage.check @@ -0,0 +1,20 @@ +# Coverage data, format version: 3.0 +# Statement data: +# - id +# - source path +# - package name +# - class name +# - class type (Class, Object or Trait) +# - full class name +# - method name +# - start offset +# - end offset +# - line number +# - symbol name +# - tree name +# - is branch +# - invocations count +# - is ignored +# - description (can be multi-line) +# ' ' sign +# ------------------------------------------ diff --git a/tests/coverage/pos/ExcludeOtherStuff.scala b/tests/coverage/pos/ExcludeOtherStuff.scala new file mode 100644 index 000000000000..22f3c55e498c --- /dev/null +++ b/tests/coverage/pos/ExcludeOtherStuff.scala @@ -0,0 +1,15 @@ +//> using options -coverage-exclude-packages:covtest.Oject,covtest.Tait + +package covtest + +object Oject { + def abs(i: Int) = + if i > 0 then + i + else + -i +} + +trait Tait { + def abs(i: Int): Int +} diff --git a/tests/coverage/pos/ExcludeOtherStuff.scoverage.check b/tests/coverage/pos/ExcludeOtherStuff.scoverage.check new file mode 100644 index 000000000000..1bdba951d6ae --- /dev/null +++ b/tests/coverage/pos/ExcludeOtherStuff.scoverage.check @@ -0,0 +1,20 @@ +# Coverage data, format version: 3.0 +# Statement data: +# - id +# - source path +# - package name +# - class name +# - class type (Class, Object or Trait) +# - full class name +# - method name +# - start offset +# - end offset +# - line number +# - symbol name +# - tree name +# - is branch +# - invocations count +# - is ignored +# - description (can be multi-line) +# ' ' sign +# ------------------------------------------ diff --git a/tests/coverage/pos/ExcludePackage.scala b/tests/coverage/pos/ExcludePackage.scala new file mode 100644 index 000000000000..79f854447727 --- /dev/null +++ b/tests/coverage/pos/ExcludePackage.scala @@ -0,0 +1,11 @@ +//> using options -coverage-exclude-packages:covtest + +package covtest + +class Klass { + def abs(i: Int) = + if i > 0 then + i + else + -i +} diff --git a/tests/coverage/pos/ExcludePackage.scoverage.check b/tests/coverage/pos/ExcludePackage.scoverage.check new file mode 100644 index 000000000000..1bdba951d6ae --- /dev/null +++ b/tests/coverage/pos/ExcludePackage.scoverage.check @@ -0,0 +1,20 @@ +# Coverage data, format version: 3.0 +# Statement data: +# - id +# - source path +# - package name +# - class name +# - class type (Class, Object or Trait) +# - full class name +# - method name +# - start offset +# - end offset +# - line number +# - symbol name +# - tree name +# - is branch +# - invocations count +# - is ignored +# - description (can be multi-line) +# ' ' sign +# ------------------------------------------ From c01baeac783870ef5df65d75e9c2061572fafd33 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Thu, 22 Feb 2024 17:38:42 +0100 Subject: [PATCH 3/6] Change the -coverage-exclude-classlikes option and its doc --- .../src/dotty/tools/dotc/config/ScalaSettings.scala | 2 +- .../tools/dotc/transform/InstrumentCoverage.scala | 2 +- tests/coverage/pos/ExcludeClass.scala | 2 +- tests/coverage/pos/ExcludeClass.scoverage.check | 10 +++++----- tests/coverage/pos/ExcludeDef.scala | 2 +- tests/coverage/pos/ExcludeOtherStuff.scala | 2 +- tests/coverage/pos/ExcludePackage.scala | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala index 3b13ad8d74e2..f684f7bbabe2 100644 --- a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala +++ b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala @@ -127,7 +127,7 @@ trait CommonScalaSettings: /* Coverage settings */ val coverageOutputDir = PathSetting("-coverage-out", "Destination for coverage classfiles and instrumentation data.", "", aliases = List("--coverage-out")) - val coverageExcludePackages: Setting[List[String]] = MultiStringSetting("-coverage-exclude-packages", "packages", "List of regexes for packages to exclude from coverage.", aliases = List("--coverage-exclude-packages")) + val coverageExcludeClasslikes: Setting[List[String]] = MultiStringSetting("-coverage-exclude-classlikes", "packages, clesses and modules", "List of regexes for packages, classes and modules to exclude from coverage.", aliases = List("--coverage-exclude-classlikes")) val coverageExcludeFiles: Setting[List[String]] = MultiStringSetting("-coverage-exclude-files", "files", "List of regexes for files to exclude from coverage.", aliases = List("--coverage-exclude-files")) /* Other settings */ diff --git a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala index c759f0ad3734..aa3b48e53f35 100644 --- a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala +++ b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala @@ -61,7 +61,7 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: Serializer.serialize(coverage, outputPath, ctx.settings.sourceroot.value) private def isClassIncluded(sym: Symbol)(using Context): Boolean = - val excludedClassNamePatterns = ctx.settings.coverageExcludePackages.value.map(_.r.pattern) + val excludedClassNamePatterns = ctx.settings.coverageExcludeClasslikes.value.map(_.r.pattern) excludedClassNamePatterns.isEmpty || !excludedClassNamePatterns.exists( _.matcher(sym.fullName.toText(ctx.printerFn(ctx)).show).nn.matches ) diff --git a/tests/coverage/pos/ExcludeClass.scala b/tests/coverage/pos/ExcludeClass.scala index d0832380cbb0..a73a8ed34e71 100644 --- a/tests/coverage/pos/ExcludeClass.scala +++ b/tests/coverage/pos/ExcludeClass.scala @@ -1,4 +1,4 @@ -//> using options -coverage-exclude-packages:covtest.Klass +//> using options -coverage-exclude-classlikes:covtest.Klass package covtest diff --git a/tests/coverage/pos/ExcludeClass.scoverage.check b/tests/coverage/pos/ExcludeClass.scoverage.check index 2e4cec37066b..5e77f0ce21a1 100644 --- a/tests/coverage/pos/ExcludeClass.scoverage.check +++ b/tests/coverage/pos/ExcludeClass.scoverage.check @@ -25,8 +25,8 @@ Klass2 Class covtest.Klass2 abs -217 -218 +219 +220 16 i Ident @@ -42,8 +42,8 @@ Klass2 Class covtest.Klass2 abs -234 236 +238 18 unary_- Select @@ -59,8 +59,8 @@ Klass2 Class covtest.Klass2 abs -175 -182 +177 +184 14 abs DefDef diff --git a/tests/coverage/pos/ExcludeDef.scala b/tests/coverage/pos/ExcludeDef.scala index b1e414c4e605..bddbe12022ef 100644 --- a/tests/coverage/pos/ExcludeDef.scala +++ b/tests/coverage/pos/ExcludeDef.scala @@ -1,4 +1,4 @@ -//> using options -coverage-exclude-packages:covtest\..* +//> using options -coverage-exclude-classlikes:covtest\..* package covtest diff --git a/tests/coverage/pos/ExcludeOtherStuff.scala b/tests/coverage/pos/ExcludeOtherStuff.scala index 22f3c55e498c..6a333560c59e 100644 --- a/tests/coverage/pos/ExcludeOtherStuff.scala +++ b/tests/coverage/pos/ExcludeOtherStuff.scala @@ -1,4 +1,4 @@ -//> using options -coverage-exclude-packages:covtest.Oject,covtest.Tait +//> using options -coverage-exclude-classlikes:covtest.Oject,covtest.Tait package covtest diff --git a/tests/coverage/pos/ExcludePackage.scala b/tests/coverage/pos/ExcludePackage.scala index 79f854447727..771ac2c1f062 100644 --- a/tests/coverage/pos/ExcludePackage.scala +++ b/tests/coverage/pos/ExcludePackage.scala @@ -1,4 +1,4 @@ -//> using options -coverage-exclude-packages:covtest +//> using options -coverage-exclude-classlikes:covtest package covtest From 8f375fc25f46179348418eceab0df6212fabfec4 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Sun, 25 Feb 2024 21:18:03 +0100 Subject: [PATCH 4/6] Update typo in coverageExcludeClasslikes doc Co-authored-by: Guillaume Raffin --- compiler/src/dotty/tools/dotc/config/ScalaSettings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala index f684f7bbabe2..3dafedd8e2e0 100644 --- a/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala +++ b/compiler/src/dotty/tools/dotc/config/ScalaSettings.scala @@ -127,7 +127,7 @@ trait CommonScalaSettings: /* Coverage settings */ val coverageOutputDir = PathSetting("-coverage-out", "Destination for coverage classfiles and instrumentation data.", "", aliases = List("--coverage-out")) - val coverageExcludeClasslikes: Setting[List[String]] = MultiStringSetting("-coverage-exclude-classlikes", "packages, clesses and modules", "List of regexes for packages, classes and modules to exclude from coverage.", aliases = List("--coverage-exclude-classlikes")) + val coverageExcludeClasslikes: Setting[List[String]] = MultiStringSetting("-coverage-exclude-classlikes", "packages, classes and modules", "List of regexes for packages, classes and modules to exclude from coverage.", aliases = List("--coverage-exclude-classlikes")) val coverageExcludeFiles: Setting[List[String]] = MultiStringSetting("-coverage-exclude-files", "files", "List of regexes for files to exclude from coverage.", aliases = List("--coverage-exclude-files")) /* Other settings */ From 5223adb474d755e1db50a79322e169388e44222c Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Sun, 25 Feb 2024 22:15:48 +0100 Subject: [PATCH 5/6] Pre compute coverage filter patterns --- .../dotc/transform/InstrumentCoverage.scala | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala index aa3b48e53f35..a39a1c6f591e 100644 --- a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala +++ b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala @@ -21,6 +21,7 @@ import util.Spans.Span import localopt.StringInterpolatorOpt import inlines.Inlines import scala.util.matching.Regex +import java.util.regex.Pattern /** Implements code coverage by inserting calls to scala.runtime.coverage.Invoker * ("instruments" the source code). @@ -43,6 +44,9 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: // stores all instrumented statements private val coverage = Coverage() + private var coverageExcludeClasslikePatterns: List[Pattern] = Nil + private var coverageExcludeFilePatterns: List[Pattern] = Nil + override def run(using ctx: Context): Unit = val outputPath = ctx.settings.coverageOutputDir.value @@ -56,19 +60,21 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: .filter(_.nn.getName.nn.startsWith("scoverage")) .foreach(_.nn.delete()) end if + + coverageExcludeClasslikePatterns = ctx.settings.coverageExcludeClasslikes.value.map(_.r.pattern) + coverageExcludeFilePatterns = ctx.settings.coverageExcludeFiles.value.map(_.r.pattern) + super.run Serializer.serialize(coverage, outputPath, ctx.settings.sourceroot.value) private def isClassIncluded(sym: Symbol)(using Context): Boolean = - val excludedClassNamePatterns = ctx.settings.coverageExcludeClasslikes.value.map(_.r.pattern) - excludedClassNamePatterns.isEmpty || !excludedClassNamePatterns.exists( + coverageExcludeClasslikePatterns.isEmpty || !coverageExcludeClasslikePatterns.exists( _.matcher(sym.fullName.toText(ctx.printerFn(ctx)).show).nn.matches ) private def isFileIncluded(file: SourceFile)(using Context): Boolean = - val excludedFilePatterns = ctx.settings.coverageExcludeFiles.value.map(_.r.pattern) - excludedFilePatterns.isEmpty || !excludedFilePatterns.exists( + coverageExcludeFilePatterns.isEmpty || !coverageExcludeFilePatterns.exists( _.matcher(file.path.replace(".scala", "")).nn.matches ) @@ -283,14 +289,14 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: transformDefDef(tree) case tree: PackageDef => - if (isFileIncluded(tree.srcPos.sourcePos.source) && isClassIncluded(tree.symbol)) + if isFileIncluded(tree.srcPos.sourcePos.source) && isClassIncluded(tree.symbol) then // only transform the statements of the package cpy.PackageDef(tree)(tree.pid, transform(tree.stats)) else tree case tree: TypeDef => - if (isFileIncluded(tree.srcPos.sourcePos.source) && isClassIncluded(tree.symbol)) + if isFileIncluded(tree.srcPos.sourcePos.source) && isClassIncluded(tree.symbol) then super.transform(tree) else tree From 641f5db8383a8570748d916ea82f76fcc136aaf5 Mon Sep 17 00:00:00 2001 From: Kacper Korban Date: Tue, 27 Feb 2024 11:15:01 +0100 Subject: [PATCH 6/6] Apply review suggestions to coverage filter checking --- .../src/dotty/tools/dotc/transform/InstrumentCoverage.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala index a39a1c6f591e..a76919e47164 100644 --- a/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala +++ b/compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala @@ -69,13 +69,15 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer: Serializer.serialize(coverage, outputPath, ctx.settings.sourceroot.value) private def isClassIncluded(sym: Symbol)(using Context): Boolean = + val fqn = sym.fullName.toText(ctx.printerFn(ctx)).show coverageExcludeClasslikePatterns.isEmpty || !coverageExcludeClasslikePatterns.exists( - _.matcher(sym.fullName.toText(ctx.printerFn(ctx)).show).nn.matches + _.matcher(fqn).nn.matches ) private def isFileIncluded(file: SourceFile)(using Context): Boolean = + val normalizedPath = file.path.replace(".scala", "") coverageExcludeFilePatterns.isEmpty || !coverageExcludeFilePatterns.exists( - _.matcher(file.path.replace(".scala", "")).nn.matches + _.matcher(normalizedPath).nn.matches ) override protected def newTransformer(using Context) =