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.