From cf49e2e0bf550d7c4608bfbf6c4aaf04e163e2b3 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Wed, 21 Jan 2015 13:49:30 +0300 Subject: [PATCH] IDEA-135439 Unable to use Boolean breakpoint condition - better fix, moved unboxing to evaluator builder --- .../expression/ConditionalExpressionEvaluator.java | 5 +++-- .../engine/evaluation/expression/DisableGC.java | 5 +++-- .../expression/DoWhileStatementEvaluator.java | 2 +- .../evaluation/expression/EvaluatorBuilderImpl.java | 11 +++++++---- .../expression/ForStatementEvaluatorBase.java | 2 +- .../evaluation/expression/IfStatementEvaluator.java | 2 +- .../evaluation/expression/UnBoxingEvaluator.java | 3 ++- .../expression/WhileStatementEvaluator.java | 2 +- 8 files changed, 19 insertions(+), 13 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ConditionalExpressionEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ConditionalExpressionEvaluator.java index fd90cd6ca773..9e748c9df072 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ConditionalExpressionEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ConditionalExpressionEvaluator.java @@ -25,6 +25,7 @@ import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; import com.sun.jdi.BooleanValue; +import com.sun.jdi.Value; class ConditionalExpressionEvaluator implements Evaluator { private final Evaluator myConditionEvaluator; @@ -44,8 +45,8 @@ class ConditionalExpressionEvaluator implements Evaluator { @Override public Object evaluate(EvaluationContextImpl context) throws EvaluateException { - Object condition = UnBoxingEvaluator.unbox(myConditionEvaluator.evaluate(context), context); - if (!(condition instanceof BooleanValue)) { + Value condition = (Value)myConditionEvaluator.evaluate(context); + if (condition == null || !(condition instanceof BooleanValue)) { throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("evaluation.error.boolean.condition.expected")); } return ((BooleanValue)condition).booleanValue()? myThenEvaluator.evaluate(context) : myElseEvaluator.evaluate(context); diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DisableGC.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DisableGC.java index 1c5e7182c6ad..e4905af7fec5 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DisableGC.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DisableGC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package com.intellij.debugger.engine.evaluation.expression; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; import com.sun.jdi.ObjectReference; +import org.jetbrains.annotations.NotNull; /** * @author Eugene Zhuravlev @@ -26,7 +27,7 @@ import com.sun.jdi.ObjectReference; public class DisableGC implements Evaluator{ private final Evaluator myDelegate; - public DisableGC(Evaluator delegate) { + public DisableGC(@NotNull Evaluator delegate) { myDelegate = delegate; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DoWhileStatementEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DoWhileStatementEvaluator.java index 234e79c87659..1e48568a8dd8 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DoWhileStatementEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/DoWhileStatementEvaluator.java @@ -41,7 +41,7 @@ public class DoWhileStatementEvaluator extends LoopEvaluator { while (true) { if (body(context)) break; - value = UnBoxingEvaluator.unbox(myConditionEvaluator.evaluate(context), context); + value = myConditionEvaluator.evaluate(context); if (!(value instanceof BooleanValue)) { throw EvaluateExceptionUtil.BOOLEAN_EXPECTED; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java index be2204ea2224..2363cf9f93ba 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java @@ -233,7 +233,7 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { Evaluator bodyEvaluator = accept(statement.getBody()); Evaluator conditionEvaluator = accept(statement.getCondition()); if (conditionEvaluator != null) { - myResult = new DoWhileStatementEvaluator(conditionEvaluator, bodyEvaluator, getLabel(statement)); + myResult = new DoWhileStatementEvaluator(new UnBoxingEvaluator(conditionEvaluator), bodyEvaluator, getLabel(statement)); } } @@ -242,7 +242,7 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { Evaluator bodyEvaluator = accept(statement.getBody()); Evaluator conditionEvaluator = accept(statement.getCondition()); if (conditionEvaluator != null) { - myResult = new WhileStatementEvaluator(conditionEvaluator, bodyEvaluator, getLabel(statement)); + myResult = new WhileStatementEvaluator(new UnBoxingEvaluator(conditionEvaluator), bodyEvaluator, getLabel(statement)); } } @@ -250,6 +250,9 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { public void visitForStatement(PsiForStatement statement) { Evaluator initializerEvaluator = accept(statement.getInitialization()); Evaluator conditionEvaluator = accept(statement.getCondition()); + if (conditionEvaluator != null) { + conditionEvaluator = new UnBoxingEvaluator(conditionEvaluator); + } Evaluator updateEvaluator = accept(statement.getUpdate()); Evaluator bodyEvaluator = accept(statement.getBody()); if (bodyEvaluator != null) { @@ -302,7 +305,7 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { if(condition == null) return; condition.accept(this); - myResult = new IfStatementEvaluator(myResult, thenEvaluator, elseEvaluator); + myResult = new IfStatementEvaluator(new UnBoxingEvaluator(myResult), thenEvaluator, elseEvaluator); } @Override @@ -582,7 +585,7 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { if (myResult == null) { throwEvaluateException(DebuggerBundle.message("evaluation.error.invalid.expression", condition.getText())); return; } - Evaluator conditionEvaluator = myResult; + Evaluator conditionEvaluator = new UnBoxingEvaluator(myResult); thenExpression.accept(this); if (myResult == null) { throwEvaluateException(DebuggerBundle.message("evaluation.error.invalid.expression", thenExpression.getText())); return; diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ForStatementEvaluatorBase.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ForStatementEvaluatorBase.java index cd5364b409ab..1064d0747b2b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ForStatementEvaluatorBase.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/ForStatementEvaluatorBase.java @@ -34,7 +34,7 @@ public abstract class ForStatementEvaluatorBase extends LoopEvaluator { while (true) { // condition - Object codition = UnBoxingEvaluator.unbox(evaluateCondition(context), context); + Object codition = evaluateCondition(context); if (codition instanceof Boolean) { if (!(Boolean)codition) break; } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/IfStatementEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/IfStatementEvaluator.java index ed253101d955..a48e960008ee 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/IfStatementEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/IfStatementEvaluator.java @@ -41,7 +41,7 @@ public class IfStatementEvaluator implements Evaluator { } public Object evaluate(EvaluationContextImpl context) throws EvaluateException { - Object value = UnBoxingEvaluator.unbox(myConditionEvaluator.evaluate(context), context); + Object value = myConditionEvaluator.evaluate(context); if(!(value instanceof BooleanValue)) { throw EvaluateExceptionUtil.BOOLEAN_EXPECTED; } else { diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/UnBoxingEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/UnBoxingEvaluator.java index 8f1f6a7fc3f9..41242c5fdfa3 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/UnBoxingEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/UnBoxingEvaluator.java @@ -24,6 +24,7 @@ import com.sun.jdi.ClassType; import com.sun.jdi.Method; import com.sun.jdi.ObjectReference; import com.sun.jdi.Value; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; @@ -52,7 +53,7 @@ public class UnBoxingEvaluator implements Evaluator{ return TYPES_TO_CONVERSION_METHOD_MAP.containsKey(typeName); } - public UnBoxingEvaluator(Evaluator operand) { + public UnBoxingEvaluator(@NotNull Evaluator operand) { myOperand = new DisableGC(operand); } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/WhileStatementEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/WhileStatementEvaluator.java index 7a7761544d92..50a9a4bcf470 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/WhileStatementEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/WhileStatementEvaluator.java @@ -39,7 +39,7 @@ public class WhileStatementEvaluator extends LoopEvaluator { public Object evaluate(EvaluationContextImpl context) throws EvaluateException { Object value; while (true) { - value = UnBoxingEvaluator.unbox(myConditionEvaluator.evaluate(context), context); + value = myConditionEvaluator.evaluate(context); if (!(value instanceof BooleanValue)) { throw EvaluateExceptionUtil.BOOLEAN_EXPECTED; }