IDEA-135439 Unable to use Boolean breakpoint condition - better fix, moved unboxing to evaluator builder

This commit is contained in:
Egor.Ushakov
2015-01-21 13:50:49 +03:00
parent f3a179b136
commit cf49e2e0bf
8 changed files with 19 additions and 13 deletions
@@ -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);
@@ -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;
}
@@ -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;
}
@@ -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;
@@ -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;
}
@@ -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 {
@@ -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);
}
@@ -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;
}