Skip to content

Commit a11db37

Browse files
committed
Retain positions of trees inlined from the same file
Only reposition positions of inlined trees when they come from another file.
1 parent 857f53e commit a11db37

File tree

3 files changed

+31
-23
lines changed

3 files changed

+31
-23
lines changed

compiler/src/dotty/tools/dotc/typer/Inliner.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ object Inliner {
165165
case _ =>
166166
val transformed = super.transform(tree)
167167
enclosingInlineds match {
168-
case call :: _ if !call.isEmpty => transformed.withPos(inlinedAtPos)
168+
case call :: _ if !call.isEmpty && call.symbol != ctx.owner.topLevelClass =>
169+
// reposition tree inlined from some other file
170+
transformed.withPos(inlinedAtPos)
169171
case _ => transformed
170172
}
171173
}

compiler/test/dotty/tools/backend/jvm/InlineBytecodeTests.scala

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,23 @@ class InlineBytecodeTests extends DottyBytecodeTest {
7171
val expected =
7272
List(
7373
Label(0),
74-
LineNumber(6, Label(0)), // Position of the method start
75-
LineNumber(7, Label(0)), // Position of the call to `track`
74+
LineNumber(6, Label(0)),
75+
LineNumber(3, Label(0)),
7676
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
7777
Ldc(LDC, "tracking"),
7878
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println", "(Ljava/lang/Object;)V", false),
7979
Label(6),
80-
LineNumber(8, Label(6)), // Actual position
80+
LineNumber(8, Label(6)),
8181
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
8282
Ldc(LDC, "abc"),
8383
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
8484
Label(11),
85-
LineNumber(9, Label(11)), // Position of the call to `track`
85+
LineNumber(3, Label(11)),
8686
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
8787
Ldc(LDC, "tracking"),
8888
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
8989
Label(16),
90-
LineNumber(10, Label(16)), // Actual position
90+
LineNumber(10, Label(16)),
9191
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
9292
Ldc(LDC, "inner"),
9393
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
@@ -132,21 +132,23 @@ class InlineBytecodeTests extends DottyBytecodeTest {
132132
val expected =
133133
List(
134134
Label(0),
135-
LineNumber(12, Label(0)), // Position of the method start
136-
LineNumber(13, Label(0)), // Position of the call to `track`
135+
LineNumber(12, Label(0)),
136+
LineNumber(7, Label(0)),
137137
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
138138
Ldc(LDC, "tracking"),
139139
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println", "(Ljava/lang/Object;)V", false),
140+
Label(6),
141+
LineNumber(3, Label(6)),
140142
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
141143
Ldc(LDC, "tracking2"),
142144
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
143-
Label(9),
144-
LineNumber(14, Label(9)), // Actual position
145+
Label(11),
146+
LineNumber(14, Label(11)),
145147
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
146148
Ldc(LDC, "abc"),
147149
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
148150
Op(RETURN),
149-
Label(15)
151+
Label(17)
150152
)
151153
assert(instructions == expected,
152154
"`track` was not properly inlined in `main`\n" + diffInstructions(instructions, expected))
@@ -186,21 +188,23 @@ class InlineBytecodeTests extends DottyBytecodeTest {
186188
val expected =
187189
List(
188190
Label(0),
189-
LineNumber(12, Label(0)), // Position of the method start
190-
LineNumber(13, Label(0)), // Position of the call to `track`
191+
LineNumber(12, Label(0)),
192+
LineNumber(3, Label(0)),
191193
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
192194
Ldc(LDC, "tracking2"),
193195
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println", "(Ljava/lang/Object;)V", false),
196+
Label(6),
197+
LineNumber(8, Label(6)),
194198
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
195199
Ldc(LDC, "fgh"),
196200
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
197-
Label(9),
198-
LineNumber(14, Label(9)), // Actual position
201+
Label(11),
202+
LineNumber(14, Label(11)),
199203
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
200204
Ldc(LDC, "abc"),
201205
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
202206
Op(RETURN),
203-
Label(15)
207+
Label(17)
204208
)
205209
assert(instructions == expected,
206210
"`track` was not properly inlined in `main`\n" + diffInstructions(instructions, expected))
@@ -241,21 +245,23 @@ class InlineBytecodeTests extends DottyBytecodeTest {
241245
val expected =
242246
List(
243247
Label(0),
244-
LineNumber(13, Label(0)), // Position of the method start
245-
LineNumber(14, Label(0)), // Position of the call to `track`
248+
LineNumber(13, Label(0)),
249+
LineNumber(3, Label(0)),
246250
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
247251
Ldc(LDC, "tracking2"),
248252
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println", "(Ljava/lang/Object;)V", false),
253+
Label(6),
254+
LineNumber(3, Label(6)),
249255
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
250256
Ldc(LDC, "tracking2"),
251257
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println", "(Ljava/lang/Object;)V", false),
252-
Label(9),
253-
LineNumber(15, Label(9)), // Actual position
258+
Label(11),
259+
LineNumber(15, Label(11)),
254260
Field(GETSTATIC, "scala/Predef$", "MODULE$", "Lscala/Predef$;"),
255261
Ldc(LDC, "abc"),
256262
Invoke(INVOKEVIRTUAL, "scala/Predef$", "println","(Ljava/lang/Object;)V", false),
257263
Op(RETURN),
258-
Label(15)
264+
Label(17)
259265
)
260266
assert(instructions == expected,
261267
"`track` was not properly inlined in `main`\n" + diffInstructions(instructions, expected))

tests/run/i4947.check

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
track: Test$.main(i4947.scala:14)
2-
track: Test$.main(i4947.scala:14)
1+
track: Test$.main(i4947.scala:4)
2+
track: Test$.main(i4947.scala:5)
33
main1: Test$.main(i4947.scala:15)
44
main2: Test$.main(i4947.scala:16)

0 commit comments

Comments
 (0)