diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java index 3c13428bd20..feaffab05bf 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java @@ -141,4 +141,11 @@ public final class MiscTest extends AbstractExpressionTest { public void testPropertiesWithExplicitlyDefinedAccessorsWithoutBodies() throws Exception { fooBoxTest(); } + + + public void testExclExcl() 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 d80f29b5420..fd1ecde3370 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 @@ -31,7 +31,6 @@ import org.jetbrains.k2js.translate.expression.foreach.ForTranslator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslatorVisitor; import org.jetbrains.k2js.translate.operation.BinaryOperationTranslator; -import org.jetbrains.k2js.translate.operation.IncrementTranslator; import org.jetbrains.k2js.translate.operation.UnaryOperationTranslator; import org.jetbrains.k2js.translate.reference.*; import org.jetbrains.k2js.translate.utils.BindingUtils; @@ -285,7 +284,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitPostfixExpression(@NotNull JetPostfixExpression expression, @NotNull TranslationContext context) { - return IncrementTranslator.translate(expression, context); + return UnaryOperationTranslator.translate(expression, context); } @Override diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java index 4dc4ea28abf..dee9b1b2b32 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/operation/UnaryOperationTranslator.java @@ -16,9 +16,12 @@ package org.jetbrains.k2js.translate.operation; +import com.google.dart.compiler.backend.js.ast.JsBinaryOperation; +import com.google.dart.compiler.backend.js.ast.JsConditional; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetUnaryExpression; +import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.reference.CallBuilder; import org.jetbrains.k2js.translate.reference.CallType; @@ -26,7 +29,11 @@ import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.Collections; +import static org.jetbrains.k2js.translate.general.Translation.translateAsExpression; import static org.jetbrains.k2js.translate.utils.BindingUtils.getResolvedCall; +import static org.jetbrains.k2js.translate.utils.PsiUtils.getBaseExpression; +import static org.jetbrains.k2js.translate.utils.PsiUtils.getOperationToken; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.notNullCheck; /** * @author Pavel Talanov @@ -40,12 +47,26 @@ public final class UnaryOperationTranslator { @NotNull public static JsExpression translate(@NotNull JetUnaryExpression expression, @NotNull TranslationContext context) { + if (isExclExcl(expression)) { + return translateExclExclOperator(expression, context); + } if (IncrementTranslator.isIncrement(expression)) { return IncrementTranslator.translate(expression, context); } return translateAsCall(expression, context); } + private static boolean isExclExcl(@NotNull JetUnaryExpression expression) { + return getOperationToken(expression).equals(JetTokens.EXCLEXCL); + } + + @NotNull + private static JsExpression translateExclExclOperator(@NotNull JetUnaryExpression expression, @NotNull TranslationContext context) { + JsExpression translatedExpression = translateAsExpression(getBaseExpression(expression), context); + JsBinaryOperation notNullCheck = notNullCheck(context, translatedExpression); + return new JsConditional(notNullCheck, translatedExpression, translatedExpression); + } + @NotNull private static JsExpression translateAsCall(@NotNull JetUnaryExpression expression, @NotNull TranslationContext context) { diff --git a/js/js.translator/testFiles/expression/misc/cases/exclExcl.kt b/js/js.translator/testFiles/expression/misc/cases/exclExcl.kt new file mode 100644 index 00000000000..98447c129a6 --- /dev/null +++ b/js/js.translator/testFiles/expression/misc/cases/exclExcl.kt @@ -0,0 +1,8 @@ +package foo + + +fun box() : Boolean { + val a : Int? = 0 + + return (a!! + 3) == 3 +} \ No newline at end of file