From d3d694fc5e3f9080ea52b8c2575d101aed836276 Mon Sep 17 00:00:00 2001 From: Florian3k Date: Thu, 28 Jul 2022 11:43:54 +0200 Subject: [PATCH] Fix ValDef span assignment in PatternMatcher --- .../tools/dotc/transform/PatternMatcher.scala | 3 +- .../backend/jvm/DottyBytecodeTests.scala | 84 +++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala b/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala index 0e4e32be52dd..d74045cd2a21 100644 --- a/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala +++ b/compiler/src/dotty/tools/dotc/transform/PatternMatcher.scala @@ -932,7 +932,8 @@ object PatternMatcher { } emitWithMashedConditions(plan :: Nil) case LetPlan(sym, body) => - seq(ValDef(sym, initializer(sym).ensureConforms(sym.info)) :: Nil, emit(body)) + val valDef = ValDef(sym, initializer(sym).ensureConforms(sym.info)).withSpan(sym.span) + seq(valDef :: Nil, emit(body)) case LabeledPlan(label, expr) => Labeled(label, emit(expr)) case ReturnPlan(label) => diff --git a/compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala b/compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala index d21cf929b840..520a4d0192c0 100644 --- a/compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala +++ b/compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala @@ -1577,6 +1577,90 @@ class DottyBytecodeTests extends DottyBytecodeTest { testSig("bar", "()I") } } + + @Test def i15535 = { + // primary goal of this test is to check that `LineNumber` have correct numbers + val source = + """object Main { + | def m(x: Int): Unit = { + | x match { + | case y => + | println(y) + | println(y) + | } + | } + |} + """.stripMargin + + checkBCode(source) { dir => + val clsIn = dir.lookupName("Main$.class", directory = false).input + val clsNode = loadClassNode(clsIn, skipDebugInfo = false) + val method = getMethod(clsNode, "m") + val instructions = instructionsFromMethod(method).filter(_.isInstanceOf[LineNumber]) + + val expected = List( + LineNumber(2, Label(0)), + LineNumber(3, Label(0)), + LineNumber(4, Label(5)), // case y => + LineNumber(5, Label(9)), + LineNumber(6, Label(15)), + ) + + assertSameCode(instructions, expected) + } + } + + @Test def i15535_2 = { + // primary goal of this test is to check that `LineNumber` have correct numbers + val source = + """object Main { + | def m(x: Matchable): Unit = { + | x match { + | case a if a == 3 => + | println(a) + | println(a) + | case b: Int => + | println(b) + | println(b) + | case c @ Left(l) => + | println(l) + | println(c) + | case d => + | println(d) + | println(d) + | println(d) + | } + | } + |} + """.stripMargin + + checkBCode(source) { dir => + val clsIn = dir.lookupName("Main$.class", directory = false).input + val clsNode = loadClassNode(clsIn, skipDebugInfo = false) + val method = getMethod(clsNode, "m") + val instructions = instructionsFromMethod(method).filter(_.isInstanceOf[LineNumber]) + + val expected = List( + LineNumber(2, Label(0)), + LineNumber(3, Label(0)), + LineNumber(4, Label(5)), // case a if a == 3 => + LineNumber(5, Label(15)), + LineNumber(6, Label(20)), + LineNumber(7, Label(26)), // case b: Int => + LineNumber(8, Label(35)), + LineNumber(9, Label(41)), + LineNumber(10, Label(48)), // case c @ Left(l) => + LineNumber(11, Label(63)), + LineNumber(12, Label(68)), + LineNumber(13, Label(74)), // case d => + LineNumber(14, Label(79)), + LineNumber(15, Label(84)), + LineNumber(16, Label(89)), + ) + + assertSameCode(instructions, expected) + } + } } object invocationReceiversTestCode {