* @param rightAST right operand
* @return Type
*/
protected Type analyseRelationalExpr(JQLAST op, JQLAST leftAST, JQLAST rightAST)
{
Type left = leftAST.getJQLType();
Type right = rightAST.getJQLType();
// handle error type
if (left.equals(typetab.errorType) || right.equals(typetab.errorType))
return typetab.errorType;
// special check for <, <=, >, >=
// left and right hand types must be orderable
switch(op.getType())
{
case LT:
case LE:
case GT:
case GE:
if (!left.isOrderable())
{
errorMsg.error(op.getLine(), op.getColumn(),
I18NHelper.getMessage(messages, "jqlc.semantic.analyserelationalexpr.notorderable", //NOI18N
left.getName(), op.getText()));
return typetab.errorType;
}
if (!right.isOrderable())
{
errorMsg.error(op.getLine(), op.getColumn(),
I18NHelper.getMessage(messages, "jqlc.semantic.analyserelationalexpr.notorderable", //NOI18N
right.getName(), op.getText()));
return typetab.errorType;
}
break;
case EQUAL:
case NOT_EQUAL:
if ((leftAST.getType() == CONTAINS) || (rightAST.getType() == CONTAINS))
{
errorMsg.unsupported(op.getLine(), op.getColumn(),
I18NHelper.getMessage(messages,
"jqlc.semantic.generic.unsupportedconstraintop", op.getText())); //NOI18N
return typetab.errorType;
}
break;
}
// check for numeric types, numeric wrapper class types and math class types
if (typetab.isNumberType(left) && typetab.isNumberType(right))
return typetab.booleanType;
// check for boolean and java.lang.Boolean
if (typetab.isBooleanType(left) && typetab.isBooleanType(right))
return typetab.booleanType;
if (left.isCompatibleWith(right) || right.isCompatibleWith(left))
return typetab.booleanType;
// if this code is reached a conditional operator was used with invalid arguments
errorMsg.error(op.getLine(), op.getColumn(),
I18NHelper.getMessage(messages, "jqlc.semantic.generic.arguments.invalid", //NOI18N