Fix JS source maps for while/do..while statements

This commit is contained in:
Alexey Andreev
2017-05-12 14:56:20 +03:00
parent 413ac40c25
commit 1111f2d5cd
5 changed files with 52 additions and 5 deletions
@@ -66,6 +66,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {
doTest(fileName);
}
@TestMetadata("doWhileWithComplexCondition.kt")
public void testDoWhileWithComplexCondition() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt");
doTest(fileName);
}
@TestMetadata("for.kt")
public void testFor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/for.kt");
@@ -185,4 +191,10 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/whenIs.kt");
doTest(fileName);
}
@TestMetadata("whileWithComplexCondition.kt")
public void testWhileWithComplexCondition() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt");
doTest(fileName);
}
}
@@ -60,6 +60,7 @@ class LineCollector : RecursiveJsVisitor() {
override fun visitIf(x: JsIf) {
withStatement(x) {
handleNodeLocation(x)
x.ifExpression.accept(this)
}
x.thenStatement.accept(this)
@@ -68,6 +69,7 @@ class LineCollector : RecursiveJsVisitor() {
override fun visitWhile(x: JsWhile) {
withStatement(x) {
handleNodeLocation(x)
x.condition.accept(this)
}
x.body.accept(this)
@@ -75,6 +77,7 @@ class LineCollector : RecursiveJsVisitor() {
override fun visitDoWhile(x: JsDoWhile) {
withStatement(x) {
handleNodeLocation(x)
x.condition.accept(this)
}
x.body.accept(this)
@@ -51,17 +51,18 @@ fun createWhile(doWhile: Boolean, expression: KtWhileExpressionBase, context: Tr
JsEmpty
if (!conditionBlock.isEmpty) {
val breakIfConditionIsFalseStatement = JsIf(not(jsCondition), JsBreak())
val breakIfConditionIsFalseStatement = JsIf(not(jsCondition), JsBreak().apply { source = expression })
.apply { source = expression }
val bodyBlock = convertToBlock(bodyStatement)
jsCondition = JsBooleanLiteral(true)
if (doWhile) {
// translate to: tmpSecondRun = false;
// do { if(tmpSecondRun) { <expr> if(!tmpExprVar) break; } else tmpSecondRun=true; <body> } while(true)
val secondRun = context.defineTemporary(JsBooleanLiteral(false))
val secondRun = context.defineTemporary(JsBooleanLiteral(false).source(expression))
conditionBlock.statements.add(breakIfConditionIsFalseStatement)
val ifStatement = JsIf(secondRun, conditionBlock, assignment(secondRun, JsBooleanLiteral(true)).makeStmt())
bodyBlock.statements.add(0, ifStatement)
val ifStatement = JsIf(secondRun, conditionBlock, assignment(secondRun, JsBooleanLiteral(true)).source(expression).makeStmt())
bodyBlock.statements.add(0, ifStatement.apply { source = expression })
}
else {
conditionBlock.statements.add(breakIfConditionIsFalseStatement)
@@ -74,7 +75,7 @@ fun createWhile(doWhile: Boolean, expression: KtWhileExpressionBase, context: Tr
val result = if (doWhile) JsDoWhile() else JsWhile()
result.condition = jsCondition
result.body = bodyStatement
return result.source(expression)!!
return result.source(expression)
}
fun translateForExpression(expression: KtForExpression, context: TranslationContext): JsStatement {
@@ -0,0 +1,16 @@
fun box() {
var i = 0
do {
println("body: $i")
}
while(
try {
i++
}
finally {
println("finally: $i")
} < i
)
}
// LINES: 8 3 2 3 3 3 8 11 3 7 12 3 3 4
@@ -0,0 +1,15 @@
fun box() {
var i = 0
while(
try {
i++
}
finally {
println("finally: $i")
} < i
) {
println("body: $i")
}
}
// LINES: 5 2 3 5 8 3 4 9 3 11