JS: support signed constant expressions as unsigned primitive arguments

This commit is contained in:
Anton Bannykh
2018-08-17 13:21:31 +03:00
committed by Ilya Gorbunov
parent 934e11aa60
commit 6103df0b31
2 changed files with 23 additions and 1 deletions
@@ -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()
@@ -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;
}