From bd6f38021f9b99fddd99befc42041f0bf0b457fc Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 18 Jul 2012 15:10:23 +0400 Subject: [PATCH] Byte, Float, Short conversions. --- .../k2js/test/semantics/NumberTest.java | 4 ++ .../expression/ExpressionVisitor.java | 8 +++- .../factories/NumberConversionFIF.java | 11 +++-- .../number/cases/byteAndShortConversions.kt | 41 +++++++++++++++++++ .../number/cases/doubleConversions.kt | 17 ++++++++ 5 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 js/js.translator/testFiles/number/cases/byteAndShortConversions.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NumberTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NumberTest.java index ef2424882f7..d5f1681cf79 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/NumberTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/NumberTest.java @@ -37,4 +37,8 @@ public final class NumberTest extends SingleFileTranslationTest { public void testNumberConversions() throws Exception { fooBoxTest(); } + + public void testByteAndShortConversions() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 28aff721a32..607f2c5bbcd 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -83,7 +83,13 @@ public final class ExpressionVisitor extends TranslatorVisitor { if (value instanceof Character) { return context.program().getStringLiteral(value.toString()); } - //TODO: all values + if (value instanceof Byte) { + return context.program().getNumberLiteral((Byte) value); + } + if (value instanceof Short) { + return context.program().getNumberLiteral((Short) value); + } + //TODO: long and char throw new AssertionError(message(expression, "Unsupported constant expression")); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java index e74a3b2ac54..bab0c14cd74 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/NumberConversionFIF.java @@ -68,11 +68,16 @@ public final class NumberConversionFIF { } }; + @NotNull + public static final String INTEGER_NUMBER_TYPES = "Int|Byte|Short"; + //NOTE: treat Number as if it is floating point type + @NotNull + public static final String FLOATING_POINT_NUMBER_TYPES = "Float|Double|Number"; @NotNull public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start() - .add(pattern("Int", SUPPORTED_CONVERSIONS), RETURN_RECEIVER) - .add(pattern("Double|Number", INTEGER_CONVERSIONS), new CallStandardMethodIntrinsic("Math.floor", true, 0)) - .add(pattern("Double|Number", FLOATING_POINT_CONVERSIONS), RETURN_RECEIVER) + .add(pattern(INTEGER_NUMBER_TYPES, SUPPORTED_CONVERSIONS), RETURN_RECEIVER) + .add(pattern(FLOATING_POINT_NUMBER_TYPES, INTEGER_CONVERSIONS), new CallStandardMethodIntrinsic("Math.floor", true, 0)) + .add(pattern(FLOATING_POINT_NUMBER_TYPES, FLOATING_POINT_CONVERSIONS), RETURN_RECEIVER) .build(); private NumberConversionFIF() { diff --git a/js/js.translator/testFiles/number/cases/byteAndShortConversions.kt b/js/js.translator/testFiles/number/cases/byteAndShortConversions.kt new file mode 100644 index 00000000000..b91ead511c3 --- /dev/null +++ b/js/js.translator/testFiles/number/cases/byteAndShortConversions.kt @@ -0,0 +1,41 @@ +package foo + +fun testShortConversions(c: Short): Boolean { + if (c.toDouble() != 3.0) { + return false + } + if (c.toFloat() != 3.toFloat()) { + return false + } + if (c.toByte() != 3.toByte()) { + return false + } + if (c.toInt() != 3) { + return false + } + if (c.toShort() != 3.toShort()) { + return false + } + return true +} + +fun testByteConversions(c: Byte): Boolean { + if (c.toDouble() != 3.0) { + return false + } + if (c.toFloat() != 3.toFloat()) { + return false + } + if (c.toByte() != 3.toByte()) { + return false + } + if (c.toInt() != 3) { + return false + } + if (c.toShort() != 3.toShort()) { + return false + } + return true +} + +fun box() = testShortConversions(3) && testByteConversions(3) \ No newline at end of file diff --git a/js/js.translator/testFiles/number/cases/doubleConversions.kt b/js/js.translator/testFiles/number/cases/doubleConversions.kt index c41b0f253ae..5d9dc400868 100644 --- a/js/js.translator/testFiles/number/cases/doubleConversions.kt +++ b/js/js.translator/testFiles/number/cases/doubleConversions.kt @@ -17,5 +17,22 @@ fun box(): Boolean { if (c.toShort() != 3.toShort()) { return false } + + val f: Float = 3.6.toFloat() + if (f.toDouble() != 3.6) { + return false + } + if (f.toFloat() != 3.6.toFloat()) { + return false + } + if (f.toByte() != 3.toByte()) { + return false + } + if (f.toInt() != 3) { + return false + } + if (f.toShort() != 3.toShort()) { + return false + } return true } \ No newline at end of file