From 6103df0b311a8725e0081958487194b4ec417fb6 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Fri, 17 Aug 2018 13:21:31 +0300 Subject: [PATCH] JS: support signed constant expressions as unsigned primitive arguments --- .../signedToUnsignedLiteralConversion.kt | 2 +- .../js/translate/utils/TranslationUtils.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/compiler/testData/codegen/box/unsignedTypes/signedToUnsignedLiteralConversion.kt b/compiler/testData/codegen/box/unsignedTypes/signedToUnsignedLiteralConversion.kt index 4945b14ea59..ccc985bd0cd 100644 --- a/compiler/testData/codegen/box/unsignedTypes/signedToUnsignedLiteralConversion.kt +++ b/compiler/testData/codegen/box/unsignedTypes/signedToUnsignedLiteralConversion.kt @@ -1,5 +1,5 @@ // WITH_UNSIGNED -// IGNORE_BACKEND: JS_IR, JVM_IR, JS +// IGNORE_BACKEND: JS_IR, JVM_IR fun takeUByte(u: UByte) = u.toByte() fun takeUShort(u: UShort) = u.toShort() diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java index 6ca3b7c87ab..581913a57a8 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.FunctionTypesKt; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; +import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.config.CoroutineLanguageVersionSettingsUtilKt; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor; @@ -26,7 +27,9 @@ import org.jetbrains.kotlin.js.translate.context.TemporaryConstVariable; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.expression.InlineMetadata; import org.jetbrains.kotlin.js.translate.general.Translation; +import org.jetbrains.kotlin.js.translate.intrinsic.functions.factories.ArrayFIF; import org.jetbrains.kotlin.js.translate.reference.ReferenceTranslator; +import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.AstUtilsKt; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqNameUnsafe; @@ -523,6 +526,25 @@ public final class TranslationUtils { } } + if (ArrayFIF.INSTANCE.unsignedPrimitiveToSigned(to) != null) { + PrimitiveType fromPrimitive = Objects.requireNonNull(ArrayFIF.INSTANCE.unsignedPrimitiveToSigned(to)); + if (KotlinBuiltIns.isInt(from)) { + switch (fromPrimitive) { + case BYTE: + value = AstUtilsKt.toByte(context, value); + break; + case SHORT: + value = AstUtilsKt.toShort(context, value); + break; + } + DeclarationDescriptor d = to.getConstructor().getDeclarationDescriptor(); + if (d instanceof ClassDescriptor) { + value = new JsNew(ReferenceTranslator.translateAsTypeReference((ClassDescriptor) d, context), + Collections.singletonList(value)); + } + } + } + MetadataProperties.setType(value, to); return value; }