From 2964bb77b36cc99557a291e6163cb9287e3937e3 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 7 Mar 2014 21:15:12 +0400 Subject: [PATCH] extracted method 'canBeReducedToBooleanConstant' --- .../jet/lang/cfg/JetControlFlowProcessor.java | 15 ++----------- .../resolve/CompileTimeConstantUtils.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 623d330aab2..ea805457c84 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -22,21 +22,19 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowInstructionsGenerator; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; import org.jetbrains.jet.lang.cfg.pseudocode.PseudocodeImpl; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.evaluate.ConstantExpressionEvaluator; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.CompileTimeConstantUtils; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall; import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor; -import org.jetbrains.jet.lang.resolve.constants.BooleanValue; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; @@ -550,16 +548,7 @@ public class JetControlFlowProcessor { if (condition != null) { generateInstructions(condition, IN_CONDITION); } - boolean conditionIsTrueConstant = false; - if (condition instanceof JetConstantExpression && condition.getNode().getElementType() == JetNodeTypes.BOOLEAN_CONSTANT) { - CompileTimeConstant compileTimeConstant = ConstantExpressionEvaluator.object$.evaluate(condition, trace, KotlinBuiltIns.getInstance().getBooleanType()); - if (compileTimeConstant instanceof BooleanValue) { - Boolean value = ((BooleanValue) compileTimeConstant).getValue(); - if (Boolean.TRUE.equals(value)) { - conditionIsTrueConstant = true; - } - } - } + boolean conditionIsTrueConstant = CompileTimeConstantUtils.canBeReducedToBooleanConstant(condition, trace, true); if (!conditionIsTrueConstant) { builder.jumpOnFalse(loopInfo.getExitPoint()); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CompileTimeConstantUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CompileTimeConstantUtils.java index 920e89bf11b..c350ba80023 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CompileTimeConstantUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/CompileTimeConstantUtils.java @@ -18,13 +18,18 @@ package org.jetbrains.jet.lang.resolve; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.Annotated; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.evaluate.ConstantExpressionEvaluator; +import org.jetbrains.jet.lang.psi.JetConstantExpression; +import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetParameter; import org.jetbrains.jet.lang.psi.JetTypeReference; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; +import org.jetbrains.jet.lang.resolve.constants.BooleanValue; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.types.JetType; @@ -130,6 +135,22 @@ public class CompileTimeConstantUtils { return "java.lang.Class".equals(DescriptorUtils.getFqName(descriptor).asString()); } + public static boolean canBeReducedToBooleanConstant( + @Nullable JetExpression expression, + @NotNull BindingTrace trace, + @Nullable Boolean expectedValue + ) { + if (!(expression instanceof JetConstantExpression) || expression.getNode().getElementType() != JetNodeTypes.BOOLEAN_CONSTANT) { + return false; + } + CompileTimeConstant compileTimeConstant = + ConstantExpressionEvaluator.object$.evaluate(expression, trace, KotlinBuiltIns.getInstance().getBooleanType()); + if (!(compileTimeConstant instanceof BooleanValue)) return false; + + Boolean value = ((BooleanValue) compileTimeConstant).getValue(); + return expectedValue == null || expectedValue.equals(value); + } + private CompileTimeConstantUtils() { } }