From 5f843f67599846bf1849326f021e754659ae8890 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 10 Feb 2017 10:50:57 +0300 Subject: [PATCH] Fix intrinsic for String.plus for explicit calls #KT-14567 Fixed --- .../kotlin/codegen/intrinsics/Concat.kt | 6 ++-- .../box/operatorConventions/plusExplicit.kt | 29 +++++++++++++++++++ .../operatorConventions/plusExplicit.txt | 7 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 6 ++++ 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/operatorConventions/plusExplicit.kt create mode 100644 compiler/testData/codegen/light-analysis/operatorConventions/plusExplicit.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt index 8e0b804bb93..d6f9441b21b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/intrinsics/Concat.kt @@ -47,12 +47,12 @@ class Concat : IntrinsicMethod() { codegen.invokeAppend(element.right) } else { - // LHS?.plus(RHS) - receiver.put(AsmTypes.OBJECT_TYPE, v) + // Explicit plus call LHS?.plus(RHS) or LHS.plus(RHS) + receiver.put(AsmTypes.JAVA_STRING_TYPE, v) genStringBuilderConstructor(v) v.swap() genInvokeAppendMethod(v, returnType) - codegen.invokeAppend(arguments.get(0)) + codegen.invokeAppend(arguments[0]) } v.invokevirtual("java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false) diff --git a/compiler/testData/codegen/box/operatorConventions/plusExplicit.kt b/compiler/testData/codegen/box/operatorConventions/plusExplicit.kt new file mode 100644 index 00000000000..8d45ed1b931 --- /dev/null +++ b/compiler/testData/codegen/box/operatorConventions/plusExplicit.kt @@ -0,0 +1,29 @@ +// WITH_RUNTIME + +fun bar1(): String { + val l: List = listOf("O") + val s = l[0].plus("K") + return s +} + +fun bar2(): String { + val l: List = listOf("O") + val s = l[0]?.plus("K") + return s!! +} + +fun bar3(): String { + val l: List = listOf("O") + with(l[0]) { + return plus("K") + } + return "fail" +} + +fun box(): String { + if (bar1() != "OK") return "fail 1" + if (bar2() != "OK") return "fail 2" + if (bar3() != "OK") return "fail 3" + + return "OK" +} diff --git a/compiler/testData/codegen/light-analysis/operatorConventions/plusExplicit.txt b/compiler/testData/codegen/light-analysis/operatorConventions/plusExplicit.txt new file mode 100644 index 00000000000..d2a1da0859d --- /dev/null +++ b/compiler/testData/codegen/light-analysis/operatorConventions/plusExplicit.txt @@ -0,0 +1,7 @@ +@kotlin.Metadata +public final class PlusExplicitKt { + public final static @org.jetbrains.annotations.NotNull method bar1(): java.lang.String + public final static @org.jetbrains.annotations.NotNull method bar2(): java.lang.String + public final static @org.jetbrains.annotations.NotNull method bar3(): java.lang.String + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} 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 a3c4d7882c6..91246d1d099 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 @@ -11207,6 +11207,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("plusExplicit.kt") + public void testPlusExplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/plusExplicit.kt"); + doTest(fileName); + } + @TestMetadata("remAssignmentOperation.kt") public void testRemAssignmentOperation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/remAssignmentOperation.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 505775d1946..d2e069b59e2 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -11207,6 +11207,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("plusExplicit.kt") + public void testPlusExplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/plusExplicit.kt"); + doTest(fileName); + } + @TestMetadata("remAssignmentOperation.kt") public void testRemAssignmentOperation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/remAssignmentOperation.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 70d5d5805aa..e9444d4b348 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 @@ -12936,6 +12936,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("plusExplicit.kt") + public void testPlusExplicit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/plusExplicit.kt"); + doTest(fileName); + } + @TestMetadata("remAssignmentOperation.kt") public void testRemAssignmentOperation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/operatorConventions/remAssignmentOperation.kt");