Skip to content

Commit 6888f11

Browse files
committed
Filter out statements not in source roots
1 parent f649e50 commit 6888f11

File tree

4 files changed

+51
-16
lines changed

4 files changed

+51
-16
lines changed

scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala

+32-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ package scoverage.report
22

33
import java.io.File
44

5-
class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) {
5+
import scoverage.Coverage
6+
7+
class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean) {
68

79
// Source paths in canonical form WITH trailing file separator
810
private val formattedSourcePaths: Seq[String] = sourceDirectories filter ( _.isDirectory ) map ( _.getCanonicalPath + File.separator )
911

1012
/**
1113
* Converts absolute path to relative one if any of the source directories is it's parent.
1214
* If there is no parent directory, the path is returned unchanged (absolute).
13-
*
15+
*
1416
* @param src absolute file path in canonical form
1517
*/
1618
def relativeSource(src: String): String = relativeSource(src, formattedSourcePaths)
@@ -27,4 +29,32 @@ class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) {
2729
}
2830
}
2931

32+
def preprocessCoverage(coverage: Coverage): Coverage = {
33+
if (ignoreStatementsNotInSrcDirs)
34+
filteredCoverage(coverage)
35+
else
36+
coverage
37+
}
38+
39+
/**
40+
* Filters out statements not in source roots
41+
* @return new Coverage instance with statements whose src paths are in root source paths.
42+
*/
43+
private def filteredCoverage(coverage: Coverage): Coverage = {
44+
val filteredCoverage = Coverage()
45+
coverage.statements.foreach { stmt =>
46+
if (isInSourceRoots(stmt.source))
47+
filteredCoverage.add(stmt)
48+
}
49+
coverage.ignoredStatements.foreach { stmt =>
50+
if (isInSourceRoots(stmt.source))
51+
filteredCoverage.addIgnoredStatement(stmt)
52+
}
53+
filteredCoverage
54+
}
55+
56+
private def isInSourceRoots(src: String): Boolean = {
57+
formattedSourcePaths.exists(sourcePath => src.startsWith(sourcePath))
58+
}
59+
3060
}

scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@ import scoverage._
88
import scala.xml.{Node, PrettyPrinter}
99

1010
/** @author Stephen Samuel */
11-
class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends BaseReportWriter(sourceDirectories, outputDir) {
11+
class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean)
12+
extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) {
1213

13-
def this (baseDir: File, outputDir: File) {
14-
this(Seq(baseDir), outputDir)
14+
def this (baseDir: File, outputDir: File, ignoreStatementsNotInSrcDirs: Boolean = false) {
15+
this(Seq(baseDir), outputDir, ignoreStatementsNotInSrcDirs)
1516
}
1617

1718
def write(coverage: Coverage): Unit = {
1819
val file = new File(outputDir, "cobertura.xml")
1920
IOUtils.writeToFile(file, "<?xml version=\"1.0\"?>\n<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/coverage-04.dtd\">\n" +
20-
new PrettyPrinter(120, 4).format(xml(coverage)))
21+
new PrettyPrinter(120, 4).format(xml(preprocessCoverage(coverage))))
2122
}
2223

2324
def method(method: MeasuredMethod): Node = {

scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala

+9-6
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import scoverage._
88
import scala.xml.Node
99

1010
/** @author Stephen Samuel */
11-
class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String]) extends BaseReportWriter(sourceDirectories, outputDir) {
11+
class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String], ignoreStatementsNotInSrcDirs: Boolean)
12+
extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) {
1213

1314
// for backward compatibility only
14-
def this (sourceDirectories: Seq[File], outputDir: File) {
15-
this(sourceDirectories, outputDir, None);
15+
def this (sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean = false) {
16+
this(sourceDirectories, outputDir, None, ignoreStatementsNotInSrcDirs)
1617
}
1718

1819
// for backward compatibility only
@@ -21,16 +22,18 @@ class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceE
2122
}
2223

2324
def write(coverage: Coverage): Unit = {
25+
val preprocessedCoverage = preprocessCoverage(coverage)
26+
2427
val indexFile = new File(outputDir.getAbsolutePath + "/index.html")
2528
val packageFile = new File(outputDir.getAbsolutePath + "/packages.html")
2629
val overviewFile = new File(outputDir.getAbsolutePath + "/overview.html")
2730

2831
val index = IOUtils.readStreamAsString(getClass.getResourceAsStream("/scoverage/index.html"))
2932
IOUtils.writeToFile(indexFile, index)
30-
IOUtils.writeToFile(packageFile, packageList(coverage).toString())
31-
IOUtils.writeToFile(overviewFile, overview(coverage).toString())
33+
IOUtils.writeToFile(packageFile, packageList(preprocessedCoverage).toString())
34+
IOUtils.writeToFile(overviewFile, overview(preprocessedCoverage).toString())
3235

33-
coverage.packages.foreach(writePackage)
36+
preprocessedCoverage.packages.foreach(writePackage)
3437
}
3538

3639
private def writePackage(pkg: MeasuredPackage): Unit = {

scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ import scoverage._
77
import scala.xml.{Node, PrettyPrinter}
88

99
/** @author Stephen Samuel */
10-
class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: Boolean) extends BaseReportWriter(sourceDirectories, outputDir) {
10+
class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: Boolean, ignoreStatementsNotInSrcDirs: Boolean)
11+
extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) {
1112

12-
def this (sourceDir: File, outputDir: File, debug: Boolean) {
13-
this(Seq(sourceDir), outputDir, debug)
13+
def this (sourceDir: File, outputDir: File, debug: Boolean, ignoreStatementsNotInSrcDirs: Boolean = false) {
14+
this(Seq(sourceDir), outputDir, debug, ignoreStatementsNotInSrcDirs)
1415
}
1516

1617
def write(coverage: Coverage): Unit = {
1718
val file = IOUtils.reportFile(outputDir, debug)
18-
IOUtils.writeToFile(file, new PrettyPrinter(120, 4).format(xml(coverage)))
19+
IOUtils.writeToFile(file, new PrettyPrinter(120, 4).format(xml(preprocessCoverage(coverage))))
1920
}
2021

2122
private def xml(coverage: Coverage): Node = {

0 commit comments

Comments
 (0)