Code Coverage for Scala 3
Instrument code for coverage analysis
PR#13880 has implemented code coverage support for Dotty. In general, code coverage "instruments" the program at compile time: code is inserted to record which statement are called. This does not change the behavior of the program. Also, a list of all the coverable statements is produced.
To use this feature, add the compile option -coverage-out:DIR
, where DIR
is the destination of the measurement files.
You can also set -sourceroot:PATHS_ROOT
to customize how the path of your source files are resolved. Note that -sourceroot
also sets the root path of the SemanticDB files.
Details: how the code is instrumented
When the -coverage-out
option is set, a new phase instrumentCoverage
runs, just before firstTransform
. For a carefully selected list of tree types, it adds a call to scala.runtime.Invoker.invoked(statementId, DIR)
.
For instance, this code:
def method() =
println(f())
with -coverage-out:target/cov
be turned to
def method() =
Invoker.invoked(2, "target/cov")
println({
Invoker.invoked(1, "target/cov")
f()
})
At the end of the phase, the list of all the instrumented statements is serialized to the file DIR/scoverage.coverage
.