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.test.JSTestGenerator;
import org.jetbrains.kotlin.js.translate.utils.*; import org.jetbrains.kotlin.js.translate.utils.*;
import org.jetbrains.kotlin.js.translate.utils.mutator.AssignToExpressionMutator; 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.BindingTrace;
import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt; import org.jetbrains.kotlin.resolve.bindingContextUtil.BindingContextUtilsKt;
import org.jetbrains.kotlin.resolve.constants.*; import org.jetbrains.kotlin.resolve.constants.*;
@@ -136,7 +139,7 @@ public final class Translation {
) { ) {
KotlinType expectedType = context.bindingContext().getType(expression); KotlinType expectedType = context.bindingContext().getType(expression);
ConstantValue<?> constant = compileTimeValue.toConstantValue(expectedType != null ? expectedType : TypeUtils.NO_EXPECTED_TYPE); ConstantValue<?> constant = compileTimeValue.toConstantValue(expectedType != null ? expectedType : TypeUtils.NO_EXPECTED_TYPE);
JsExpression result = translateConstantWithoutType(constant); JsExpression result = translateConstantWithoutType(constant, context);
if (result != null) { if (result != null) {
MetadataProperties.setType(result, expectedType); MetadataProperties.setType(result, expectedType);
} }
@@ -144,12 +147,12 @@ public final class Translation {
} }
@Nullable @Nullable
private static JsExpression translateConstantWithoutType(@NotNull ConstantValue<?> constant) { private static JsExpression translateConstantWithoutType(@NotNull ConstantValue<?> constant, @NotNull TranslationContext context) {
if (constant instanceof NullValue) { if (constant instanceof NullValue) {
return new JsNullLiteral(); return new JsNullLiteral();
} }
if (constant instanceof UnsignedValueConstant<?>) { if (constant instanceof UnsignedValueConstant<?>) {
return translateUnsignedConstant((UnsignedValueConstant<?>) constant); return translateUnsignedConstant((UnsignedValueConstant<?>) constant, context);
} }
Object value = constant.getValue(); Object value = constant.getValue();
@@ -188,7 +191,7 @@ public final class Translation {
return null; return null;
} }
private static JsExpression translateUnsignedConstant(@NotNull UnsignedValueConstant<?> unsignedConstant) { private static JsExpression translateUnsignedConstant(@NotNull UnsignedValueConstant<?> unsignedConstant, @NotNull TranslationContext context) {
if (unsignedConstant instanceof UByteValue) { if (unsignedConstant instanceof UByteValue) {
return null; return null;
} }
@@ -196,7 +199,7 @@ public final class Translation {
return null; return null;
} }
else if (unsignedConstant instanceof UIntValue) { else if (unsignedConstant instanceof UIntValue) {
return JsAstUtils.intToUInt(((UIntValue) unsignedConstant).getValue()); return JsAstUtils.intToUInt(((UIntValue) unsignedConstant).getValue(), context);
} }
else if (unsignedConstant instanceof ULongValue) { else if (unsignedConstant instanceof ULongValue) {
return null; return null;
@@ -20,17 +20,22 @@ import com.intellij.util.SmartList;
import kotlin.Pair; import kotlin.Pair;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.descriptors.SourceElement;
import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.backend.ast.*;
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind; import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind;
import org.jetbrains.kotlin.js.translate.context.Namer; 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.resolve.source.KotlinSourceElementKt;
import org.jetbrains.kotlin.util.OperatorNameConventions; import org.jetbrains.kotlin.util.OperatorNameConventions;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies;
public final class JsAstUtils { public final class JsAstUtils {
private static final JsNameRef DEFINE_PROPERTY = pureFqn("defineProperty", null); private static final JsNameRef DEFINE_PROPERTY = pureFqn("defineProperty", null);
@@ -217,9 +222,16 @@ public final class JsAstUtils {
return invokeMethod(expression, Namer.LONG_TO_NUMBER); 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); JsIntLiteral literal = new JsIntLiteral(value);
return invokeMethod(Namer.kotlinObject(), Namer.UINT_FROM_INT, literal);
return new JsNew(descName.makeRef(), Collections.singletonList(literal));
} }
@NotNull @NotNull