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 4bf7397f930..08e33c233e7 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 @@ -29,4 +29,8 @@ public final class NumberTest extends SingleFileTranslationTest { public void testIntConversions() throws Exception { fooBoxTest(); } + + public void testDoubleConversions() throws Exception { + fooBoxTest(); + } } 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 7d34ee3f8f0..afcc9070ab5 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 @@ -21,7 +21,9 @@ import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.types.expressions.OperatorConventions; import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.intrinsic.functions.basic.CallStandardMethodIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NameChecker; @@ -36,16 +38,23 @@ import static org.jetbrains.k2js.translate.intrinsic.functions.patterns.PatternB */ public final class NumberConversionFIF { @NotNull - private static final NameChecker CONVERSIONS; + private static final NameChecker SUPPORTED_CONVERSIONS; static { HashSet supportedConversions = Sets.newHashSet(NUMBER_CONVERSIONS); //TODO: support longs and chars supportedConversions.remove(CHAR); supportedConversions.remove(LONG); - CONVERSIONS = new NameChecker(supportedConversions); + SUPPORTED_CONVERSIONS = new NameChecker(supportedConversions); } + @NotNull + private static final NameChecker FLOATING_POINT_CONVERSIONS = new NameChecker(OperatorConventions.FLOAT, OperatorConventions.DOUBLE); + + @NotNull + private static final NameChecker INTEGER_CONVERSIONS = new NameChecker(OperatorConventions.INT, OperatorConventions.SHORT, + OperatorConventions.BYTE); + @NotNull private static final FunctionIntrinsic RETURN_RECEIVER = new FunctionIntrinsic() { @NotNull @@ -61,7 +70,9 @@ public final class NumberConversionFIF { @NotNull public static final FunctionIntrinsicFactory INSTANCE = FIFBuilder.start() - .add(pattern("Int", CONVERSIONS), RETURN_RECEIVER) + .add(pattern("Int", SUPPORTED_CONVERSIONS), RETURN_RECEIVER) + .add(pattern("Double", INTEGER_CONVERSIONS), new CallStandardMethodIntrinsic("Math.floor", true, 0)) + .add(pattern("Double", FLOATING_POINT_CONVERSIONS), RETURN_RECEIVER) .build(); private NumberConversionFIF() { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/NameChecker.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/NameChecker.java index bf77fff7ed0..6945b3c4154 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/NameChecker.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/patterns/NameChecker.java @@ -49,6 +49,10 @@ public final class NameChecker { this.validNames.addAll(validNames); } + public NameChecker(@NotNull Name... validNames) { + this.validNames.addAll(Lists.newArrayList(validNames)); + } + public boolean isValid(@NotNull Name name) { for (Name validName : validNames) { if (name.equals(validName)) { diff --git a/js/js.translator/testFiles/number/cases/doubleConversions.kt b/js/js.translator/testFiles/number/cases/doubleConversions.kt new file mode 100644 index 00000000000..c41b0f253ae --- /dev/null +++ b/js/js.translator/testFiles/number/cases/doubleConversions.kt @@ -0,0 +1,21 @@ +package foo + +fun box(): Boolean { + val c: Double = 3.6 + if (c.toDouble() != 3.6) { + return false + } + if (c.toFloat() != 3.6.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 +} \ No newline at end of file