/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.expressions;
import gw.internal.gosu.parser.BeanAccess;
import gw.lang.parser.expressions.IEqualityExpression;
import gw.lang.reflect.IType;
/**
* Represents an equality expression in the Gosu grammar:
* <pre>
* <i>equality-expression</i>
* <relational-expression>
* <equality-expression> <b>==</b> <relational-expression>
* <equality-expression> <b>!=</b> <relational-expression>
* <equality-expression> <b><></b> <relational-expression>
* </pre>
* <p/>
*
* @see gw.lang.parser.IGosuParser
*/
public class EqualityExpression extends ConditionalExpression implements IEqualityExpression
{
/**
* Is this an equals or a not-equals?
*/
protected boolean _bEquals;
/**
* @return True if this is an equals expression (as apposed to not-eqauls).
*/
public boolean isEquals()
{
return _bEquals;
}
/**
* @param bEquals True if this is an equals expression (as apposed to not-eqauls).
*/
public void setEquals( boolean bEquals )
{
_bEquals = bEquals;
}
/**
*/
public Object evaluate()
{
if( !isCompileTimeConstant() )
{
return super.evaluate();
}
Object lhsValue = getLHS().evaluate();
Object rhsValue = getRHS().evaluate();
IType lhsType = getLHS().getType();
IType rhsType = getRHS().getType();
boolean bValue;
if( lhsValue != null && rhsValue != null && BeanAccess.isNumericType( getLHS().getType() ) )
{
bValue = compareNumbers( lhsValue, rhsValue, lhsType, rhsType ) == 0 ? Boolean.TRUE : Boolean.FALSE;
}
else
{
bValue = BeanAccess.areValuesEqual( lhsType, lhsValue, rhsType, rhsValue );
}
return isEquals() ? bValue : !bValue;
}
@Override
public String toString()
{
return getLHS().toString()
+ (isEquals() ? "==" : "!=" )
+ getRHS().toString();
}
}