From 13795b47fb4f42a7300fa4a1f83daa6592177ab1 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 12 May 2017 18:22:25 +0300 Subject: [PATCH] Fix JS source maps for initialization of variables captured by class --- .../js/test/JsLineNumberTestGenerated.java | 12 ++++++++++++ .../js/translate/declaration/ClassTranslator.kt | 2 +- .../initializer/ClassInitializerTranslator.java | 2 +- .../lineNumbers/classCapturingLocals.kt | 17 +++++++++++++++++ .../testData/lineNumbers/innerClass.kt | 9 +++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/lineNumbers/classCapturingLocals.kt create mode 100644 js/js.translator/testData/lineNumbers/innerClass.kt 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 39a359c7a0a..4bb05ec45b0 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 @@ -54,6 +54,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("classCapturingLocals.kt") + public void testClassCapturingLocals() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/classCapturingLocals.kt"); + doTest(fileName); + } + @TestMetadata("closure.kt") public void testClosure() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/closure.kt"); @@ -114,6 +120,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("innerClass.kt") + public void testInnerClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/innerClass.kt"); + doTest(fileName); + } + @TestMetadata("lambdaWithClosure.kt") public void testLambdaWithClosure() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/lambdaWithClosure.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt index 9acc3156106..b8b295a16c3 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/ClassTranslator.kt @@ -380,7 +380,7 @@ class ClassTranslator private constructor( function.parameters.add(i, JsParameter(name)) if (fieldName != null && constructor == primaryConstructor) { - val source = (capturedVar as? DeclarationDescriptorWithSource)?.source + val source = (constructor.descriptor as? DeclarationDescriptorWithSource)?.source additionalStatements += JsAstUtils.defineSimpleProperty(fieldName.ident, name.makeRef(), source) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index 5f11cbbb9ed..26796fec545 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -142,7 +142,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { initFunction.getParameters().add(0, new JsParameter(outerName)); JsExpression paramRef = pureFqn(outerName, null); - JsExpression assignment = JsAstUtils.assignment(pureFqn(outerName, new JsThisRef()), paramRef); + JsExpression assignment = JsAstUtils.assignment(pureFqn(outerName, new JsThisRef()), paramRef).source(classDeclaration); initFunction.getBody().getStatements().add(new JsExpressionStatement(assignment)); } diff --git a/js/js.translator/testData/lineNumbers/classCapturingLocals.kt b/js/js.translator/testData/lineNumbers/classCapturingLocals.kt new file mode 100644 index 00000000000..b03d2086d4b --- /dev/null +++ b/js/js.translator/testData/lineNumbers/classCapturingLocals.kt @@ -0,0 +1,17 @@ +class A + +fun A.foo() { + val x = baz() + class B { + fun bar() { + println(this@foo) + println("A.B.bar: $x") + } + } + println("A.foo: $x") + B().bar() +} + +fun baz() = 23 + +// LINES: 5 5 7 8 * 4 11 12 15 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/innerClass.kt b/js/js.translator/testData/lineNumbers/innerClass.kt new file mode 100644 index 00000000000..c8969ca1cf2 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/innerClass.kt @@ -0,0 +1,9 @@ +class A(val x: Int) { + inner class B { + fun foo() { + println(x) + } + } +} + +// LINES: 1 2 4 \ No newline at end of file