From 4332f1cb2ca43ec6aee085a40b702886e08ffc90 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 2 May 2017 19:44:00 +0300 Subject: [PATCH] Don't share instances of JsNameRef nodes to avoid wrong source maps When to name references to the same name are represented by a shared JS AST node, setting line number of the second usage may override line number of the first usage. Also, supply more JS AST nodes related to default parameters, with corresponding source information. --- .../kotlin/js/test/JsLineNumberTestGenerated.java | 12 ++++++++++++ .../js/translate/context/TranslationContext.java | 5 +++-- .../translate/utils/FunctionBodyTranslator.java | 4 +++- .../testData/lineNumbers/multipleReferences.kt | 15 +++++++++++++++ .../testData/lineNumbers/optionalArgs.kt | 10 ++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 js/js.translator/testData/lineNumbers/multipleReferences.kt create mode 100644 js/js.translator/testData/lineNumbers/optionalArgs.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 61588b1ae7e..c42eff26d15 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,18 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("multipleReferences.kt") + public void testMultipleReferences() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/multipleReferences.kt"); + doTest(fileName); + } + + @TestMetadata("optionalArgs.kt") + public void testOptionalArgs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/optionalArgs.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/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index 8342a7c21d8..facfebe4923 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.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. @@ -390,7 +390,8 @@ public class TranslationContext { return nameRef; } - return aliasingContext.getAliasForDescriptor(descriptor); + JsExpression alias = aliasingContext.getAliasForDescriptor(descriptor); + return alias != null ? alias.deepCopy() : null; } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java index 92da07466bc..db89d45b9ef 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/FunctionBodyTranslator.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 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. @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.js.translate.general.Translation; import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator; import org.jetbrains.kotlin.psi.KtDeclarationWithBody; import org.jetbrains.kotlin.psi.KtExpression; +import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import org.jetbrains.kotlin.types.KotlinType; import java.util.ArrayList; @@ -86,6 +87,7 @@ public final class FunctionBodyTranslator extends AbstractTranslator { JsStatement assignStatement = assignment(jsNameRef, defaultValue).makeStmt(); JsStatement thenStatement = JsAstUtils.mergeStatementInBlockIfNeeded(assignStatement, defaultArgBlock); JsBinaryOperation checkArgIsUndefined = equality(jsNameRef, Namer.getUndefinedExpression()); + checkArgIsUndefined.source(KotlinSourceElementKt.getPsi(valueParameter.getSource())); JsIf jsIf = JsAstUtils.newJsIf(checkArgIsUndefined, thenStatement); result.add(jsIf); } diff --git a/js/js.translator/testData/lineNumbers/multipleReferences.kt b/js/js.translator/testData/lineNumbers/multipleReferences.kt new file mode 100644 index 00000000000..d4d72176b26 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/multipleReferences.kt @@ -0,0 +1,15 @@ +fun box(x: Int) { + println(x) + println("split") + println(x) + + println(O.y) + println("split") + println(O.y) +} + +object O { + val y = 23 +} + +// LINES: 2 3 4 6 7 8 12 diff --git a/js/js.translator/testData/lineNumbers/optionalArgs.kt b/js/js.translator/testData/lineNumbers/optionalArgs.kt new file mode 100644 index 00000000000..c5e2f72196a --- /dev/null +++ b/js/js.translator/testData/lineNumbers/optionalArgs.kt @@ -0,0 +1,10 @@ +fun box( + x: Int = 23, + y: Int = + 42 +) { + println(x) + println(y) +} + +// LINES: 2 2 3 4 6 7 \ No newline at end of file