From 77df0f28bf1d00ce19fead1edec699cb503cbc4f Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 5 May 2017 21:46:59 +0300 Subject: [PATCH] Fix generation of JS source maps for class properties --- .../kotlin/js/test/JsLineNumberTestGenerated.java | 12 ++++++++++++ .../js/translate/declaration/ClassTranslator.kt | 3 ++- .../js/translate/initializer/InitializerUtils.java | 9 ++++++--- .../kotlin/js/translate/utils/JsAstUtils.java | 10 ++++++++-- .../testData/lineNumbers/delegateMemberVal.kt | 10 ++++++++++ .../testData/lineNumbers/valParameter.kt | 10 ++++++++++ 6 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 js/js.translator/testData/lineNumbers/delegateMemberVal.kt create mode 100644 js/js.translator/testData/lineNumbers/valParameter.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 ca6ba2bcdb3..bc576584049 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 @@ -48,6 +48,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("delegateMemberVal.kt") + public void testDelegateMemberVal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/delegateMemberVal.kt"); + doTest(fileName); + } + @TestMetadata("inlining.kt") public void testInlining() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/inlining.kt"); @@ -95,4 +101,10 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/syntheticCodeInEnums.kt"); doTest(fileName); } + + @TestMetadata("valParameter.kt") + public void testValParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/valParameter.kt"); + doTest(fileName); + } } 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 eca99435493..943644723f3 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,8 @@ class ClassTranslator private constructor( function.parameters.add(i, JsParameter(name)) if (fieldName != null && constructor == primaryConstructor) { - additionalStatements += JsAstUtils.defineSimpleProperty(fieldName.ident, name.makeRef()) + val source = (capturedVar as? DeclarationDescriptorWithSource)?.source + additionalStatements += JsAstUtils.defineSimpleProperty(fieldName.ident, name.makeRef(), source) } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerUtils.java index 282816a6560..98321034bf7 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/InitializerUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; +import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import static org.jetbrains.kotlin.js.translate.utils.TranslationUtils.assignmentToBackingField; @@ -37,7 +38,9 @@ public final class InitializerUtils { @NotNull PropertyDescriptor descriptor, @NotNull JsExpression value ) { - return assignmentToBackingField(context, descriptor, value).makeStmt(); + JsExpression assignment = assignmentToBackingField(context, descriptor, value); + assignment.setSource(KotlinSourceElementKt.getPsi(descriptor.getSource())); + return assignment.makeStmt(); } @Nullable @@ -46,6 +49,6 @@ public final class InitializerUtils { @NotNull JsExpression value ) { String name = descriptor.getName().asString(); - return JsAstUtils.defineSimpleProperty(Namer.getDelegateName(name), value); + return JsAstUtils.defineSimpleProperty(Namer.getDelegateName(name), value, descriptor.getSource()); } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java index 8615b514735..ce7506ca991 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsAstUtils.java @@ -20,10 +20,12 @@ import com.intellij.util.SmartList; import kotlin.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.descriptors.SourceElement; import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind; import org.jetbrains.kotlin.js.translate.context.Namer; +import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.types.expressions.OperatorConventions; import org.jetbrains.kotlin.util.OperatorNameConventions; @@ -466,8 +468,12 @@ public final class JsAstUtils { } @NotNull - public static JsStatement defineSimpleProperty(@NotNull String name, @NotNull JsExpression value) { - return assignment(new JsNameRef(name, new JsThisRef()), value).makeStmt(); + public static JsStatement defineSimpleProperty(@NotNull String name, @NotNull JsExpression value, @Nullable SourceElement source) { + JsExpression assignment = assignment(new JsNameRef(name, new JsThisRef()), value); + if (source != null) { + assignment.setSource(KotlinSourceElementKt.getPsi(source)); + } + return assignment.makeStmt(); } @NotNull diff --git a/js/js.translator/testData/lineNumbers/delegateMemberVal.kt b/js/js.translator/testData/lineNumbers/delegateMemberVal.kt new file mode 100644 index 00000000000..84b07e61782 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/delegateMemberVal.kt @@ -0,0 +1,10 @@ +class A { + val z by + lazy { 23 } +} + +fun foo() { + println(A().z) +} + +// LINES: 2 3 * 3 * 7 diff --git a/js/js.translator/testData/lineNumbers/valParameter.kt b/js/js.translator/testData/lineNumbers/valParameter.kt new file mode 100644 index 00000000000..842d101be60 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/valParameter.kt @@ -0,0 +1,10 @@ +class A( + val x: Int, + val y: String +) + +fun foo() { + A(23, "foo") +} + +// LINES: 2 3 * 7 \ No newline at end of file