From 784fe3105367b389c037d5120dad2d094c50bb38 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 29 Nov 2016 17:32:49 +0300 Subject: [PATCH] JS: fix translation of calls with aliased labeled lambda arguments. Fix KT-14999 --- .../operatorConventions/operatorSetLambda.kt | 16 ++++++++++++++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../semantics/JsCodegenBoxTestGenerated.java | 6 ++++++ .../expression/ExpressionVisitor.java | 8 +------- .../js/translate/general/Translation.java | 18 +++++++++--------- .../reference/CallArgumentTranslator.kt | 7 ++++--- 7 files changed, 48 insertions(+), 19 deletions(-) create mode 100644 compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt diff --git a/compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt b/compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt new file mode 100644 index 00000000000..a791f7207c7 --- /dev/null +++ b/compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt @@ -0,0 +1,16 @@ +// See KT-14999 + +object Obj { + var key = "" + var value = "" + + operator fun set(k: String, v: ((String) -> Unit) -> Unit) { + key += k + v { value += it } + } +} + +fun box(): String { + Obj["O"] = label@{ it("K") } + return Obj.key + Obj.value +} \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 465464b2b2f..2f2e35d4682 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -10307,6 +10307,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("operatorSetLambda.kt") + public void testOperatorSetLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt"); + doTest(fileName); + } + @TestMetadata("overloadedSet.kt") public void testOverloadedSet() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/overloadedSet.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index b1005a92108..51571d75bad 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10307,6 +10307,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("operatorSetLambda.kt") + public void testOperatorSetLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt"); + doTest(fileName); + } + @TestMetadata("overloadedSet.kt") public void testOverloadedSet() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/overloadedSet.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 6d47ca261e2..b2bd3058326 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -12546,6 +12546,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("operatorSetLambda.kt") + public void testOperatorSetLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/operatorSetLambda.kt"); + doTest(fileName); + } + @TestMetadata("overloadedSet.kt") public void testOverloadedSet() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/overloadedSet.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java index d0bff44d985..560e75a0d4f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/ExpressionVisitor.java @@ -26,7 +26,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.KotlinRetention; -import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.declaration.ClassTranslator; @@ -46,7 +45,6 @@ import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContextUtils; import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; -import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant; import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator; import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; @@ -54,13 +52,9 @@ import org.jetbrains.kotlin.resolve.inline.InlineUtil; import org.jetbrains.kotlin.types.expressions.DoubleColonLHS; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import static org.jetbrains.kotlin.js.translate.context.Namer.GET_KCLASS; -import static org.jetbrains.kotlin.js.translate.context.Namer.GET_KCLASS_FROM_EXPRESSION; -import static org.jetbrains.kotlin.js.translate.context.Namer.getCapturedVarAccessor; +import static org.jetbrains.kotlin.js.translate.context.Namer.*; import static org.jetbrains.kotlin.js.translate.general.Translation.translateAsExpression; import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.*; import static org.jetbrains.kotlin.js.translate.utils.ErrorReportingUtils.message; 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 8255e9044a6..d2f68f6b3ad 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 @@ -104,6 +104,15 @@ public final class Translation { return aliasForExpression; } + CompileTimeConstant compileTimeValue = ConstantExpressionEvaluator.getConstant(expression, context.bindingContext()); + if (compileTimeValue != null) { + KotlinType type = context.bindingContext().getType(expression); + if (type != null && KotlinBuiltIns.isLong(type)) { + JsExpression constantResult = translateConstant(compileTimeValue, expression, context); + if (constantResult != null) return constantResult; + } + } + TranslationContext innerContext = context.innerBlock(); JsNode result = doTranslateExpression(expression, innerContext); context.moveVarsFrom(innerContext); @@ -175,15 +184,6 @@ public final class Translation { @NotNull TranslationContext context, @NotNull JsBlock block ) { - CompileTimeConstant compileTimeValue = ConstantExpressionEvaluator.getConstant(expression, context.bindingContext()); - if (compileTimeValue != null) { - KotlinType type = context.bindingContext().getType(expression); - if (type != null && KotlinBuiltIns.isLong(type)) { - JsExpression constantResult = translateConstant(compileTimeValue, expression, context); - if (constantResult != null) return constantResult; - } - } - JsNode jsNode = translateExpression(expression, context, block); if (jsNode instanceof JsExpression) { return (JsExpression) jsNode; diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt index d35300fa86a..7b707bd23e4 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallArgumentTranslator.kt @@ -207,7 +207,8 @@ class CallArgumentTranslator private constructor( assert(actualArgument is ExpressionValueArgument) assert(valueArguments.size == 1) - val argumentExpression = KtPsiUtil.deparenthesize(valueArguments[0].getArgumentExpression())!! + val parenthesizedArgumentExpression = valueArguments[0].getArgumentExpression()!! + val argumentExpression = KtPsiUtil.deparenthesize(parenthesizedArgumentExpression) result += if (parameterDescriptor.isCoroutine && argumentExpression is KtLambdaExpression) { val continuationType = parameterDescriptor.type.arguments.last().type @@ -218,7 +219,7 @@ class CallArgumentTranslator private constructor( argumentExpression.functionLiteral, continuationDescriptor, controllerDescriptor) } else { - Translation.translateAsExpression(argumentExpression, context) + Translation.translateAsExpression(parenthesizedArgumentExpression, context) } } @@ -330,7 +331,7 @@ class CallArgumentTranslator private constructor( } -public fun Map.buildReifiedTypeArgs( +fun Map.buildReifiedTypeArgs( context: TranslationContext ): List {