Fix unsigned constants translation (Int to UInt)
This commit is contained in:
committed by
Ilya Gorbunov
parent
61efbea9a8
commit
d1df5f5783
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user