Skip to content

Commit a4549e7

Browse files
TheElectronWillsmarter
authored andcommitted
Move coverage phase to before FirstTransform and handle more trees
1 parent 28bc87e commit a4549e7

File tree

7 files changed

+140
-128
lines changed

7 files changed

+140
-128
lines changed

compiler/src/dotty/tools/dotc/Compiler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class Compiler {
4646
List(new sjs.PrepJSInterop) :: // Additional checks and transformations for Scala.js (Scala.js only)
4747
List(new sbt.ExtractAPI) :: // Sends a representation of the API of classes to sbt via callbacks
4848
List(new SetRootTree) :: // Set the `rootTreeOrProvider` on class symbols
49-
List(new CoverageTransformMacro) :: // Perform instrumentation for coverage transform (if -coverage is present)
5049
Nil
5150

5251
/** Phases dealing with TASTY tree pickling and unpickling */
@@ -60,6 +59,7 @@ class Compiler {
6059

6160
/** Phases dealing with the transformation from pickled trees to backend trees */
6261
protected def transformPhases: List[List[Phase]] =
62+
List(new InstrumentCoverage) :: // Perform instrumentation for code coverage (if -coverage setting is set)
6363
List(new FirstTransform, // Some transformations to put trees into a canonical form
6464
new CheckReentrant, // Internal use only: Check that compiled program has no data races involving global vars
6565
new ElimPackagePrefixes, // Eliminate references to package prefixes in Select nodes

compiler/src/dotty/tools/dotc/coverage/Coverage.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ package coverage
33

44
import scala.collection.mutable
55

6-
class Coverage {
6+
class Coverage:
77
private val statementsById = mutable.Map[Int, Statement]()
88

9-
def statements = statementsById.values
9+
def statements: Iterable[Statement] = statementsById.values
1010

11-
def addStatement(stmt: Statement): Unit = statementsById.put(stmt.id, stmt)
12-
}
11+
def addStatement(stmt: Statement): Unit = statementsById(stmt.id) = stmt
1312

1413
case class Statement(
1514
source: String,
@@ -24,7 +23,9 @@ case class Statement(
2423
branch: Boolean,
2524
var count: Int = 0,
2625
ignored: Boolean = false
27-
) {
28-
def invoked(): Unit = count = count + 1
29-
def isInvoked = count > 0
30-
}
26+
):
27+
def invoked(): Unit =
28+
count += 1
29+
30+
def isInvoked: Boolean =
31+
count > 0

compiler/src/dotty/tools/dotc/coverage/Location.scala

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ final case class Location(
2020
sourcePath: String
2121
)
2222

23-
object Location {
24-
def apply(tree: Tree)(using ctx: Context): Location = {
23+
object Location:
24+
def apply(tree: Tree)(using ctx: Context): Location =
2525

2626
val packageName = ctx.owner.denot.enclosingPackageClass.name.toSimpleName.toString()
2727
val className = ctx.owner.denot.enclosingClass.name.toSimpleName.toString()
@@ -34,5 +34,3 @@ object Location {
3434
ctx.owner.denot.enclosingMethod.name.toSimpleName.toString(),
3535
ctx.source.file.absolute.toString()
3636
)
37-
}
38-
}

compiler/src/dotty/tools/dotc/coverage/Serializer.scala

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,34 @@ import java.io._
55

66
import scala.io.Source
77

8-
object Serializer {
8+
/**
9+
* Serializes scoverage data.
10+
* @see https://github.com/scoverage/scalac-scoverage-plugin/blob/main/scalac-scoverage-plugin/src/main/scala/scoverage/Serializer.scala
11+
*/
12+
object Serializer:
913

10-
val coverageFileName = "scoverage.coverage"
11-
val coverageDataFormatVersion = "3.0"
12-
// Write out coverage data to the given data directory, using the default coverage filename
14+
private val CoverageFileName = "scoverage.coverage"
15+
private val CoverageDataFormatVersion = "3.0"
16+
17+
/** Write out coverage data to the given data directory, using the default coverage filename */
1318
def serialize(coverage: Coverage, dataDir: String, sourceRoot: String): Unit =
1419
serialize(coverage, coverageFile(dataDir), new File(sourceRoot))
1520

16-
// Write out coverage data to given file.
17-
def serialize(coverage: Coverage, file: File, sourceRoot: File): Unit = {
18-
val writer = new BufferedWriter(new FileWriter(file))
21+
/** Write out coverage data to given file. */
22+
def serialize(coverage: Coverage, file: File, sourceRoot: File): Unit =
23+
val writer = BufferedWriter(FileWriter(file))
1924
serialize(coverage, writer, sourceRoot)
2025
writer.close()
21-
}
2226

23-
def serialize(coverage: Coverage, writer: Writer, sourceRoot: File): Unit = {
27+
def serialize(coverage: Coverage, writer: Writer, sourceRoot: File): Unit =
2428

25-
def getRelativePath(filePath: String): String = {
29+
def getRelativePath(filePath: String): String =
2630
val base = sourceRoot.getCanonicalFile().toPath()
27-
val relPath = base.relativize(new File(filePath).getCanonicalFile().toPath())
31+
val relPath = base.relativize(File(filePath).getCanonicalFile().toPath())
2832
relPath.toString
29-
}
3033

31-
def writeHeader(writer: Writer): Unit = {
32-
writer.write(s"""# Coverage data, format version: $coverageDataFormatVersion
34+
def writeHeader(writer: Writer): Unit =
35+
writer.write(s"""# Coverage data, format version: $CoverageDataFormatVersion
3336
|# Statement data:
3437
|# - id
3538
|# - source path
@@ -50,8 +53,8 @@ object Serializer {
5053
|# '\f' sign
5154
|# ------------------------------------------
5255
|""".stripMargin)
53-
}
54-
def writeStatement(stmt: Statement, writer: Writer): Unit = {
56+
57+
def writeStatement(stmt: Statement, writer: Writer): Unit =
5558
writer.write(s"""${stmt.id}
5659
|${getRelativePath(stmt.location.sourcePath)}
5760
|${stmt.location.packageName}
@@ -70,14 +73,11 @@ object Serializer {
7073
|${stmt.desc}
7174
|\f
7275
|""".stripMargin)
73-
}
7476

7577
writeHeader(writer)
76-
coverage.statements.toVector
78+
coverage.statements.toSeq
7779
.sortBy(_.id)
7880
.foreach(stmt => writeStatement(stmt, writer))
79-
}
8081

8182
def coverageFile(dataDir: File): File = coverageFile(dataDir.getAbsolutePath)
82-
def coverageFile(dataDir: String): File = new File(dataDir, coverageFileName)
83-
}
83+
def coverageFile(dataDir: String): File = File(dataDir, CoverageFileName)

0 commit comments

Comments
 (0)