Skip to content

Commit 784403f

Browse files
committed
Fixed 2 identical consecutive inlines generates wrong line number
1 parent 8e8ec25 commit 784403f

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

compiler/src/dotty/tools/dotc/inlines/Inlines.scala

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@ package dotty.tools
22
package dotc
33
package inlines
44

5-
import ast.*, core.*
6-
import Flags.*, Symbols.*, Types.*, Decorators.*, Constants.*, Contexts.*
5+
import ast.{tpd, *}
6+
import core.*
7+
import Flags.*
8+
import Symbols.*
9+
import Types.*
10+
import Decorators.*
11+
import Constants.*
12+
import Contexts.*
713
import StdNames.tpnme
8-
import transform.SymUtils._
14+
import transform.SymUtils.*
915
import typer.*
1016
import NameKinds.BodyRetainerName
1117
import SymDenotations.SymDenotation
1218
import config.Printers.inlining
1319
import ErrorReporting.errorTree
14-
import dotty.tools.dotc.util.{SourceFile, SourcePosition, SrcPos, Property}
20+
import dotty.tools.dotc.ast.tpd.{cpy, inlineContext}
21+
import dotty.tools.dotc.util.{Property, SourceFile, SourcePosition, SrcPos}
1522
import parsing.Parsers.Parser
1623
import transform.{PostTyper, Inlining, CrossVersionChecks}
1724
import staging.StagingLevel
@@ -30,7 +37,7 @@ object Inlines:
3037
private[dotc] class MissingInlineInfo extends Exception
3138

3239
object InliningPosition extends Property.StickyKey[InliningPosition]
33-
case class InliningPosition(sourcePos: SourcePosition, topLevelSymbol: Option[Symbol])
40+
case class InliningPosition(targetPos: List[(SourcePosition, Option[Symbol])])
3441

3542
/** `sym` is an inline method with a known body to inline.
3643
*/
@@ -245,9 +252,20 @@ object Inlines:
245252
/** Replace `Inlined` node by a block that contains its bindings and expansion */
246253
def dropInlined(inlined: Inlined)(using Context): Tree =
247254
val topLevelClass = Option.when(!inlined.call.isEmpty)(inlined.call.symbol.topLevelClass)
248-
val inliningPosition = InliningPosition(inlined.sourcePos, topLevelClass)
249-
val withPos = inlined.expansion.withAttachment(InliningPosition, inliningPosition)
250-
if inlined.bindings.isEmpty then withPos else cpy.Block(inlined)(inlined.bindings, withPos)
255+
val position = (inlined.sourcePos, topLevelClass)
256+
val withPos =
257+
if inlined.expansion.hasAttachment(InliningPosition) then
258+
val att = InliningPosition(position :: inlined.expansion.getAttachment(InliningPosition).get.targetPos)
259+
inlined.expansion.withAttachment(InliningPosition, att)
260+
else
261+
inlined.expansion.withAttachment(InliningPosition, InliningPosition(List(position)))
262+
263+
if inlined.bindings.isEmpty then
264+
withPos
265+
else
266+
cpy.Block(inlined)(inlined.bindings, withPos)
267+
268+
251269

252270
/** Leave only a call trace consisting of
253271
* - a reference to the top-level class from which the call was inlined,

0 commit comments

Comments
 (0)