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 042c9d4e2db..39a359c7a0a 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,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/lineNumbers"), Pattern.compile("^([^_](.+))\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("andAndWithSideEffect.kt") + public void testAndAndWithSideEffect() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt"); + doTest(fileName); + } + @TestMetadata("catch.kt") public void testCatch() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/catch.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java index dce4aa58897..1cf17d950db 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java @@ -201,7 +201,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator { assert operationToken.equals(KtTokens.ANDAND) || operationToken.equals(KtTokens.OROR) : "Unsupported binary operation: " + expression.getText(); boolean isOror = operationToken.equals(KtTokens.OROR); - JsExpression literalResult = new JsBooleanLiteral(isOror); + JsExpression literalResult = new JsBooleanLiteral(isOror).source(rightKtExpression); leftExpression = isOror ? not(leftExpression) : leftExpression; JsIf ifStatement; @@ -211,9 +211,11 @@ public final class BinaryOperationTranslator extends AbstractTranslator { result = rightExpression; // Reuse tmp variable } else { result = context().declareTemporary(null).reference(); - rightBlock.getStatements().add(JsAstUtils.asSyntheticStatement(JsAstUtils.assignment(result, rightExpression))); + JsExpression rightAssignment = JsAstUtils.assignment(result.deepCopy(), rightExpression).source(rightKtExpression); + rightBlock.getStatements().add(JsAstUtils.asSyntheticStatement(rightAssignment)); } - JsStatement assignmentStatement = JsAstUtils.asSyntheticStatement(JsAstUtils.assignment(result, literalResult)); + JsStatement assignmentStatement = JsAstUtils.asSyntheticStatement( + JsAstUtils.assignment(result.deepCopy(), literalResult).source(rightKtExpression)); ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock, assignmentStatement); MetadataProperties.setSynthetic(ifStatement, true); } @@ -221,6 +223,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator { ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock); result = new JsNullLiteral(); } + ifStatement.source(expression); context().addStatementToCurrentBlock(ifStatement); return result; } diff --git a/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt b/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt new file mode 100644 index 00000000000..31b1c940ce1 --- /dev/null +++ b/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt @@ -0,0 +1,9 @@ +fun box(x: Int, y: Int) { + println( + try { foo(x) } finally { println(x) } > 10 && + try { foo(y) } finally { println(y) } > 20) +} + +fun foo(x: Int) = x + +// LINES: 3 3 3 4 4 4 4 2 3 7 \ No newline at end of file