blob: 46234bc4f0f31892b0af44b7b825707d2dd68458 [file] [log] [blame]
/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.engine.internal.object;
/**
* Instances of the class {@code BoolState} represent the state of an object representing a boolean
* value.
*/
public class BoolState extends InstanceState {
/**
* The value of this instance.
*/
private Boolean value;
/**
* An instance representing the boolean value 'false'.
*/
public static final BoolState FALSE_STATE = new BoolState(Boolean.FALSE);
/**
* An instance representing the boolean value 'true'.
*/
public static final BoolState TRUE_STATE = new BoolState(Boolean.TRUE);
/**
* A state that can be used to represent a boolean whose value is not known.
*/
public static final BoolState UNKNOWN_VALUE = new BoolState(null);
/**
* Return the boolean state representing the given boolean value.
*
* @param value the value to be represented
* @return the boolean state representing the given boolean value
*/
public static BoolState from(boolean value) {
return value ? BoolState.TRUE_STATE : BoolState.FALSE_STATE;
}
/**
* Initialize a newly created state to represent the given value.
*
* @param value the value of this instance
*/
private BoolState(Boolean value) {
this.value = value;
}
@Override
public BoolState convertToBool() {
return this;
}
@Override
public StringState convertToString() {
if (value == null) {
return StringState.UNKNOWN_VALUE;
}
return new StringState(value ? "true" : "false");
}
@Override
public BoolState equalEqual(InstanceState rightOperand) throws EvaluationException {
assertBoolNumStringOrNull(rightOperand);
if (value == null) {
return UNKNOWN_VALUE;
}
if (rightOperand instanceof BoolState) {
Boolean rightValue = ((BoolState) rightOperand).getValue();
if (rightValue == null) {
return UNKNOWN_VALUE;
}
return BoolState.from(value == rightValue);
} else if (rightOperand instanceof DynamicState) {
return UNKNOWN_VALUE;
}
return FALSE_STATE;
}
@Override
public boolean equals(Object object) {
return object instanceof BoolState && value == ((BoolState) object).value;
}
@Override
public String getTypeName() {
return "bool"; //$NON-NLS-0$
}
@Override
public Boolean getValue() {
return value;
}
@Override
public boolean hasExactValue() {
return true;
}
@Override
public int hashCode() {
return value == null ? 0 : (value ? 2 : 3);
}
/**
* Return {@code true} if this object represents an object whose type is 'bool'.
*
* @return {@code true} if this object represents a boolean value
*/
@Override
public boolean isBool() {
return true;
}
@Override
public boolean isBoolNumStringOrNull() {
return true;
}
@Override
public boolean isUnknown() {
return value == null;
}
@Override
public BoolState logicalAnd(InstanceState rightOperand) throws EvaluationException {
assertBool(rightOperand);
if (value == null) {
return UNKNOWN_VALUE;
}
return value ? rightOperand.convertToBool() : FALSE_STATE;
}
@Override
public BoolState logicalNot() {
if (value == null) {
return UNKNOWN_VALUE;
}
return value ? FALSE_STATE : TRUE_STATE;
}
@Override
public BoolState logicalOr(InstanceState rightOperand) throws EvaluationException {
assertBool(rightOperand);
if (value == null) {
return UNKNOWN_VALUE;
}
return value ? TRUE_STATE : rightOperand.convertToBool();
}
@Override
public String toString() {
return value == null ? "-unknown-" : (value ? "true" : "false");
}
}