From d613124cb19b1637305d1f57c56b4ce438b2caa4 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 23 Jun 2017 12:09:32 +0300 Subject: [PATCH] Generate JS source maps for temporary vars declarations and definitions --- .../js/translate/context/DynamicContext.java | 4 +- .../translate/context/TranslationContext.java | 8 +-- .../js/translate/expression/LoopTranslator.kt | 2 +- .../expression/PatternTranslator.java | 2 +- .../expression/StringTemplateTranslator.java | 2 +- .../js/translate/general/Translation.java | 2 +- .../operation/BinaryOperationTranslator.java | 2 +- .../operation/IncrementTranslator.java | 2 +- .../js/translate/utils/TemporariesUtils.java | 70 ------------------- .../mutator/AssignToExpressionMutator.java | 4 +- .../lineNumbers/andAndWithSideEffect.kt | 2 +- .../complexExpressionAsDefaultArgument.kt | 2 +- .../doWhileWithComplexCondition.kt | 2 +- js/js.translator/testData/lineNumbers/for.kt | 2 +- .../testData/lineNumbers/whenIn.kt | 2 +- .../testData/lineNumbers/whenIs.kt | 2 +- .../lineNumbers/whileWithComplexCondition.kt | 2 +- 17 files changed, 23 insertions(+), 89 deletions(-) delete mode 100644 js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TemporariesUtils.java diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DynamicContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DynamicContext.java index bd61824588d..7b194f67ce9 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DynamicContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/DynamicContext.java @@ -55,15 +55,17 @@ public final class DynamicContext { } @NotNull - public TemporaryVariable declareTemporary(@Nullable JsExpression initExpression) { + public TemporaryVariable declareTemporary(@Nullable JsExpression initExpression, @Nullable Object sourceInfo) { if (vars == null) { vars = new JsVars(); MetadataProperties.setSynthetic(vars, true); currentBlock.getStatements().add(vars); + vars.setSource(sourceInfo); } JsName temporaryName = JsScope.declareTemporary(); JsVar var = new JsVar(temporaryName, null); + var.setSource(sourceInfo); MetadataProperties.setSynthetic(var, true); vars.add(var); if (initExpression != null) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index dca889e7e5a..448760217e1 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -399,13 +399,13 @@ public class TranslationContext { } @NotNull - public TemporaryVariable declareTemporary(@Nullable JsExpression initExpression) { - return dynamicContext.declareTemporary(initExpression); + public TemporaryVariable declareTemporary(@Nullable JsExpression initExpression, @Nullable Object source) { + return dynamicContext.declareTemporary(initExpression, source); } @NotNull public JsExpression defineTemporary(@NotNull JsExpression initExpression) { - TemporaryVariable var = dynamicContext.declareTemporary(initExpression); + TemporaryVariable var = dynamicContext.declareTemporary(initExpression, initExpression.getSource()); addStatementToCurrentBlock(var.assignmentStatement()); return var.reference(); } @@ -420,7 +420,7 @@ public class TranslationContext { TemporaryConstVariable tempVar = expressionToTempConstVariableCache.get(expression); if (tempVar == null) { - TemporaryVariable tmpVar = declareTemporary(expression); + TemporaryVariable tmpVar = declareTemporary(expression, expression.getSource()); tempVar = new TemporaryConstVariable(tmpVar.name(), tmpVar.assignmentExpression()); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt index 5347dc63e0b..e3f31b02871 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/LoopTranslator.kt @@ -175,7 +175,7 @@ fun translateForExpression(expression: KtForExpression, context: TranslationCont val rangeExpression = context.defineTemporary(Translation.translateAsExpression(loopRange, context)) val length = ArrayFIF.LENGTH_PROPERTY_INTRINSIC.apply(rangeExpression, listOf(), context) val end = context.defineTemporary(length) - val index = context.declareTemporary(JsIntLiteral(0)) + val index = context.declareTemporary(JsIntLiteral(0), expression) val arrayAccess = JsArrayAccess(rangeExpression, index.reference()).source(expression) val body = translateBody(arrayAccess) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java index 9fa27143cd1..8502cf40378 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/PatternTranslator.java @@ -86,7 +86,7 @@ public final class PatternTranslator extends AbstractTranslator { expressionToCast = JsAstUtils.charToBoxedChar(expressionToCast); } - TemporaryVariable temporary = context().declareTemporary(expressionToCast); + TemporaryVariable temporary = context().declareTemporary(expressionToCast, expression); JsExpression isCheck = translateIsCheck(temporary.assignmentExpression(), typeReference); if (isCheck == null) return expressionToCast; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java index bc1127e857f..b1666823145 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/StringTemplateTranslator.java @@ -87,7 +87,7 @@ public final class StringTemplateTranslator extends AbstractTranslator { if (type != null && KotlinBuiltIns.isCharOrNullableChar(type)) { if (type.isMarkedNullable()) { - TemporaryVariable tmp = context().declareTemporary(translatedExpression); + TemporaryVariable tmp = context().declareTemporary(translatedExpression, entry); append(new JsConditional(JsAstUtils.equality(tmp.assignmentExpression(), new JsNullLiteral()), new JsNullLiteral(), JsAstUtils.charToString(tmp.reference()))); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java index 242106dacc6..8637e456966 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Translation.java @@ -195,7 +195,7 @@ public final class Translation { assert jsNode instanceof JsStatement : "Unexpected node of type: " + jsNode.getClass().toString(); if (BindingContextUtilsKt.isUsedAsExpression(expression, context.bindingContext())) { - TemporaryVariable result = context.declareTemporary(null); + TemporaryVariable result = context.declareTemporary(null, expression); AssignToExpressionMutator saveResultToTemporaryMutator = new AssignToExpressionMutator(result.reference()); block.getStatements().add(mutateLastExpression(jsNode, saveResultToTemporaryMutator)); return result.reference(); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java index 3894d45678d..52a92019982 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/BinaryOperationTranslator.java @@ -212,7 +212,7 @@ public final class BinaryOperationTranslator extends AbstractTranslator { if (rightExpression instanceof JsNameRef) { result = rightExpression; // Reuse tmp variable } else { - result = context().declareTemporary(null).reference(); + result = context().declareTemporary(null, rightKtExpression).reference(); JsExpression rightAssignment = JsAstUtils.assignment(result.deepCopy(), rightExpression).source(rightKtExpression); rightBlock.getStatements().add(JsAstUtils.asSyntheticStatement(rightAssignment)); } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java index 77dadf4b6a9..c9c1da5d7c2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/operation/IncrementTranslator.java @@ -114,7 +114,7 @@ public abstract class IncrementTranslator extends AbstractTranslator { private JsExpression asPostfix() { // code fragment: expr(a++) // generate: expr( (t1 = a, t2 = t1, a = t1.inc(), t2) ) - TemporaryVariable t1 = context().declareTemporary(accessTranslator.translateAsGet().source(expression)); + TemporaryVariable t1 = context().declareTemporary(accessTranslator.translateAsGet().source(expression), expression); accessBlock.getStatements().add(t1.assignmentStatement()); JsExpression variableReassignment = variableReassignment(context().innerBlock(accessBlock), t1.reference()) .source(expression); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TemporariesUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TemporariesUtils.java deleted file mode 100644 index 229df5c78f6..00000000000 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TemporariesUtils.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.js.translate.utils; - -import com.google.common.collect.Lists; -import org.jetbrains.kotlin.js.backend.ast.JsExpression; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.js.translate.context.TemporaryVariable; -import org.jetbrains.kotlin.js.translate.context.TranslationContext; - -import java.util.List; - -import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.newSequence; - -//TODO: look for what should go there -public final class TemporariesUtils { - private TemporariesUtils() { - } - - @NotNull - public static List fromExpressionList(@NotNull List expressions, - @NotNull TranslationContext context) { - List result = Lists.newArrayList(); - for (JsExpression expression : expressions) { - result.add(context.declareTemporary(expression)); - } - return result; - } - - @NotNull - public static List toExpressionList(@NotNull List temporaries) { - List result = Lists.newArrayList(); - for (TemporaryVariable temp : temporaries) { - result.add(temp.reference()); - } - return result; - } - - @NotNull - public static JsExpression temporariesInitialization(@NotNull TemporaryVariable... temporaries) { - List result = Lists.newArrayList(); - for (TemporaryVariable temporary : temporaries) { - result.add(temporary.assignmentExpression()); - } - return newSequence(result); - } - - @NotNull - public static List temporariesInitialization(@NotNull List temporaries) { - List result = Lists.newArrayList(); - for (TemporaryVariable temporary : temporaries) { - result.add(temporary.assignmentExpression()); - } - return result; - } -} diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/mutator/AssignToExpressionMutator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/mutator/AssignToExpressionMutator.java index ea64d3b488b..c59d5fc43b7 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/mutator/AssignToExpressionMutator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/mutator/AssignToExpressionMutator.java @@ -37,6 +37,8 @@ public final class AssignToExpressionMutator implements Mutator { if (!(node instanceof JsExpression)) { return node; } - return assignment(toAssign, (JsExpression) node); + JsExpression result = assignment(toAssign, (JsExpression) node); + result.setSource(node.getSource()); + return result; } } diff --git a/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt b/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt index c4529c8d857..adb519735b3 100644 --- a/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt +++ b/js/js.translator/testData/lineNumbers/andAndWithSideEffect.kt @@ -6,4 +6,4 @@ fun box(x: Int, y: Int) { fun foo(x: Int) = x -// LINES: 5 * 3 3 3 * 3 3 4 4 4 * 4 4 4 4 2 3 7 7 7 \ No newline at end of file +// LINES: 5 3 3 4 3 3 3 3 * 3 3 4 4 4 4 * 4 4 4 4 2 3 7 7 7 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt b/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt index 39dcda75590..b505f72aa56 100644 --- a/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt +++ b/js/js.translator/testData/lineNumbers/complexExpressionAsDefaultArgument.kt @@ -11,4 +11,4 @@ fun baz() = 1 fun bar() = 2 -// LINES: 8 * 2 2 3 4 4 5 2 8 8 10 10 10 12 12 12 \ No newline at end of file +// LINES: 8 3 3 2 2 3 4 4 4 5 5 2 8 8 10 10 10 12 12 12 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt b/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt index 6c9a104d5bd..7822ab40328 100644 --- a/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt +++ b/js/js.translator/testData/lineNumbers/doWhileWithComplexCondition.kt @@ -13,4 +13,4 @@ fun box() { ) } -// LINES: 14 8 3 2 2 3 3 3 8 11 11 * 3 7 12 3 3 4 4 \ No newline at end of file +// LINES: 14 8 8 7 3 2 2 3 3 3 8 8 11 11 * 3 7 12 3 3 4 4 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/for.kt b/js/js.translator/testData/lineNumbers/for.kt index 8ee5bfe55e4..f8bca1a724c 100644 --- a/js/js.translator/testData/lineNumbers/for.kt +++ b/js/js.translator/testData/lineNumbers/for.kt @@ -17,4 +17,4 @@ fun box() { } } -// LINES: 18 2 10 15 2 2 2 2 2 3 3 6 6 6 6 7 7 10 10 10 10 10 11 11 14 14 15 15 15 15 15 15 15 15 15 15 15 15 16 16 \ No newline at end of file +// LINES: 18 2 2 10 15 2 2 2 2 2 3 3 6 6 6 6 7 7 10 10 10 10 10 11 11 14 14 15 15 15 15 15 15 15 15 15 15 15 15 16 16 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/whenIn.kt b/js/js.translator/testData/lineNumbers/whenIn.kt index aa69901a7ed..fd55cd0d5e3 100644 --- a/js/js.translator/testData/lineNumbers/whenIn.kt +++ b/js/js.translator/testData/lineNumbers/whenIn.kt @@ -13,4 +13,4 @@ fun foo(): Int = 23 fun bar(): IntRange = 1000..2000 -// LINES: 10 2 2 2 3 4 4 5 6 6 7 8 8 12 12 12 14 14 14 \ No newline at end of file +// LINES: 10 2 2 2 2 3 4 4 5 6 6 7 8 8 12 12 12 14 14 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/whenIs.kt b/js/js.translator/testData/lineNumbers/whenIs.kt index 5b0b65b8d8d..d7b4d93dfcb 100644 --- a/js/js.translator/testData/lineNumbers/whenIs.kt +++ b/js/js.translator/testData/lineNumbers/whenIs.kt @@ -13,4 +13,4 @@ open class A open class B : A() -// LINES: 10 2 2 2 3 4 4 5 6 6 8 8 12 * 14 14 \ No newline at end of file +// LINES: 10 2 2 2 2 3 4 4 5 6 6 8 8 12 * 14 14 \ No newline at end of file diff --git a/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt b/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt index 1eb15a82d10..d82b24be5ab 100644 --- a/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt +++ b/js/js.translator/testData/lineNumbers/whileWithComplexCondition.kt @@ -12,4 +12,4 @@ fun box() { } } -// LINES: 13 5 2 2 3 5 8 8 * 3 4 9 3 11 11 \ No newline at end of file +// LINES: 13 5 5 4 2 2 3 5 5 8 8 * 3 4 9 3 11 11 \ No newline at end of file