diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/Serializer.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/Serializer.scala index 321bfa09..846b7c59 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/Serializer.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/Serializer.scala @@ -69,6 +69,9 @@ object Serializer { {stmt.count.toString} + + {stmt.ignored.toString} + Utility.trim(xml) + "\n" } @@ -86,6 +89,7 @@ object Serializer { val statements = xml \ "statement" map (node => { val source = (node \ "source").text val count = (node \ "count").text.toInt + val ignored = (node \ "ignored").text.toBoolean val branch = (node \ "branch").text.toBoolean val _package = (node \ "package").text val _class = (node \ "class").text @@ -112,12 +116,13 @@ object Serializer { line, desc, symbolName, - treeName, branch, count) + treeName, branch, count, ignored) }) val coverage = Coverage() for ( statement <- statements ) - coverage.add(statement) + if (statement.ignored) coverage.addIgnoredStatement(statement) + else coverage.add(statement) coverage } diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala index 929624bd..242d99d8 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala @@ -18,6 +18,11 @@ case class Coverage() override def statements = statementsById.values def add(stmt: Statement): Unit = statementsById.put(stmt.id, stmt) + private val ignoredStatementsById = mutable.Map[Int, Statement]() + override def ignoredStatements = ignoredStatementsById.values + def addIgnoredStatement(stmt: Statement): Unit = ignoredStatementsById.put(stmt.id, stmt) + + def avgClassesPerPackage = classCount / packageCount.toDouble def avgClassesPerPackageFormatted: String = "%.2f".format(avgClassesPerPackage) @@ -65,23 +70,30 @@ trait FileBuilders { def fileCount: Int = files.size } -case class MeasuredMethod(name: String, statements: Iterable[Statement]) extends CoverageMetrics +case class MeasuredMethod(name: String, statements: Iterable[Statement]) extends CoverageMetrics { + override def ignoredStatements: Iterable[Statement] = Seq() +} case class MeasuredClass(name: String, statements: Iterable[Statement]) extends CoverageMetrics with MethodBuilders { def source: String = statements.head.source def simpleName = name.split('.').last def loc = statements.map(_.line).max + + override def ignoredStatements: Iterable[Statement] = Seq() } case class MeasuredPackage(name: String, statements: Iterable[Statement]) extends CoverageMetrics with ClassCoverage with ClassBuilders with FileBuilders { + override def ignoredStatements: Iterable[Statement] = Seq() } case class MeasuredFile(source: String, statements: Iterable[Statement]) extends CoverageMetrics with ClassCoverage with ClassBuilders { def filename = new File(source).getName def loc = statements.map(_.line).max + + override def ignoredStatements: Iterable[Statement] = Seq() } case class Statement(source: String, @@ -94,7 +106,8 @@ case class Statement(source: String, symbolName: String, treeName: String, branch: Boolean, - var count: Int = 0) extends java.io.Serializable { + var count: Int = 0, + ignored: Boolean = false) extends java.io.Serializable { def invoked(): Unit = count = count + 1 def isInvoked = count > 0 } @@ -126,6 +139,10 @@ object ClassRef { trait CoverageMetrics { def statements: Iterable[Statement] def statementCount: Int = statements.size + + def ignoredStatements: Iterable[Statement] + def ignoredStatementCount: Int = ignoredStatements.size + def invokedStatements: Iterable[Statement] = statements.filter(_.count > 0) def invokedStatementCount = invokedStatements.size def statementCoverage: Double = if (statementCount == 0) 1 else invokedStatementCount / statementCount.toDouble diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala index 33e4cbc7..34641003 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/plugin.scala @@ -166,22 +166,23 @@ class ScoverageInstrumentationComponent(val global: Global) reporter.echo(s"[warn] Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]. No pos.") tree case Some(source) => + val id = statementIds.incrementAndGet + val statement = Statement( + source.path, + location, + id, + safeStart(tree), + safeEnd(tree), + safeLine(tree), + original.toString, + Option(original.symbol).fold("")(_.fullNameString), + tree.getClass.getSimpleName, + branch + ) if (tree.pos.isDefined && !isStatementIncluded(tree.pos)) { + coverage.add(statement.copy(ignored = true)) tree } else { - val id = statementIds.incrementAndGet - val statement = Statement( - source.path, - location, - id, - safeStart(tree), - safeEnd(tree), - safeLine(tree), - original.toString, - Option(original.symbol).fold("")(_.fullNameString), - tree.getClass.getSimpleName, - branch - ) coverage.add(statement) val apply = invokeCall(id) 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 c89bea9a..bb118a25 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageHtmlWriter.scala @@ -494,6 +494,20 @@ class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File) extends {coverage.invokedBranchesCount.toString} + + + Ignored statements: + + + {coverage.ignoredStatementCount.toString} + + + + + + + + Statement coverage: diff --git a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlReader.scala b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlReader.scala index 1b29893c..cd238023 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlReader.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlReader.scala @@ -31,6 +31,7 @@ object ScoverageXmlReader { val count = node \ "@invocation-count" val symbolName = node \ "@symbol" val treeName = node \ "@tree" + val ignored = node \ "@ignored" val location = Location(pkg.text, classname.text, @@ -52,7 +53,8 @@ object ScoverageXmlReader { symbolName.text, treeName.text, branch.text.toBoolean, - count.text.toInt + count.text.toInt, + ignored.text.toBoolean ) } coverage 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 3d83da3c..3b995331 100644 --- a/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala +++ b/scalac-scoverage-plugin/src/main/scala/scoverage/report/ScoverageXmlWriter.scala @@ -46,7 +46,8 @@ class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: B symbol={Serializer.escape(stmt.symbolName)} tree={Serializer.escape(stmt.treeName)} branch={stmt.branch.toString} - invocation-count={stmt.count.toString}> + invocation-count={stmt.count.toString} + ignored={stmt.ignored.toString}> {Serializer.escape(stmt.desc)} case false => @@ -60,7 +61,8 @@ class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: B end={stmt.end.toString} line={stmt.line.toString} branch={stmt.branch.toString} - invocation-count={stmt.count.toString}/> + invocation-count={stmt.count.toString} + ignored={stmt.ignored.toString}/> } } diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/CoverageMetricsTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/CoverageMetricsTest.scala index 93f94a02..b37ec30a 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/CoverageMetricsTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/CoverageMetricsTest.scala @@ -17,6 +17,8 @@ class CoverageMetricsTest extends FreeSpec with Matchers { null, false, 1)) + + override def ignoredStatements: Iterable[Statement] = Seq() } metrics.branchCount shouldBe 0 metrics.branchCoverage - 1 shouldBe < (0.0001) @@ -35,6 +37,8 @@ class CoverageMetricsTest extends FreeSpec with Matchers { null, false, 0)) + + override def ignoredStatements: Iterable[Statement] = Seq() } metrics.branchCount shouldBe 0 metrics.branchCoverage shouldBe 0 diff --git a/scalac-scoverage-plugin/src/test/scala/scoverage/SerializerTest.scala b/scalac-scoverage-plugin/src/test/scala/scoverage/SerializerTest.scala index 213d6563..297e24e8 100644 --- a/scalac-scoverage-plugin/src/test/scala/scoverage/SerializerTest.scala +++ b/scalac-scoverage-plugin/src/test/scala/scoverage/SerializerTest.scala @@ -20,7 +20,7 @@ class SerializerTest extends FunSuite with MockitoSugar with OneInstancePerTest ) val expected = - mysource org.scoverage test Trait test mymethod mypath 14 100 200 4 def test : String test DefDef true 32 + mysource org.scoverage test Trait test mymethod mypath 14 100 200 4 def test : String test DefDef true 32 false val writer = new StringWriter() @@ -31,7 +31,7 @@ class SerializerTest extends FunSuite with MockitoSugar with OneInstancePerTest test("coverage should be deserializable from xml") { val input = - mysource org.scoverage test Trait test mymethod mypath 14 100 200 4 def test : String test DefDef true 32 + mysource org.scoverage test Trait test mymethod mypath 14 100 200 4 def test : String test DefDef true 32 false val statements = List(Statement(