Fix unsigned constants translation (Int to UInt)

This commit is contained in:
Roman Artemev
2018-07-20 16:22:20 +03:00
committed by Ilya Gorbunov
parent 61efbea9a8
commit d1df5f5783
2 changed files with 23 additions and 8 deletions
@@ -44,7 +44,10 @@ import org.jetbrains.kotlin.js.translate.expression.PatternTranslator;
import org.jetbrains.kotlin.js.translate.test.JSTestGenerator;
import org.jetbrains.kotlin.js.translate.utils.*;
import org.jetbrains.kotlin.js.translate.utils.mutator.AssignToExpressionMutator;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.psi.KtDeclaration;
import org.jetbrains.kotlin.psi.KtExpression;
import org.jetbrains.kotlin.psi.KtFile;
import org.jetbrains.kotlin.psi.KtSimpleNameExpression;
import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt;
import org.jetbrains.kotlin.resolve.constants.*;
@@ -136,7 +139,7 @@ public final class Translation {
) {
KotlinType expectedType = context.bindingContext().getType(expression);
ConstantValue<?> constant = compileTimeValue.toConstantValue(expectedType != null ? expectedType : TypeUtils.NO_EXPECTED_TYPE);
JsExpression result = translateConstantWithoutType(constant);
JsExpression result = translateConstantWithoutType(constant, context);
if (result != null) {
MetadataProperties.setType(result, expectedType);
}
@@ -144,12 +147,12 @@ public final class Translation {
}
@Nullable
private static JsExpression translateConstantWithoutType(@NotNull ConstantValue<?> constant) {
private static JsExpression translateConstantWithoutType(@NotNull ConstantValue<?> constant, @NotNull TranslationContext context) {
if (constant instanceof NullValue) {
return new JsNullLiteral();
}
if (constant instanceof UnsignedValueConstant<?>) {
return translateUnsignedConstant((UnsignedValueConstant<?>) constant);
return translateUnsignedConstant((UnsignedValueConstant<?>) constant, context);
}
Object value = constant.getValue();
@@ -188,7 +191,7 @@ public final class Translation {
return null;
}
private static JsExpression translateUnsignedConstant(@NotNull UnsignedValueConstant<?> unsignedConstant) {
private static JsExpression translateUnsignedConstant(@NotNull UnsignedValueConstant<?> unsignedConstant, @NotNull TranslationContext context) {
if (unsignedConstant instanceof UByteValue) {
return null;
}
@@ -196,7 +199,7 @@ public final class Translation {
return null;
}
else if (unsignedConstant instanceof UIntValue) {
return JsAstUtils.intToUInt(((UIntValue) unsignedConstant).getValue());
return JsAstUtils.intToUInt(((UIntValue) unsignedConstant).getValue(), context);
}
else if (unsignedConstant instanceof ULongValue) {
return null;
@@ -20,17 +20,22 @@ import com.intellij.util.SmartList;
import kotlin.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.descriptors.SourceElement;
import org.jetbrains.kotlin.js.backend.ast.*;
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind;
import org.jetbrains.kotlin.js.translate.context.Namer;
import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt;
import org.jetbrains.kotlin.util.OperatorNameConventions;
import java.util.Collections;
import java.util.List;
import static org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies;
public final class JsAstUtils {
private static final JsNameRef DEFINE_PROPERTY = pureFqn("defineProperty", null);
@@ -217,9 +222,16 @@ public final class JsAstUtils {
return invokeMethod(expression, Namer.LONG_TO_NUMBER);
}
public static JsExpression intToUInt(int value) {
@NotNull
public static JsExpression intToUInt(int value, @NotNull TranslationContext context) {
ClassDescriptor uintClassDescriptor = findClassAcrossModuleDependencies(context.getCurrentModule(), KotlinBuiltIns.FQ_NAMES.uInt);
assert uintClassDescriptor != null;
JsName descName = context.getInnerNameForDescriptor(uintClassDescriptor);
// replace with external builder
JsIntLiteral literal = new JsIntLiteral(value);
return invokeMethod(Namer.kotlinObject(), Namer.UINT_FROM_INT, literal);
return new JsNew(descName.makeRef(), Collections.singletonList(literal));
}
@NotNull