From 226a01fa804d9b5fe379ac980e974a685a3de66c Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 13 Aug 2012 13:39:01 +0400 Subject: [PATCH] Null check logic in TranslationUtils. Adapted from https://github.com/develar/kotlin/commit/a9e0a42fb1347fa8e21c86b5a073ef8a7c873da0. --- .../expression/PatternTranslator.java | 4 ++-- .../k2js/translate/reference/CallType.java | 2 +- .../translate/utils/TranslationUtils.java | 24 +++++++++++-------- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java index 4ee2d4d5627..e9094fbd2df 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java @@ -110,8 +110,8 @@ public final class PatternTranslator extends AbstractTranslator { } @NotNull - private JsExpression addNullCheck(@NotNull JsExpression expressionToMatch, @NotNull JsInvocation isCheck) { - return or(TranslationUtils.isNullCheck(context(), expressionToMatch), isCheck); + private static JsExpression addNullCheck(@NotNull JsExpression expressionToMatch, @NotNull JsInvocation isCheck) { + return or(TranslationUtils.isNullCheck(expressionToMatch), isCheck); } private boolean isNullable(JetTypePattern pattern) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java index 45417cc20af..1dcaa3c4f36 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CallType.java @@ -42,7 +42,7 @@ public enum CallType { @NotNull TranslationContext context) { assert receiver != null; TemporaryVariable temporaryVariable = context.declareTemporary(receiver); - JsBinaryOperation notNullCheck = TranslationUtils.notNullCheck(context, temporaryVariable.reference()); + JsBinaryOperation notNullCheck = TranslationUtils.notNullConditionalTestExpression(temporaryVariable); JsExpression methodCall = constructor.construct(temporaryVariable.reference()); JsConditional callMethodIfNotNullElseNull = new JsConditional(notNullCheck, methodCall, JsNullLiteral.NULL); return newSequence(temporaryVariable.assignmentExpression(), callMethodIfNotNullElseNull); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 414a447f7c1..5b363c667db 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.Translation; @@ -66,19 +67,22 @@ public final class TranslationUtils { } @NotNull - public static JsBinaryOperation notNullCheck(@NotNull TranslationContext context, - @NotNull JsExpression expressionToCheck) { - JsBinaryOperation notNull = inequality(expressionToCheck, JsLiteral.NULL); - JsBinaryOperation notUndefined = inequality(expressionToCheck, UNDEFINED_LITERAL); - return and(notNull, notUndefined); + public static JsBinaryOperation isNullCheck(@NotNull JsExpression expressionToCheck) { + return nullCheck(expressionToCheck, false); } @NotNull - public static JsBinaryOperation isNullCheck(@NotNull TranslationContext context, - @NotNull JsExpression expressionToCheck) { - JsBinaryOperation isNull = equality(expressionToCheck, JsLiteral.NULL); - JsBinaryOperation isUndefined = equality(expressionToCheck, UNDEFINED_LITERAL); - return or(isNull, isUndefined); + public static JsBinaryOperation notNullConditionalTestExpression(@NotNull TemporaryVariable cachedValue) { + return and(inequality(cachedValue.assignmentExpression(), JsLiteral.NULL), + inequality(cachedValue.reference(), JsLiteral.UNDEFINED)); + } + + @NotNull + public static JsBinaryOperation nullCheck(@NotNull JsExpression expressionToCheck, boolean isNegated) { + JsBinaryOperator operator = isNegated ? JsBinaryOperator.REF_NEQ : JsBinaryOperator.REF_EQ; + return new JsBinaryOperation(isNegated ? JsBinaryOperator.AND : JsBinaryOperator.OR, + new JsBinaryOperation(operator, expressionToCheck, JsLiteral.NULL), + new JsBinaryOperation(operator, expressionToCheck, JsLiteral.UNDEFINED)); } @NotNull