Skip to content

Commit 3a9ccde

Browse files
committed
Merge pull request #37 from RichardBradley/report-perf
Don't scan all statements on each hit -- there may be very many of them
2 parents f973b22 + 9751fc3 commit 3a9ccde

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

src/main/scala/scoverage/coverage.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package scoverage
22

3-
import scala.collection.mutable.ListBuffer
43
import java.io.File
4+
import scala.collection.mutable
55

66
/**
77
* @author Stephen Samuel */
@@ -13,8 +13,9 @@ case class Coverage()
1313
with PackageBuilders
1414
with FileBuilders {
1515

16-
val statements = new ListBuffer[MeasuredStatement]
17-
def add(stmt: MeasuredStatement): Unit = statements.append(stmt)
16+
private val statementsById = mutable.Map[Int, MeasuredStatement]()
17+
override def statements = statementsById.values
18+
def add(stmt: MeasuredStatement): Unit = statementsById.put(stmt.id, stmt)
1819

1920
def avgClassesPerPackage = classCount / packageCount.toDouble
2021
def avgClassesPerPackageFormatted: String = "%.2f".format(avgClassesPerPackage)
@@ -29,11 +30,11 @@ case class Coverage()
2930
def risks(limit: Int) = classes.toSeq.sortBy(_.statementCount).reverse.sortBy(_.statementCoverage).take(limit)
3031

3132
def apply(ids: Iterable[Int]): Unit = ids foreach invoked
32-
def invoked(id: Int): Unit = statements.find(_.id == id).foreach(_.invoked())
33+
def invoked(id: Int): Unit = statementsById.get(id).foreach(_.invoked())
3334
}
3435

3536
trait MethodBuilders {
36-
val statements: Iterable[MeasuredStatement]
37+
def statements: Iterable[MeasuredStatement]
3738
def methods: Seq[MeasuredMethod] = {
3839
statements.groupBy(stmt => stmt.location._package + "/" + stmt.location._class + "/" + stmt.location.method)
3940
.map(arg => MeasuredMethod(arg._1, arg._2))
@@ -43,21 +44,21 @@ trait MethodBuilders {
4344
}
4445

4546
trait PackageBuilders {
46-
val statements: Iterable[MeasuredStatement]
47+
def statements: Iterable[MeasuredStatement]
4748
def packageCount = packages.size
4849
def packages: Seq[MeasuredPackage] = {
4950
statements.groupBy(_.location._package).map(arg => MeasuredPackage(arg._1, arg._2)).toSeq.sortBy(_.name)
5051
}
5152
}
5253

5354
trait ClassBuilders {
54-
val statements: Iterable[MeasuredStatement]
55+
def statements: Iterable[MeasuredStatement]
5556
def classes = statements.groupBy(_.location._class).map(arg => MeasuredClass(arg._1, arg._2))
5657
def classCount: Int = classes.size
5758
}
5859

5960
trait FileBuilders {
60-
val statements: Iterable[MeasuredStatement]
61+
def statements: Iterable[MeasuredStatement]
6162
def files: Iterable[MeasuredFile] = statements.groupBy(_.source).map(arg => MeasuredFile(arg._1, arg._2))
6263
def fileCount: Int = files.size
6364
}

src/test/scala/scoverage/CoverageTest.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ class CoverageTest extends FunSuite with BeforeAndAfter with OneInstancePerTest
2121
test("coverage for invoked statements") {
2222
val coverage = Coverage()
2323
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 1, 2, 3, 4, "", "", "", false, 3))
24-
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 1, 2, 3, 4, "", "", "", false, 0))
25-
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 1, 2, 3, 4, "", "", "", false, 0))
26-
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 1, 2, 3, 4, "", "", "", false, 0))
24+
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 2, 2, 3, 4, "", "", "", false, 0))
25+
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 3, 2, 3, 4, "", "", "", false, 0))
26+
coverage.add(MeasuredStatement("", Location("", "", ClassType.Object, ""), 4, 2, 3, 4, "", "", "", false, 0))
2727
assert(0.25 === coverage.statementCoverage)
2828
}
2929
}

0 commit comments

Comments
 (0)