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.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
|
||||||
|
|||||||
Reference in New Issue
Block a user