From e5662ac2ad97e7b30ff0c23e1a1401feb58afcff Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 2 May 2017 19:13:56 +0300 Subject: [PATCH] Copy location info when copying JS AST subtrees This is necessary to preserve source information of a function's body after inlining. --- .../kotlin/js/backend/ast/AbstractNode.java | 6 +++++- .../js/test/JsLineNumberTestGenerated.java | 12 ++++++++++++ .../testData/lineNumbers/inlining.kt | 14 ++++++++++++++ .../lineNumbers/inliningWithLambda.kt | 19 +++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/lineNumbers/inlining.kt create mode 100644 js/js.translator/testData/lineNumbers/inliningWithLambda.kt diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/AbstractNode.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/AbstractNode.java index fe08e840677..d0c2aa0ee82 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/AbstractNode.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/AbstractNode.java @@ -28,8 +28,12 @@ abstract class AbstractNode extends HasMetadata implements JsNode { return out.toString(); } - protected T withMetadataFrom(T other) { + protected T withMetadataFrom(T other) { this.copyMetadataFrom(other); + Object otherSource = other.getSource(); + if (otherSource != null) { + source(otherSource); + } //noinspection unchecked return (T) this; } 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 1edb4afa486..61588b1ae7e 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 @@ -36,6 +36,18 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/lineNumbers"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("inlining.kt") + public void testInlining() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/inlining.kt"); + doTest(fileName); + } + + @TestMetadata("inliningWithLambda.kt") + public void testInliningWithLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/inliningWithLambda.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/simple.kt"); diff --git a/js/js.translator/testData/lineNumbers/inlining.kt b/js/js.translator/testData/lineNumbers/inlining.kt new file mode 100644 index 00000000000..897026381dd --- /dev/null +++ b/js/js.translator/testData/lineNumbers/inlining.kt @@ -0,0 +1,14 @@ +fun box() { + println("1") + bar() + println("2") + bar() + println("3") +} + +inline fun bar() { + println("bar1") + println("bar2") +} + +// LINES: 2 10 11 4 10 11 6 10 11 diff --git a/js/js.translator/testData/lineNumbers/inliningWithLambda.kt b/js/js.translator/testData/lineNumbers/inliningWithLambda.kt new file mode 100644 index 00000000000..de0e0b8f3fd --- /dev/null +++ b/js/js.translator/testData/lineNumbers/inliningWithLambda.kt @@ -0,0 +1,19 @@ +fun box() { + println("1") + foo { + println("x") + } + println("2") + foo { + println("y") + } + println("3") +} + +inline fun foo(f: () -> Unit) { + println("before") + f() + println("after") +} + +// LINES: 2 14 4 16 6 14 8 16 10 14 15 16 \ No newline at end of file