Skip to content

Commit 7fc537c

Browse files
Coverage: don't instrument super() calls of Template, fix #16127
1 parent c3424ce commit 7fc537c

File tree

8 files changed

+91
-299
lines changed

8 files changed

+91
-299
lines changed

compiler/src/dotty/tools/dotc/transform/InstrumentCoverage.scala

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,18 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer:
279279
// to the enclosing method, not a tree to instrument.
280280
cpy.Return(tree)(expr = transform(tree.expr), from = tree.from)
281281

282+
case tree: Template =>
283+
// only transform:
284+
// - the arguments of the `Apply` trees in the parents
285+
// - the template body
286+
cpy.Template(tree)(
287+
transformSub(tree.constr),
288+
transformTemplateParents(tree.parents)(using ctx.superCallContext),
289+
tree.derived,
290+
tree.self,
291+
transformStats(tree.body, tree.symbol)
292+
)
293+
282294
// For everything else just recurse and transform
283295
case _ =>
284296
super.transform(tree)
@@ -332,6 +344,21 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer:
332344

333345
cpy.CaseDef(tree)(pat, transformedGuard, instrumentedBody)
334346

347+
/** Transforms the parents of a Template. */
348+
private def transformTemplateParents(parents: List[Tree])(using Context): List[Tree] =
349+
def transformParent(parent: Tree): Tree = parent match
350+
case tree: Apply =>
351+
// only instrument the args, not the constructor call
352+
cpy.Apply(tree)(tree.fun, tree.args.mapConserve(transform))
353+
case tree: TypeApply =>
354+
// args are types, instrument the fun with transformParent
355+
cpy.TypeApply(tree)(transformParent(tree.fun), tree.args)
356+
case other =>
357+
// should always be a TypeTree, nothing to instrument
358+
other
359+
360+
parents.mapConserve(transformParent)
361+
335362
/** Instruments the body of a DefDef. Handles corner cases.
336363
* Given a DefDef f like this:
337364
* ```

tests/coverage/pos/Enum.scoverage.check

Lines changed: 13 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -72,142 +72,6 @@ def surfaceWeight
7272
3
7373
Enum.scala
7474
covtest
75-
$anon
76-
Class
77-
covtest.$anon
78-
<init>
79-
485
80-
512
81-
17
82-
<init>
83-
Apply
84-
false
85-
0
86-
false
87-
Planet(3.303e+23, 2.4397e6)
88-
89-
4
90-
Enum.scala
91-
covtest
92-
$anon
93-
Class
94-
covtest.$anon
95-
<init>
96-
538
97-
565
98-
18
99-
<init>
100-
Apply
101-
false
102-
0
103-
false
104-
Planet(4.869e+24, 6.0518e6)
105-
106-
5
107-
Enum.scala
108-
covtest
109-
$anon
110-
Class
111-
covtest.$anon
112-
<init>
113-
591
114-
619
115-
19
116-
<init>
117-
Apply
118-
false
119-
0
120-
false
121-
Planet(5.976e+24, 6.37814e6)
122-
123-
6
124-
Enum.scala
125-
covtest
126-
$anon
127-
Class
128-
covtest.$anon
129-
<init>
130-
645
131-
672
132-
20
133-
<init>
134-
Apply
135-
false
136-
0
137-
false
138-
Planet(6.421e+23, 3.3972e6)
139-
140-
7
141-
Enum.scala
142-
covtest
143-
$anon
144-
Class
145-
covtest.$anon
146-
<init>
147-
698
148-
725
149-
21
150-
<init>
151-
Apply
152-
false
153-
0
154-
false
155-
Planet(1.9e+27, 7.1492e7)
156-
157-
8
158-
Enum.scala
159-
covtest
160-
$anon
161-
Class
162-
covtest.$anon
163-
<init>
164-
751
165-
778
166-
22
167-
<init>
168-
Apply
169-
false
170-
0
171-
false
172-
Planet(5.688e+26, 6.0268e7)
173-
174-
9
175-
Enum.scala
176-
covtest
177-
$anon
178-
Class
179-
covtest.$anon
180-
<init>
181-
804
182-
831
183-
23
184-
<init>
185-
Apply
186-
false
187-
0
188-
false
189-
Planet(8.686e+25, 2.5559e7)
190-
191-
10
192-
Enum.scala
193-
covtest
194-
$anon
195-
Class
196-
covtest.$anon
197-
<init>
198-
857
199-
884
200-
24
201-
<init>
202-
Apply
203-
false
204-
0
205-
false
206-
Planet(1.024e+26, 2.4746e7)
207-
208-
11
209-
Enum.scala
210-
covtest
21175
EnumTypes$
21276
Object
21377
covtest.EnumTypes$
@@ -222,7 +86,7 @@ false
22286
false
22387
println("Example 1: \n"+emptyList)
22488

225-
12
89+
4
22690
Enum.scala
22791
covtest
22892
EnumTypes$
@@ -239,7 +103,7 @@ false
239103
false
240104
"Example 1: \n"+emptyList
241105

242-
13
106+
5
243107
Enum.scala
244108
covtest
245109
EnumTypes$
@@ -256,7 +120,7 @@ false
256120
false
257121
println(s"${list}\n")
258122

259-
14
123+
6
260124
Enum.scala
261125
covtest
262126
EnumTypes$
@@ -273,7 +137,7 @@ false
273137
false
274138
s"${list}\n"
275139

276-
15
140+
7
277141
Enum.scala
278142
covtest
279143
EnumTypes$
@@ -290,7 +154,7 @@ false
290154
false
291155
Planet.Earth.surfaceGravity
292156

293-
16
157+
8
294158
Enum.scala
295159
covtest
296160
EnumTypes$
@@ -308,7 +172,7 @@ false
308172
for p <- Planet.values do
309173
println(s"Your weight on $p is ${p.surfaceWeight(mass)}")
310174

311-
17
175+
9
312176
Enum.scala
313177
covtest
314178
EnumTypes$
@@ -325,7 +189,7 @@ false
325189
false
326190
Planet.values
327191

328-
18
192+
10
329193
Enum.scala
330194
covtest
331195
EnumTypes$
@@ -342,7 +206,7 @@ false
342206
false
343207
println(s"Your weight on $p is ${p.surfaceWeight(mass)}")
344208

345-
19
209+
11
346210
Enum.scala
347211
covtest
348212
EnumTypes$
@@ -359,7 +223,7 @@ false
359223
false
360224
s"Your weight on $p is ${p.surfaceWeight(mass)}"
361225

362-
20
226+
12
363227
Enum.scala
364228
covtest
365229
EnumTypes$
@@ -376,7 +240,7 @@ false
376240
false
377241
p.surfaceWeight(mass)
378242

379-
21
243+
13
380244
Enum.scala
381245
covtest
382246
EnumTypes$
@@ -393,7 +257,7 @@ false
393257
false
394258
def calculateEarthWeightOnPlanets
395259

396-
22
260+
14
397261
Enum.scala
398262
covtest
399263
EnumTypes$
@@ -410,7 +274,7 @@ false
410274
false
411275
println("Example 2:")
412276

413-
23
277+
15
414278
Enum.scala
415279
covtest
416280
EnumTypes$
@@ -427,7 +291,7 @@ false
427291
false
428292
calculateEarthWeightOnPlanets(80)
429293

430-
24
294+
16
431295
Enum.scala
432296
covtest
433297
EnumTypes$
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Coverage data, format version: 3.0
2+
# Statement data:
3+
# - id
4+
# - source path
5+
# - package name
6+
# - class name
7+
# - class type (Class, Object or Trait)
8+
# - full class name
9+
# - method name
10+
# - start offset
11+
# - end offset
12+
# - line number
13+
# - symbol name
14+
# - tree name
15+
# - is branch
16+
# - invocations count
17+
# - is ignored
18+
# - description (can be multi-line)
19+
# ' ' sign
20+
# ------------------------------------------

0 commit comments

Comments
 (0)