diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java index ed0028287ac..aa1d08c6496 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/DynamicContext.java @@ -53,8 +53,13 @@ public final class DynamicContext { @NotNull public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) { + return declareTemporary(initExpression, false); + } + + @NotNull + public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression, boolean initialize) { JsName temporaryName = currentScope.declareTemporary(); - JsVars temporaryDeclaration = newVar(temporaryName, /*no init expression in var statement*/ null); + JsVars temporaryDeclaration = newVar(temporaryName, initialize ? initExpression : null); addVarDeclaration(jsBlock(), temporaryDeclaration); return new TemporaryVariable(temporaryName, initExpression); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index 07fc4f3ce79..26e8f33ec4c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -157,6 +157,11 @@ public final class TranslationContext { return dynamicContext.declareTemporary(initExpression); } + @NotNull + public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression, boolean initialize) { + return dynamicContext.declareTemporary(initExpression, initialize); + } + @NotNull public Namer namer() { return staticContext.getNamer(); 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 8d5bba28ff9..43364bdc76a 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,9 +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 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; @@ -62,9 +64,9 @@ public final class UnaryOperationTranslator { @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, context.namer().throwNPEFunctionCall()); + JsNameRef cachedValue = context.declareTemporary(translateAsExpression(getBaseExpression(expression), context), true).reference(); + JsBinaryOperation notNullCheck = notNullCheck(context, cachedValue); + return new JsConditional(notNullCheck, cachedValue, context.namer().throwNPEFunctionCall()); } @NotNull