@@ -11,6 +11,7 @@ import scala.reflect.internal.util.Position
1111 */
1212trait CoverageFilter {
1313 def isClassIncluded (className : String ): Boolean
14+ def isFileIncluded (file : SourceFile ): Boolean
1415 def isLineIncluded (position : Position ): Boolean
1516 def getExcludedLineNumbers (sourceFile : SourceFile ): List [Range ]
1617}
@@ -19,18 +20,21 @@ object AllCoverageFilter extends CoverageFilter {
1920 override def getExcludedLineNumbers (sourceFile : SourceFile ): List [Range ] = Nil
2021 override def isLineIncluded (position : Position ): Boolean = true
2122 override def isClassIncluded (className : String ): Boolean = true
23+ override def isFileIncluded (file : SourceFile ): Boolean = true
2224}
2325
24- class RegexCoverageFilter (excludedPackages : Seq [String ]) extends CoverageFilter {
26+ class RegexCoverageFilter (excludedPackages : Seq [String ],
27+ excludedFiles : Seq [String ]) extends CoverageFilter {
2528
2629 val excludedClassNamePatterns = excludedPackages.map(_.r.pattern)
30+ val excludedFilePatterns = excludedFiles.map(_.r.pattern)
31+
2732 /**
2833 * We cache the excluded ranges to avoid scanning the source code files
2934 * repeatedly. For a large project there might be a lot of source code
3035 * data, so we only hold a weak reference.
3136 */
32- val linesExcludedByScoverageCommentsCache : mutable.Map [SourceFile , List [Range ]] =
33- mutable.WeakHashMap .empty
37+ val linesExcludedByScoverageCommentsCache : mutable.Map [SourceFile , List [Range ]] = mutable.WeakHashMap .empty
3438
3539 final val scoverageExclusionCommentsRegex =
3640 """ (?ms)^\s*//\s*(\$COVERAGE-OFF\$).*?(^\s*//\s*\$COVERAGE-ON\$|\Z)""" .r
@@ -39,9 +43,13 @@ class RegexCoverageFilter(excludedPackages: Seq[String]) extends CoverageFilter
3943 * True if the given className has not been excluded by the
4044 * `excludedPackages` option.
4145 */
42- def isClassIncluded (className : String ): Boolean = {
43- excludedClassNamePatterns.isEmpty ||
44- ! excludedClassNamePatterns.exists(_.matcher(className).matches)
46+ override def isClassIncluded (className : String ): Boolean = {
47+ excludedClassNamePatterns.isEmpty || ! excludedClassNamePatterns.exists(_.matcher(className).matches)
48+ }
49+
50+ override def isFileIncluded (file : SourceFile ): Boolean = {
51+ def isFileMatch (file: SourceFile ) = excludedFilePatterns.exists(_.matcher(file.path).matches)
52+ excludedFilePatterns.isEmpty || ! isFileMatch(file)
4553 }
4654
4755 /**
0 commit comments