JS: apply boxing when initializing val parameter of type Char
See KT-20854
This commit is contained in:
@@ -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");
|
||||
|
||||
+7
-2
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user