JS: apply boxing when initializing val parameter of type Char

See KT-20854
This commit is contained in:
Alexey Andreev
2017-10-20 13:44:52 +03:00
parent 32a0221474
commit 7ebfba3722
3 changed files with 29 additions and 2 deletions
@@ -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");
@@ -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));
}
@@ -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"
}