Fix JS source maps for && expression with complex operands
This commit is contained in:
@@ -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");
|
||||
|
||||
+6
-3
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user