JS backend: fix kt-5345 (Type mismatch on Int / Float division)

This commit is contained in:
Michael Nedzelsky
2014-07-22 12:24:32 +04:00
parent 740fe70b22
commit ee67546f8f
3 changed files with 29 additions and 1 deletions
@@ -50,6 +50,11 @@ public final class NumberTest extends SingleFileTranslationTest {
checkFooBoxIsOk();
}
// KT-5345 Type mismatch on Int / Float division
public void testIntDivFloat() throws Exception {
checkFooBoxIsOk();
}
public void testHexademicalConstant() throws Exception {
try {
fooBoxTest();
@@ -24,7 +24,9 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic;
@@ -101,7 +103,10 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
}
if (pattern(INTEGER_NUMBER_TYPES + ".div").apply(descriptor)) {
return INTEGER_DIVISION_INTRINSIC;
JetType resultType = descriptor.getReturnType();
if (!KotlinBuiltIns.getInstance().getFloatType().equals(resultType) &&
!KotlinBuiltIns.getInstance().getDoubleType().equals(resultType))
return INTEGER_DIVISION_INTRINSIC;
}
if (descriptor.getName().equals(Name.identifier("rangeTo"))) {
return RANGE_TO_INTRINSIC;
@@ -0,0 +1,18 @@
// http://youtrack.jetbrains.com/issue/KT-5345
// KT-5345 (Javascript) Type mismatch on Int / Float division
// If any of Number operands is floating-point, the result should be float too.
package foo
fun box(): String {
assertEquals(0.5f, 1 / 2.0f, "Int / Float")
assertEquals(0.5, 1 / 2.0, "Int / Double")
assertEquals(0.5f, (1: Short) / 2.0f, "Short / Float")
assertEquals(0.5, (1: Short) / 2.0, "Short / Double")
assertEquals(0.5f, (1: Byte) / 2.0f, "Byte / Float")
assertEquals(0.5, (1: Byte) / 2.0, "Byte / Double")
return "OK"
}