From 38e50e964a382336e5973e0dc8b687920d3ebfc5 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 17 Nov 2017 14:50:40 +0300 Subject: [PATCH] JS: fix generation of source map for inline lambda with ignored result See KT-21309 --- .../util/rewriters/ReturnReplacingVisitor.kt | 7 +++-- .../js/test/JsLineNumberTestGenerated.java | 6 +++++ .../lastExpressionInInlineLambda.kt | 27 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/lineNumbers/lastExpressionInInlineLambda.kt diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt index 2e3c40cb5a8..548a6fe9b54 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/ReturnReplacingVisitor.kt @@ -49,7 +49,10 @@ class ReturnReplacingVisitor( if (returnExpression != null && returnExpression.isTailCallSuspend) { returnReplacement.isSuspend = true } - ctx.addNext(JsExpressionStatement(returnReplacement.apply { source = x.source })) + if (returnReplacement.source == null) { + returnReplacement.source = x.source + } + ctx.addNext(JsExpressionStatement(returnReplacement)) } if (breakLabel != null) { @@ -70,7 +73,7 @@ class ReturnReplacingVisitor( } } - fun processCoroutineResult(expression: JsExpression?): JsExpression? { + private fun processCoroutineResult(expression: JsExpression?): JsExpression? { if (!isSuspend) return expression if (expression != null && expression.isTailCallSuspend) return expression val lhs = JsNameRef("\$\$coroutineResult\$\$", JsAstUtils.stateMachineReceiver()).apply { coroutineResult = true } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java index d6a8c96ed89..bcffa647fd6 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsLineNumberTestGenerated.java @@ -228,6 +228,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("lastExpressionInInlineLambda.kt") + public void testLastExpressionInInlineLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/lastExpressionInInlineLambda.kt"); + doTest(fileName); + } + @TestMetadata("literals.kt") public void testLiterals() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/literals.kt"); diff --git a/js/js.translator/testData/lineNumbers/lastExpressionInInlineLambda.kt b/js/js.translator/testData/lineNumbers/lastExpressionInInlineLambda.kt new file mode 100644 index 00000000000..cdf298b36bd --- /dev/null +++ b/js/js.translator/testData/lineNumbers/lastExpressionInInlineLambda.kt @@ -0,0 +1,27 @@ +fun foo() { + bar { + try { + baz() + } + catch (e: RuntimeException) { + e.toString() + } + } + + bar { + when (boo()) { + "boo" -> baz() + else -> "111" + } + } +} + +inline fun bar(x: () -> String): String { + return x() +} + +fun baz() = "baz" + +fun boo() = "boo" + +// LINES: 17 4 6 6 7 7 3 3 3 * 13 12 13 13 14 21 20 20 23 23 23 25 25 25 \ No newline at end of file