Fix JS source maps for for statements

This commit is contained in:
Alexey Andreev
2017-05-12 14:32:43 +03:00
parent d7a10750e0
commit 413ac40c25
3 changed files with 55 additions and 13 deletions
@@ -66,6 +66,12 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("for.kt")
public void testFor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/for.kt");
doTest(fileName);
}
@TestMetadata("increment.kt") @TestMetadata("increment.kt")
public void testIncrement() throws Exception { public void testIncrement() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/increment.kt"); String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/increment.kt");
@@ -96,12 +102,24 @@ public class JsLineNumberTestGenerated extends AbstractJsLineNumberTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("lambdaWithClosure.kt")
public void testLambdaWithClosure() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/lambdaWithClosure.kt");
doTest(fileName);
}
@TestMetadata("literals.kt") @TestMetadata("literals.kt")
public void testLiterals() throws Exception { public void testLiterals() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/literals.kt"); String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/literals.kt");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("longLiteral.kt")
public void testLongLiteral() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/longLiteral.kt");
doTest(fileName);
}
@TestMetadata("memberFunWithDefaultParam.kt") @TestMetadata("memberFunWithDefaultParam.kt")
public void testMemberFunWithDefaultParam() throws Exception { public void testMemberFunWithDefaultParam() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt"); String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/lineNumbers/memberFunWithDefaultParam.kt");
@@ -145,16 +145,17 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
val rangeEnd = context.defineTemporary(rightExpression) val rangeEnd = context.defineTemporary(rightExpression)
val body = translateBody(null) val body = translateBody(null)
val conditionExpression = lessThanEq(parameterName.makeRef(), rangeEnd) val conditionExpression = lessThanEq(parameterName.makeRef(), rangeEnd).source(expression)
val incrementExpression = JsPostfixOperation(JsUnaryOperator.INC, parameterName.makeRef()) val incrementExpression = JsPostfixOperation(JsUnaryOperator.INC, parameterName.makeRef()).source(expression)
val initVars = newVar(parameterName, rangeStart).apply { source = expression }
return JsFor(newVar(parameterName, rangeStart), conditionExpression, incrementExpression, body) return JsFor(initVars, conditionExpression, incrementExpression, body)
} }
fun translateForOverRange(): JsStatement { fun translateForOverRange(): JsStatement {
val rangeExpression = context.defineTemporary(Translation.translateAsExpression(loopRange, context)) val rangeExpression = context.defineTemporary(Translation.translateAsExpression(loopRange, context))
fun getProperty(funName: String): JsExpression = JsNameRef(funName, rangeExpression) fun getProperty(funName: String): JsExpression = JsNameRef(funName, rangeExpression).source(loopRange)
val start = context.defineTemporary(getProperty("first")) val start = context.defineTemporary(getProperty("first"))
val end = context.defineTemporary(getProperty("last")) val end = context.defineTemporary(getProperty("last"))
@@ -162,10 +163,11 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
val body = translateBody(null) val body = translateBody(null)
val conditionExpression = lessThanEq(parameterName.makeRef(), end) val conditionExpression = lessThanEq(parameterName.makeRef(), end).source(expression)
val incrementExpression = addAssign(parameterName.makeRef(), increment) val incrementExpression = addAssign(parameterName.makeRef(), increment).source(expression)
val initVars = newVar(parameterName, start).apply { source = expression }
return JsFor(newVar(parameterName, start), conditionExpression, incrementExpression, body) return JsFor(initVars, conditionExpression, incrementExpression, body)
} }
fun translateForOverArray(): JsStatement { fun translateForOverArray(): JsStatement {
@@ -174,11 +176,11 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
val end = context.defineTemporary(length) val end = context.defineTemporary(length)
val index = context.declareTemporary(JsIntLiteral(0)) val index = context.declareTemporary(JsIntLiteral(0))
val arrayAccess = JsArrayAccess(rangeExpression, index.reference()) val arrayAccess = JsArrayAccess(rangeExpression, index.reference()).source(expression)
val body = translateBody(arrayAccess) val body = translateBody(arrayAccess)
val initExpression = assignment(index.reference(), JsIntLiteral(0)) val initExpression = assignment(index.reference(), JsIntLiteral(0)).source(expression)
val conditionExpression = inequality(index.reference(), end) val conditionExpression = inequality(index.reference(), end).source(expression)
val incrementExpression = JsPrefixOperation(JsUnaryOperator.INC, index.reference()) val incrementExpression = JsPrefixOperation(JsUnaryOperator.INC, index.reference()).source(expression)
return JsFor(initExpression, conditionExpression, incrementExpression, body) return JsFor(initExpression, conditionExpression, incrementExpression, body)
} }
@@ -216,7 +218,7 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
} }
else { else {
bodyStatements += hasNextBlock.statements bodyStatements += hasNextBlock.statements
bodyStatements += JsIf(notOptimized(hasNextInvocation), JsBreak()) bodyStatements += JsIf(notOptimized(hasNextInvocation), JsBreak().apply { source = expression }).apply { source = expression }
JsBooleanLiteral(true) JsBooleanLiteral(true)
} }
bodyStatements += nextBlock.statements bodyStatements += nextBlock.statements
@@ -224,7 +226,7 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
return JsWhile(exitCondition, bodyStatements.singleOrNull() ?: JsBlock(bodyStatements)) return JsWhile(exitCondition, bodyStatements.singleOrNull() ?: JsBlock(bodyStatements))
} }
return when { val result = when {
isForOverRangeLiteral() -> isForOverRangeLiteral() ->
translateForOverLiteralRange() translateForOverLiteralRange()
@@ -237,4 +239,6 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont
else -> else ->
translateForOverIterator() translateForOverIterator()
} }
return result.apply { source = expression }
} }
+20
View File
@@ -0,0 +1,20 @@
fun box() {
for (x in arrayOf(1, 2, 3)) {
println(x)
}
for (x in 1..10) {
println(x)
}
for (x in listOf(1, 2, 3)) {
println(x)
}
val xs = listOf(1, 2, 3)
for (x in xs.indices) {
println(x)
}
}
// LINES: 2 10 15 2 2 2 3 6 6 7 10 10 10 11 14 15 15 15 15 15 15 16