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);
|
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")
|
@TestMetadata("catch.kt")
|
||||||
public void testCatch() throws Exception {
|
public void testCatch() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/catch.kt");
|
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();
|
assert operationToken.equals(KtTokens.ANDAND) || operationToken.equals(KtTokens.OROR) : "Unsupported binary operation: " + expression.getText();
|
||||||
boolean isOror = operationToken.equals(KtTokens.OROR);
|
boolean isOror = operationToken.equals(KtTokens.OROR);
|
||||||
JsExpression literalResult = new JsBooleanLiteral(isOror);
|
JsExpression literalResult = new JsBooleanLiteral(isOror).source(rightKtExpression);
|
||||||
leftExpression = isOror ? not(leftExpression) : leftExpression;
|
leftExpression = isOror ? not(leftExpression) : leftExpression;
|
||||||
|
|
||||||
JsIf ifStatement;
|
JsIf ifStatement;
|
||||||
@@ -211,9 +211,11 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
result = rightExpression; // Reuse tmp variable
|
result = rightExpression; // Reuse tmp variable
|
||||||
} else {
|
} else {
|
||||||
result = context().declareTemporary(null).reference();
|
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);
|
ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock, assignmentStatement);
|
||||||
MetadataProperties.setSynthetic(ifStatement, true);
|
MetadataProperties.setSynthetic(ifStatement, true);
|
||||||
}
|
}
|
||||||
@@ -221,6 +223,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator {
|
|||||||
ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock);
|
ifStatement = JsAstUtils.newJsIf(leftExpression, rightBlock);
|
||||||
result = new JsNullLiteral();
|
result = new JsNullLiteral();
|
||||||
}
|
}
|
||||||
|
ifStatement.source(expression);
|
||||||
context().addStatementToCurrentBlock(ifStatement);
|
context().addStatementToCurrentBlock(ifStatement);
|
||||||
return result;
|
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