From 7ebfba37226e533e18503ac8596ab3bc3f176696 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Fri, 20 Oct 2017 13:44:52 +0300 Subject: [PATCH] JS: apply boxing when initializing val parameter of type Char See KT-20854 --- .../js/test/semantics/BoxJsTestGenerated.java | 6 ++++++ .../initializer/ClassInitializerTranslator.java | 9 +++++++-- .../testData/box/coercion/charValParameter.kt | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/box/coercion/charValParameter.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 6d83d528b3f..e86d6605b0d 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 @@ -821,6 +821,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("charValParameter.kt") + public void testCharValParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/coercion/charValParameter.kt"); + doTest(fileName); + } + @TestMetadata("classProperty.kt") public void testClassProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/coercion/classProperty.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index defab1af87d..fe1642942e8 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor; import org.jetbrains.kotlin.js.backend.ast.*; +import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.context.Namer; import org.jetbrains.kotlin.js.translate.context.TranslationContext; @@ -34,6 +35,7 @@ import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator; import org.jetbrains.kotlin.js.translate.utils.BindingUtils; import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils; +import org.jetbrains.kotlin.js.translate.utils.TranslationUtils; import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.AstUtilsKt; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.name.Name; @@ -376,11 +378,14 @@ public final class ClassInitializerTranslator extends AbstractTranslator { if (propertyDescriptor == null) { return; } - JsNameRef initialValueForProperty = jsParameter.getName().makeRef(); + JsExpression initialValueForProperty = jsParameter.getName().makeRef(); + MetadataProperties.setType(initialValueForProperty, propertyDescriptor.getType()); + initialValueForProperty = TranslationUtils.coerce(context(), initialValueForProperty, + TranslationUtils.getReturnTypeForCoercion(propertyDescriptor)); addInitializerOrPropertyDefinition(initialValueForProperty, propertyDescriptor); } - private void addInitializerOrPropertyDefinition(@NotNull JsNameRef initialValue, @NotNull PropertyDescriptor propertyDescriptor) { + private void addInitializerOrPropertyDefinition(@NotNull JsExpression initialValue, @NotNull PropertyDescriptor propertyDescriptor) { initFunction.getBody().getStatements().add( InitializerUtils.generateInitializerForProperty(context(), propertyDescriptor, initialValue)); } diff --git a/js/js.translator/testData/box/coercion/charValParameter.kt b/js/js.translator/testData/box/coercion/charValParameter.kt new file mode 100644 index 00000000000..d04e1d371ca --- /dev/null +++ b/js/js.translator/testData/box/coercion/charValParameter.kt @@ -0,0 +1,16 @@ +// EXPECTED_REACHABLE_NODES: 1127 +class A(val x: Char) + +fun typeOf(x: dynamic): String = js("typeof x") + +fun box(): String { + val a = A('0') + + var r = typeOf(a.asDynamic().x) + if (r != "object") return "fail1: $r" + + r = typeOf(a.x) + if (r != "number") return "fail2: $r" + + return "OK" +} \ No newline at end of file