Skip to content

Commit f259dee

Browse files
author
Vijay Ramesh
committed
Fix coverage reporting with for comprehensions and add some tests to prove it
1 parent e940957 commit f259dee

File tree

10 files changed

+759
-23
lines changed

10 files changed

+759
-23
lines changed

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

+2-7
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,9 @@ class InstrumentCoverage extends MacroTransform with IdentityDenotTransformer:
166166
InstrumentedParts.notCovered(tree)
167167

168168
private def tryInstrument(tree: Select)(using Context): InstrumentedParts =
169-
val sym = tree.symbol
170169
val transformed = cpy.Select(tree)(transform(tree.qualifier), tree.name)
171-
if canInstrumentParameterless(sym) then
172-
// call to a parameterless method
173-
val coverageCall = createInvokeCall(tree, tree.sourcePos)
174-
InstrumentedParts.singleExpr(coverageCall, transformed)
175-
else
176-
InstrumentedParts.notCovered(transformed)
170+
val coverageCall = createInvokeCall(tree, tree.sourcePos)
171+
InstrumentedParts.singleExpr(coverageCall, transformed)
177172

178173
/** Generic tryInstrument */
179174
private def tryInstrument(tree: Tree)(using Context): InstrumentedParts =

tests/coverage/pos/Escaping.scoverage.check

+17
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,23 @@ covtest.\n
4242
Class
4343
covtest.\n.\r\n\f
4444
\r\n\f
45+
69
46+
73
47+
3
48+
\\
49+
Ident
50+
false
51+
0
52+
false
53+
`\\\\`
54+
55+
2
56+
Escaping.scala
57+
covtest.\n
58+
\r\n\f
59+
Class
60+
covtest.\n.\r\n\f
61+
\r\n\f
4562
40
4663
48
4764
3
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package covtest
2+
3+
def testForComprehension: Unit =
4+
for {
5+
a <- List(1)
6+
b <- List(1)
7+
if b > 1
8+
c = a + b
9+
} yield (a, b, c)
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
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+
# ------------------------------------------
21+
0
22+
ForComprehension.scala
23+
covtest
24+
ForComprehension$package$
25+
Object
26+
covtest.ForComprehension$package$
27+
testForComprehension
28+
52
29+
138
30+
3
31+
flatMap
32+
Apply
33+
false
34+
0
35+
false
36+
for {\n a <- List(1)\n b <- List(1)\n if b > 1\n c = a + b\n } yield (a, b, c)
37+
38+
1
39+
ForComprehension.scala
40+
covtest
41+
ForComprehension$package$
42+
Object
43+
covtest.ForComprehension$package$
44+
testForComprehension
45+
67
46+
74
47+
4
48+
apply
49+
Apply
50+
false
51+
0
52+
false
53+
List(1)
54+
55+
2
56+
ForComprehension.scala
57+
covtest
58+
ForComprehension$package$
59+
Object
60+
covtest.ForComprehension$package$
61+
testForComprehension
62+
67
63+
71
64+
4
65+
List
66+
Ident
67+
false
68+
0
69+
false
70+
List
71+
72+
3
73+
ForComprehension.scala
74+
covtest
75+
ForComprehension$package$
76+
Object
77+
covtest.ForComprehension$package$
78+
$anonfun
79+
79
80+
138
81+
5
82+
map
83+
Apply
84+
false
85+
0
86+
false
87+
b <- List(1)\n if b > 1\n c = a + b\n } yield (a, b, c)
88+
89+
4
90+
ForComprehension.scala
91+
covtest
92+
ForComprehension$package$
93+
Object
94+
covtest.ForComprehension$package$
95+
$anonfun
96+
79
97+
118
98+
5
99+
map
100+
Apply
101+
false
102+
0
103+
false
104+
b <- List(1)\n if b > 1\n c = a + b
105+
106+
5
107+
ForComprehension.scala
108+
covtest
109+
ForComprehension$package$
110+
Object
111+
covtest.ForComprehension$package$
112+
$anonfun
113+
79
114+
104
115+
5
116+
withFilter
117+
Apply
118+
false
119+
0
120+
false
121+
b <- List(1)\n if b > 1
122+
123+
6
124+
ForComprehension.scala
125+
covtest
126+
ForComprehension$package$
127+
Object
128+
covtest.ForComprehension$package$
129+
$anonfun
130+
84
131+
91
132+
5
133+
apply
134+
Apply
135+
false
136+
0
137+
false
138+
List(1)
139+
140+
7
141+
ForComprehension.scala
142+
covtest
143+
ForComprehension$package$
144+
Object
145+
covtest.ForComprehension$package$
146+
$anonfun
147+
84
148+
88
149+
5
150+
List
151+
Ident
152+
false
153+
0
154+
false
155+
List
156+
157+
8
158+
ForComprehension.scala
159+
covtest
160+
ForComprehension$package$
161+
Object
162+
covtest.ForComprehension$package$
163+
$anonfun
164+
79
165+
110
166+
5
167+
apply
168+
Apply
169+
false
170+
0
171+
false
172+
b <- List(1)\n if b > 1\n c
173+
174+
9
175+
ForComprehension.scala
176+
covtest
177+
ForComprehension$package$
178+
Object
179+
covtest.ForComprehension$package$
180+
testForComprehension
181+
17
182+
41
183+
2
184+
testForComprehension
185+
DefDef
186+
false
187+
0
188+
false
189+
def testForComprehension
190+

tests/coverage/pos/Lift.scoverage.check

+54-3
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,23 @@ SomeFunctions
7676
Class
7777
covtest.SomeFunctions
7878
c
79+
83
80+
96
81+
5
82+
<init>
83+
Select
84+
false
85+
0
86+
false
87+
SomeFunctions
88+
89+
4
90+
Lift.scala
91+
covtest
92+
SomeFunctions
93+
Class
94+
covtest.SomeFunctions
95+
c
7996
75
8097
80
8198
5
@@ -86,7 +103,7 @@ false
86103
false
87104
def c
88105

89-
4
106+
5
90107
Lift.scala
91108
covtest
92109
SomeFunctions
@@ -103,7 +120,7 @@ false
103120
false
104121
c.f(g())
105122

106-
5
123+
6
107124
Lift.scala
108125
covtest
109126
SomeFunctions
@@ -120,7 +137,24 @@ false
120137
false
121138
c
122139

123-
6
140+
7
141+
Lift.scala
142+
covtest
143+
SomeFunctions
144+
Class
145+
covtest.SomeFunctions
146+
test
147+
113
148+
116
149+
7
150+
f
151+
Select
152+
false
153+
0
154+
false
155+
c.f
156+
157+
8
124158
Lift.scala
125159
covtest
126160
SomeFunctions
@@ -137,7 +171,24 @@ false
137171
false
138172
g()
139173

174+
9
175+
Lift.scala
176+
covtest
177+
SomeFunctions
178+
Class
179+
covtest.SomeFunctions
180+
test
181+
117
182+
118
140183
7
184+
g
185+
Select
186+
false
187+
0
188+
false
189+
g
190+
191+
10
141192
Lift.scala
142193
covtest
143194
SomeFunctions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
1
2+
2
3+
1
4+
2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
@main
2+
def Test: Unit = {
3+
4+
def unreachableFunction(): Seq[Int] = {
5+
for {
6+
a <- List(1)
7+
b <- List(2)
8+
} yield {
9+
println(a)
10+
println(b)
11+
a + b
12+
}
13+
}
14+
15+
def unreachableFunctionUnlessTrue(flag: Boolean): Option[Int] = {
16+
if (flag) {
17+
val foo: Seq[Int] = for {
18+
a <- List(1)
19+
b <- List(2)
20+
} yield {
21+
println(a)
22+
println(b)
23+
a + b
24+
}
25+
foo.headOption
26+
} else {
27+
None
28+
}
29+
}
30+
31+
for {
32+
a <- List(1)
33+
b <- List(2)
34+
} yield {
35+
println(a)
36+
println(b)
37+
(a, b)
38+
}
39+
40+
unreachableFunctionUnlessTrue(false)
41+
}

0 commit comments

Comments
 (0)