From 9ff8c93529a2813390dd3d2d9b60a3bd4dd7e38c Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Mon, 10 Sep 2018 17:32:12 +0300 Subject: [PATCH] [JS BE] Fix KT-26706: incorrect Long value in string templates --- .../js/test/semantics/BoxJsTestGenerated.java | 5 +++++ .../js/test/semantics/IrBoxJsTestGenerated.java | 5 +++++ .../expression/StringTemplateTranslator.java | 10 ++++++++++ js/js.translator/testData/box/number/kt26706.kt | 17 +++++++++++++++++ 4 files changed, 37 insertions(+) create mode 100644 js/js.translator/testData/box/number/kt26706.kt diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 183acf138e6..1ef6b5d4485 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -6306,6 +6306,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/number/kt2342.kt"); } + @TestMetadata("kt26706.kt") + public void testKt26706() throws Exception { + runTest("js/js.translator/testData/box/number/kt26706.kt"); + } + @TestMetadata("longArray.kt") public void testLongArray() throws Exception { runTest("js/js.translator/testData/box/number/longArray.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java index 6055cb95fc6..74a746e87c7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java @@ -6306,6 +6306,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/number/kt2342.kt"); } + @TestMetadata("kt26706.kt") + public void testKt26706() throws Exception { + runTest("js/js.translator/testData/box/number/kt26706.kt"); + } + @TestMetadata("longArray.kt") public void testLongArray() throws Exception { runTest("js/js.translator/testData/box/number/longArray.kt"); 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 91952d66708..6239af6cfb0 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 @@ -113,6 +113,16 @@ public final class StringTemplateTranslator extends AbstractTranslator { private boolean mustCallToString(@NotNull KotlinType type) { Name typeName = DescriptorUtilsKt.getNameIfStandardType(type); //TODO: this is a hacky optimization, should use some generic approach + + // Long has valueOf method which will be called instead of toString and produce different result. + if (KotlinBuiltIns.isAny(type) || + KotlinBuiltIns.isComparable(type) || + KotlinBuiltIns.isNumber(type) || + KotlinBuiltIns.isLong(type) + ) { + return true; + } + if (typeName != null && NamePredicate.STRING.test(typeName)) { return false; } diff --git a/js/js.translator/testData/box/number/kt26706.kt b/js/js.translator/testData/box/number/kt26706.kt new file mode 100644 index 00000000000..6aaa869743b --- /dev/null +++ b/js/js.translator/testData/box/number/kt26706.kt @@ -0,0 +1,17 @@ +// IGNORE_BACKEND: JS_IR +// EXPECTED_REACHABLE_NODES: 1229 +package foo + +fun box(): String { + val x = "895065487315017728" + if (" ${x.toLong()}" != " $x") return "FAIL 1" + if (" ${x.toLong() as Comparable}" != " $x") return "FAIL 2" + if (" ${x.toLong() as Number}" != " $x") return "FAIL 3" + if (" ${x.toLong() as Any}" != " $x") return "FAIL 4" + if (" ${x.toLong() as Long?}" != " $x") return "FAIL 5" + if (" ${x.toLong() as Comparable?}" != " $x") return "FAIL 6" + if (" ${x.toLong() as Number?}" != " $x") return "FAIL 7" + if (" ${x.toLong() as Any?}" != " $x") return "FAIL 8" + + return "OK" +} \ No newline at end of file