Skip to content

Commit b834a17

Browse files
committed
Merge pull request #117 from rigoford/IgnoredStatements
Ignored statements
2 parents 274d5e3 + e46887b commit b834a17

File tree

8 files changed

+67
-22
lines changed

8 files changed

+67
-22
lines changed

scalac-scoverage-plugin/src/main/scala/scoverage/Serializer.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ object Serializer {
6969
<count>
7070
{stmt.count.toString}
7171
</count>
72+
<ignored>
73+
{stmt.ignored.toString}
74+
</ignored>
7275
</statement>
7376
Utility.trim(xml) + "\n"
7477
}
@@ -86,6 +89,7 @@ object Serializer {
8689
val statements = xml \ "statement" map (node => {
8790
val source = (node \ "source").text
8891
val count = (node \ "count").text.toInt
92+
val ignored = (node \ "ignored").text.toBoolean
8993
val branch = (node \ "branch").text.toBoolean
9094
val _package = (node \ "package").text
9195
val _class = (node \ "class").text
@@ -112,12 +116,13 @@ object Serializer {
112116
line,
113117
desc,
114118
symbolName,
115-
treeName, branch, count)
119+
treeName, branch, count, ignored)
116120
})
117121

118122
val coverage = Coverage()
119123
for ( statement <- statements )
120-
coverage.add(statement)
124+
if (statement.ignored) coverage.addIgnoredStatement(statement)
125+
else coverage.add(statement)
121126
coverage
122127
}
123128

scalac-scoverage-plugin/src/main/scala/scoverage/coverage.scala

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ case class Coverage()
1818
override def statements = statementsById.values
1919
def add(stmt: Statement): Unit = statementsById.put(stmt.id, stmt)
2020

21+
private val ignoredStatementsById = mutable.Map[Int, Statement]()
22+
override def ignoredStatements = ignoredStatementsById.values
23+
def addIgnoredStatement(stmt: Statement): Unit = ignoredStatementsById.put(stmt.id, stmt)
24+
25+
2126
def avgClassesPerPackage = classCount / packageCount.toDouble
2227
def avgClassesPerPackageFormatted: String = "%.2f".format(avgClassesPerPackage)
2328

@@ -65,23 +70,30 @@ trait FileBuilders {
6570
def fileCount: Int = files.size
6671
}
6772

68-
case class MeasuredMethod(name: String, statements: Iterable[Statement]) extends CoverageMetrics
73+
case class MeasuredMethod(name: String, statements: Iterable[Statement]) extends CoverageMetrics {
74+
override def ignoredStatements: Iterable[Statement] = Seq()
75+
}
6976

7077
case class MeasuredClass(name: String, statements: Iterable[Statement])
7178
extends CoverageMetrics with MethodBuilders {
7279
def source: String = statements.head.source
7380
def simpleName = name.split('.').last
7481
def loc = statements.map(_.line).max
82+
83+
override def ignoredStatements: Iterable[Statement] = Seq()
7584
}
7685

7786
case class MeasuredPackage(name: String, statements: Iterable[Statement])
7887
extends CoverageMetrics with ClassCoverage with ClassBuilders with FileBuilders {
88+
override def ignoredStatements: Iterable[Statement] = Seq()
7989
}
8090

8191
case class MeasuredFile(source: String, statements: Iterable[Statement])
8292
extends CoverageMetrics with ClassCoverage with ClassBuilders {
8393
def filename = new File(source).getName
8494
def loc = statements.map(_.line).max
95+
96+
override def ignoredStatements: Iterable[Statement] = Seq()
8597
}
8698

8799
case class Statement(source: String,
@@ -94,7 +106,8 @@ case class Statement(source: String,
94106
symbolName: String,
95107
treeName: String,
96108
branch: Boolean,
97-
var count: Int = 0) extends java.io.Serializable {
109+
var count: Int = 0,
110+
ignored: Boolean = false) extends java.io.Serializable {
98111
def invoked(): Unit = count = count + 1
99112
def isInvoked = count > 0
100113
}
@@ -126,6 +139,10 @@ object ClassRef {
126139
trait CoverageMetrics {
127140
def statements: Iterable[Statement]
128141
def statementCount: Int = statements.size
142+
143+
def ignoredStatements: Iterable[Statement]
144+
def ignoredStatementCount: Int = ignoredStatements.size
145+
129146
def invokedStatements: Iterable[Statement] = statements.filter(_.count > 0)
130147
def invokedStatementCount = invokedStatements.size
131148
def statementCoverage: Double = if (statementCount == 0) 1 else invokedStatementCount / statementCount.toDouble

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,22 +166,23 @@ class ScoverageInstrumentationComponent(val global: Global)
166166
reporter.echo(s"[warn] Could not instrument [${tree.getClass.getSimpleName}/${tree.symbol}]. No pos.")
167167
tree
168168
case Some(source) =>
169+
val id = statementIds.incrementAndGet
170+
val statement = Statement(
171+
source.path,
172+
location,
173+
id,
174+
safeStart(tree),
175+
safeEnd(tree),
176+
safeLine(tree),
177+
original.toString,
178+
Option(original.symbol).fold("<nosymbol>")(_.fullNameString),
179+
tree.getClass.getSimpleName,
180+
branch
181+
)
169182
if (tree.pos.isDefined && !isStatementIncluded(tree.pos)) {
183+
coverage.add(statement.copy(ignored = true))
170184
tree
171185
} else {
172-
val id = statementIds.incrementAndGet
173-
val statement = Statement(
174-
source.path,
175-
location,
176-
id,
177-
safeStart(tree),
178-
safeEnd(tree),
179-
safeLine(tree),
180-
original.toString,
181-
Option(original.symbol).fold("<nosymbol>")(_.fullNameString),
182-
tree.getClass.getSimpleName,
183-
branch
184-
)
185186
coverage.add(statement)
186187

187188
val apply = invokeCall(id)

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,20 @@ class ScoverageHtmlWriter(sourceDirectories: Seq[File], outputDir: File) extends
494494
{coverage.invokedBranchesCount.toString}
495495
</td>
496496
</tr>
497+
<tr>
498+
<td>
499+
Ignored statements:
500+
</td>
501+
<td>
502+
{coverage.ignoredStatementCount.toString}
503+
</td>
504+
<td></td>
505+
<td></td>
506+
<td></td>
507+
<td></td>
508+
<td></td>
509+
<td></td>
510+
</tr>
497511
<tr>
498512
<td>
499513
Statement coverage:

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ object ScoverageXmlReader {
3131
val count = node \ "@invocation-count"
3232
val symbolName = node \ "@symbol"
3333
val treeName = node \ "@tree"
34+
val ignored = node \ "@ignored"
3435

3536
val location = Location(pkg.text,
3637
classname.text,
@@ -52,7 +53,8 @@ object ScoverageXmlReader {
5253
symbolName.text,
5354
treeName.text,
5455
branch.text.toBoolean,
55-
count.text.toInt
56+
count.text.toInt,
57+
ignored.text.toBoolean
5658
)
5759
}
5860
coverage

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: B
4646
symbol={Serializer.escape(stmt.symbolName)}
4747
tree={Serializer.escape(stmt.treeName)}
4848
branch={stmt.branch.toString}
49-
invocation-count={stmt.count.toString}>
49+
invocation-count={stmt.count.toString}
50+
ignored={stmt.ignored.toString}>
5051
{Serializer.escape(stmt.desc)}
5152
</statement>
5253
case false =>
@@ -60,7 +61,8 @@ class ScoverageXmlWriter(sourceDirectories: Seq[File], outputDir: File, debug: B
6061
end={stmt.end.toString}
6162
line={stmt.line.toString}
6263
branch={stmt.branch.toString}
63-
invocation-count={stmt.count.toString}/>
64+
invocation-count={stmt.count.toString}
65+
ignored={stmt.ignored.toString}/>
6466
}
6567
}
6668

scalac-scoverage-plugin/src/test/scala/scoverage/CoverageMetricsTest.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class CoverageMetricsTest extends FreeSpec with Matchers {
1717
null,
1818
false,
1919
1))
20+
21+
override def ignoredStatements: Iterable[Statement] = Seq()
2022
}
2123
metrics.branchCount shouldBe 0
2224
metrics.branchCoverage - 1 shouldBe < (0.0001)
@@ -35,6 +37,8 @@ class CoverageMetricsTest extends FreeSpec with Matchers {
3537
null,
3638
false,
3739
0))
40+
41+
override def ignoredStatements: Iterable[Statement] = Seq()
3842
}
3943
metrics.branchCount shouldBe 0
4044
metrics.branchCoverage shouldBe 0

scalac-scoverage-plugin/src/test/scala/scoverage/SerializerTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class SerializerTest extends FunSuite with MockitoSugar with OneInstancePerTest
2020
)
2121
val expected = <statements>
2222
<statement>
23-
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count>
23+
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count> <ignored>false</ignored>
2424
</statement>
2525
</statements>
2626
val writer = new StringWriter()
@@ -31,7 +31,7 @@ class SerializerTest extends FunSuite with MockitoSugar with OneInstancePerTest
3131
test("coverage should be deserializable from xml") {
3232
val input = <statements>
3333
<statement>
34-
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count>
34+
<source>mysource</source> <package>org.scoverage</package> <class>test</class> <classType>Trait</classType> <topLevelClass>test</topLevelClass> <method>mymethod</method> <path>mypath</path> <id>14</id> <start>100</start> <end>200</end> <line>4</line> <description>def test : String</description> <symbolName>test</symbolName> <treeName>DefDef</treeName> <branch>true</branch> <count>32</count> <ignored>false</ignored>
3535
</statement>
3636
</statements>
3737
val statements = List(Statement(

0 commit comments

Comments
 (0)