From 6ed57f5e7a7947615b8891eda7733c24e5795d89 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Thu, 18 Sep 2014 23:21:41 +0400 Subject: [PATCH] JS backend: fix KT-5221 Invalid JS code generated for dec() and inc() #KT-5221 Fixed --- .../k2js/test/semantics/NumberTest.java | 4 ++ .../factories/PrimitiveUnaryOperationFIF.java | 47 +++++++++++++++++-- .../testData/number/cases/numberIncDec.kt | 16 +++++++ 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 js/js.translator/testData/number/cases/numberIncDec.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 b52a1fc3948..7b6b67d1e29 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 @@ -74,6 +74,10 @@ public final class NumberTest extends SingleFileTranslationTest { checkFooBoxIsOk(); } + public void testNumberIncDec() throws Exception { + checkFooBoxIsOk(); + } + public void testConversionsWithoutTruncation() throws Exception { checkFooBoxIsOk(); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java index f7fa9655503..5d80ede808a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/PrimitiveUnaryOperationFIF.java @@ -18,9 +18,7 @@ package org.jetbrains.k2js.translate.intrinsic.functions.factories; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsPrefixOperation; -import com.google.dart.compiler.backend.js.ast.JsUnaryOperator; +import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; @@ -61,6 +59,42 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { @NotNull private static final Predicate PATTERN = Predicates.and(PRIMITIVE_UNARY_OPERATION_NAMES, NO_PARAMETERS); + @NotNull + private static final DescriptorPredicate INC_OPERATION_FOR_PRIMITIVE_NUMBER = pattern(PRIMITIVE_NUMBERS, "inc"); + + @NotNull + private static final DescriptorPredicate DEC_OPERATION_FOR_PRIMITIVE_NUMBER = pattern(PRIMITIVE_NUMBERS, "dec"); + + @NotNull + private static final FunctionIntrinsic NUMBER_INC_INTRINSIC = new FunctionIntrinsic() { + @NotNull + @Override + public JsExpression apply( + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context + ) { + assert receiver != null; + assert arguments.size() == 0; + return new JsBinaryOperation(JsBinaryOperator.ADD, receiver, context.program().getNumberLiteral(1)); + } + }; + + @NotNull + private static final FunctionIntrinsic NUMBER_DEC_INTRINSIC = new FunctionIntrinsic() { + @NotNull + @Override + public JsExpression apply( + @Nullable JsExpression receiver, + @NotNull List arguments, + @NotNull TranslationContext context + ) { + assert receiver != null; + assert arguments.size() == 0; + return new JsBinaryOperation(JsBinaryOperator.SUB, receiver, context.program().getNumberLiteral(1)); + } + }; + @Nullable @Override public FunctionIntrinsic getIntrinsic(@NotNull FunctionDescriptor descriptor) { @@ -68,6 +102,13 @@ public enum PrimitiveUnaryOperationFIF implements FunctionIntrinsicFactory { return null; } + if (INC_OPERATION_FOR_PRIMITIVE_NUMBER.apply(descriptor)) { + return NUMBER_INC_INTRINSIC; + } + if (DEC_OPERATION_FOR_PRIMITIVE_NUMBER.apply(descriptor)) { + return NUMBER_DEC_INTRINSIC; + } + Name name = descriptor.getName(); JsUnaryOperator jsOperator; diff --git a/js/js.translator/testData/number/cases/numberIncDec.kt b/js/js.translator/testData/number/cases/numberIncDec.kt new file mode 100644 index 00000000000..b7accac8dda --- /dev/null +++ b/js/js.translator/testData/number/cases/numberIncDec.kt @@ -0,0 +1,16 @@ +package foo + +fun box(): String { + + assertEquals(100.inc(), 101) + assertEquals(100.dec(), 99) + + var x = 100 + assertEquals(x.inc(), 101) + assertEquals(x, 100) + + assertEquals(x.dec(), 99) + assertEquals(x, 100) + + return "OK" +} \ No newline at end of file