From 6888f1119408d4082976227aff88206de3d57bf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Batko?= Date: Thu, 12 May 2016 14:24:15 +0200 Subject: [PATCH] Filter out statements not in source roots --- .../scoverage/report/BaseReportWriter.scala | 34 +++++++++++++++++-- .../scoverage/report/CoberturaXmlWriter.scala | 9 ++--- .../report/ScoverageHtmlWriter.scala | 15 ++++---- .../scoverage/report/ScoverageXmlWriter.scala | 9 ++--- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala index e16d133b..c40df32f 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/BaseReportWriter.scala @@ -2,7 +2,9 @@ package scoverage.report import java.io.File -class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) { +import scoverage.Coverage + +class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean) { // Source paths in canonical form WITH trailing file separator private val formattedSourcePaths: Seq[String] = sourceDirectories filter ( _.isDirectory ) map ( _.getCanonicalPath + File.separator ) @@ -10,7 +12,7 @@ class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) { /** * Converts absolute path to relative one if any of the source directories is it's parent. * If there is no parent directory, the path is returned unchanged (absolute). - * + * * @param src absolute file path in canonical form */ def relativeSource(src: String): String = relativeSource(src, formattedSourcePaths) @@ -27,4 +29,32 @@ class BaseReportWriter(sourceDirectories: Seq[File], outputDir: File) { } } + def preprocessCoverage(coverage: Coverage): Coverage = { + if (ignoreStatementsNotInSrcDirs) + filteredCoverage(coverage) + else + coverage + } + + /** + * Filters out statements not in source roots + * @return new Coverage instance with statements whose src paths are in root source paths. + */ + private def filteredCoverage(coverage: Coverage): Coverage = { + val filteredCoverage = Coverage() + coverage.statements.foreach { stmt => + if (isInSourceRoots(stmt.source)) + filteredCoverage.add(stmt) + } + coverage.ignoredStatements.foreach { stmt => + if (isInSourceRoots(stmt.source)) + filteredCoverage.addIgnoredStatement(stmt) + } + filteredCoverage + } + + private def isInSourceRoots(src: String): Boolean = { + formattedSourcePaths.exists(sourcePath => src.startsWith(sourcePath)) + } + } diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala index a6901ddb..d7e012a0 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/CoberturaXmlWriter.scala @@ -8,16 +8,17 @@ import scoverage._ import scala.xml.{Node, PrettyPrinter} /** @author Stephen Samuel */ -class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File) extends BaseReportWriter(sourceDirectories, outputDir) { +class CoberturaXmlWriter(sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean) + extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) { - def this (baseDir: File, outputDir: File) { - this(Seq(baseDir), outputDir) + def this (baseDir: File, outputDir: File, ignoreStatementsNotInSrcDirs: Boolean = false) { + this(Seq(baseDir), outputDir, ignoreStatementsNotInSrcDirs) } def write(coverage: Coverage): Unit = { val file = new File(outputDir, "cobertura.xml") IOUtils.writeToFile(file, "\n\n" + - new PrettyPrinter(120, 4).format(xml(coverage))) + new PrettyPrinter(120, 4).format(xml(preprocessCoverage(coverage)))) } def method(method: MeasuredMethod): Node = { diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala index b4d05827..2321f987 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala @@ -8,11 +8,12 @@ import scoverage._ import scala.xml.Node /** @author Stephen Samuel */ -class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String]) extends BaseReportWriter(sourceDirectories, outputDir) { +class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceEncoding: Option[String], ignoreStatementsNotInSrcDirs: Boolean) + extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) { // for backward compatibility only - def this (sourceDirectories: Seq[File], outputDir: File) { - this(sourceDirectories, outputDir, None); + def this (sourceDirectories: Seq[File], outputDir: File, ignoreStatementsNotInSrcDirs: Boolean = false) { + this(sourceDirectories, outputDir, None, ignoreStatementsNotInSrcDirs) } // for backward compatibility only @@ -21,16 +22,18 @@ class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File, sourceE } def write(coverage: Coverage): Unit = { + val preprocessedCoverage = preprocessCoverage(coverage) + val indexFile = new File(outputDir.getAbsolutePath + "/index.html") val packageFile = new File(outputDir.getAbsolutePath + "/packages.html") val overviewFile = new File(outputDir.getAbsolutePath + "/overview.html") val index = IOUtils.readStreamAsString(getClass.getResourceAsStream("/scoverage/index.html")) IOUtils.writeToFile(indexFile, index) - IOUtils.writeToFile(packageFile, packageList(coverage).toString()) - IOUtils.writeToFile(overviewFile, overview(coverage).toString()) + IOUtils.writeToFile(packageFile, packageList(preprocessedCoverage).toString()) + IOUtils.writeToFile(overviewFile, overview(preprocessedCoverage).toString()) - coverage.packages.foreach(writePackage) + preprocessedCoverage.packages.foreach(writePackage) } private def writePackage(pkg: MeasuredPackage): Unit = { diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala index 7d3b8f90..45f06bf3 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala @@ -7,15 +7,16 @@ import scoverage._ import scala.xml.{Node, PrettyPrinter} /** @author Stephen Samuel */ -class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: Boolean) extends BaseReportWriter(sourceDirectories, outputDir) { +class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: Boolean, ignoreStatementsNotInSrcDirs: Boolean) + extends BaseReportWriter(sourceDirectories, outputDir, ignoreStatementsNotInSrcDirs) { - def this (sourceDir: File, outputDir: File, debug: Boolean) { - this(Seq(sourceDir), outputDir, debug) + def this (sourceDir: File, outputDir: File, debug: Boolean, ignoreStatementsNotInSrcDirs: Boolean = false) { + this(Seq(sourceDir), outputDir, debug, ignoreStatementsNotInSrcDirs) } def write(coverage: Coverage): Unit = { val file = IOUtils.reportFile(outputDir, debug) - IOUtils.writeToFile(file, new PrettyPrinter(120, 4).format(xml(coverage))) + IOUtils.writeToFile(file, new PrettyPrinter(120, 4).format(xml(preprocessCoverage(coverage)))) } private def xml(coverage: Coverage): Node = {