From b70c52e41f2da7b303321113453793d686781506 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 15 May 2017 17:45:32 +0300 Subject: [PATCH] Fix JS source maps for optional arguments Also, when function has expression body, use expression instead of function declaration to mark return statement. --- .../kotlin/js/test/JsLineNumberTestGenerated.java | 6 ++++++ .../js/translate/utils/FunctionBodyTranslator.java | 6 ++++-- js/js.translator/testData/lineNumbers/closure.kt | 2 +- .../complexExpressionAsDefaultArgument.kt | 14 ++++++++++++++ js/js.translator/testData/lineNumbers/coroutine.kt | 2 +- .../lineNumbers/expressionAsFunctionBody.kt | 2 +- .../testData/lineNumbers/optionalArgs.kt | 2 +- 7 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.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 8aaa4b0fb04..3e1266eafe9 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 @@ -72,6 +72,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { doTest(fileName); } + @TestMetadata("complexExpressionAsDefaultArgument.kt") + public void testComplexExpressionAsDefaultArgument() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt"); + doTest(fileName); + } + @TestMetadata("coroutine.kt") public void testCoroutine() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/coroutine.kt"); 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 b78a332d6d4..ad6d673302a 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.js.translate.utils; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; @@ -84,7 +85,8 @@ public final class FunctionBodyTranslator extends AbstractTranslator { KtExpression defaultArgument = getDefaultArgument(valueParameter); JsBlock defaultArgBlock = new JsBlock(); JsExpression defaultValue = Translation.translateAsExpression(defaultArgument, functionBodyContext, defaultArgBlock); - JsStatement assignStatement = assignment(jsNameRef, defaultValue).makeStmt(); + PsiElement psi = KotlinSourceElementKt.getPsi(valueParameter.getSource()); + JsStatement assignStatement = assignment(jsNameRef, defaultValue).source(psi).makeStmt(); JsStatement thenStatement = JsAstUtils.mergeStatementInBlockIfNeeded(assignStatement, defaultArgBlock); JsBinaryOperation checkArgIsUndefined = equality(jsNameRef, Namer.getUndefinedExpression()); checkArgIsUndefined.source(KotlinSourceElementKt.getPsi(valueParameter.getSource())); @@ -150,7 +152,7 @@ public final class FunctionBodyTranslator extends AbstractTranslator { } JsReturn jsReturn = new JsReturn((JsExpression) node); - jsReturn.setSource(declaration); + jsReturn.setSource(declaration.getBodyExpression()); MetadataProperties.setReturnTarget(jsReturn, descriptor); return jsReturn; }); diff --git a/js/js.translator/testData/lineNumbers/closure.kt b/js/js.translator/testData/lineNumbers/closure.kt index 8beea4400d5..ddfa7d64ddf 100644 --- a/js/js.translator/testData/lineNumbers/closure.kt +++ b/js/js.translator/testData/lineNumbers/closure.kt @@ -5,4 +5,4 @@ fun box(x: Int, y: Int): Int { return foo(y) } -// LINES: 2 2 4 2 5 \ No newline at end of file +// LINES: 2 4 2 5 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt b/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt new file mode 100644 index 00000000000..34854bb8c26 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt @@ -0,0 +1,14 @@ +fun foo( + a: Int = + when (baz()) { + 1 -> bar(); + else -> 0 + } +): Int = + a + 1 + +fun baz() = 1 + +fun bar() = 2 + +// LINES: 2 3 4 4 5 2 8 10 12 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/coroutine.kt b/js/js.translator/testData/lineNumbers/coroutine.kt index 8bb24b5a05f..c111b2d84a1 100644 --- a/js/js.translator/testData/lineNumbers/coroutine.kt +++ b/js/js.translator/testData/lineNumbers/coroutine.kt @@ -14,4 +14,4 @@ suspend fun bar(): Unit { println(a + b) } -// LINES: 4 5 4 6 4 9 9 9 9 9 9 9 9 * 10 11 11 11 11 11 * 11 12 13 13 13 13 13 13 14 \ No newline at end of file +// LINES: 4 5 5 6 4 9 9 9 9 9 9 9 9 * 10 11 11 11 11 11 * 11 12 13 13 13 13 13 13 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt b/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt index b6fa3159fce..c0553b12149 100644 --- a/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt +++ b/js/js.translator/testData/lineNumbers/expressionAsFunctionBody.kt @@ -4,4 +4,4 @@ fun box() = fun foo() = 23 -// LINES: 1 2 4 5 \ No newline at end of file +// LINES: 2 5 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/optionalArgs.kt b/js/js.translator/testData/lineNumbers/optionalArgs.kt index c5e2f72196a..098dc07b3dc 100644 --- a/js/js.translator/testData/lineNumbers/optionalArgs.kt +++ b/js/js.translator/testData/lineNumbers/optionalArgs.kt @@ -7,4 +7,4 @@ fun box( println(y) } -// LINES: 2 2 3 4 6 7 \ No newline at end of file +// LINES: 2 2 3 3 4 6 7 \ No newline at end of file