From f37fae6e293fa08a21108cf8a690a4480e51ce0f Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 27 Jul 2012 17:56:28 +0400 Subject: [PATCH] KT-2310: js: !! translated incorrectly (syntax ok, but logic not). #KT-2310 Fixed --- .../org/jetbrains/k2js/test/semantics/MiscTest.java | 4 ++++ .../operation/UnaryOperationTranslator.java | 10 ++++++---- .../misc/cases/exclExclResultIsComputedOnce.kt | 12 ++++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 js/js.translator/testFiles/expression/misc/cases/exclExclResultIsComputedOnce.kt 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 dec1d4b0ecd..326366e3601 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 @@ -148,6 +148,10 @@ public final class MiscTest extends AbstractExpressionTest { fooBoxTest(); } + public void testExclExclResultIsComputedOnce() throws Exception { + fooBoxTest(); + } + public void testLazyPropertyGetterNotCalledOnStart() throws Exception { checkOutput("lazyProperty.kt", "Hello, world! Gotcha 3"); } 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 8777a23c258..cb92d9de199 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 @@ -19,10 +19,11 @@ 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 com.google.dart.compiler.backend.js.ast.JsNameRef; +import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetUnaryExpression; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.reference.CallBuilder; import org.jetbrains.k2js.translate.reference.CallType; @@ -63,9 +64,10 @@ public final class UnaryOperationTranslator { @NotNull private static JsExpression translateExclExclOperator(@NotNull JetUnaryExpression expression, @NotNull TranslationContext context) { - JsNameRef cachedValue = context.declareTemporary(translateAsExpression(getBaseExpression(expression), context), true).reference(); - JsBinaryOperation notNullCheck = notNullCheck(context, cachedValue); - return new JsConditional(notNullCheck, cachedValue, context.namer().throwNPEFunctionCall()); + TemporaryVariable cachedValue = context.declareTemporary(translateAsExpression(getBaseExpression(expression), context), false); + JsBinaryOperation initAndCheckNotNull = AstUtil.newSequence(cachedValue.assignmentExpression(), + notNullCheck(context, cachedValue.reference())); + return new JsConditional(initAndCheckNotNull, cachedValue.reference(), context.namer().throwNPEFunctionCall()); } @NotNull diff --git a/js/js.translator/testFiles/expression/misc/cases/exclExclResultIsComputedOnce.kt b/js/js.translator/testFiles/expression/misc/cases/exclExclResultIsComputedOnce.kt new file mode 100644 index 00000000000..6fa48df9b58 --- /dev/null +++ b/js/js.translator/testFiles/expression/misc/cases/exclExclResultIsComputedOnce.kt @@ -0,0 +1,12 @@ +package foo + +var c = 0 +val a: Int? + get() { + c++ + return 2 + } + +fun box() : Boolean { + return c == 0 && (a!! + 3) == 5 && c == 1 +} \ No newline at end of file