Fix JS source maps for && expression with complex operands

This commit is contained in:
Alexey Andreev
2017-05-12 15:29:01 +03:00
parent 1111f2d5cd
commit bfc3a9c2af
3 changed files with 21 additions and 3 deletions
@@ -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");
@@ -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