public override Type GetExpressionType()
{
Type retVal = null;
Type leftType = Left.GetExpressionType();
if (leftType == null)
{
AddError("Cannot determine expression type (1) for " + Left, RuleChecksEnum.SemanticAnalysisError);
}
else
{
if (Operation == Operator.Is)
{
retVal = EfsSystem.Instance.BoolType;
}
else if (Operation == Operator.As)
{
retVal = Right.Ref as Structure;
}
else
{
Type rightType = Right.GetExpressionType();
if (rightType == null)
{
AddError("Cannot determine expression type (2) for " + Right, RuleChecksEnum.SemanticAnalysisError);
}
else
{
switch (Operation)
{
case Operator.Exp:
case Operator.Mult:
case Operator.Div:
case Operator.Add:
case Operator.Sub:
if (leftType.Match(rightType))
{
if (leftType is IntegerType || leftType is DoubleType)
{
retVal = rightType;
}
else
{
retVal = leftType;
}
}
else
{
retVal = leftType.CombineType(rightType, Operation);
}
break;
case Operator.And:
case Operator.Or:
if (leftType == EfsSystem.Instance.BoolType && rightType == EfsSystem.Instance.BoolType)
{
retVal = EfsSystem.Instance.BoolType;
}
break;
case Operator.Equal:
case Operator.NotEqual:
case Operator.Less:
case Operator.LessOrEqual:
case Operator.Greater:
case Operator.GreaterOrEqual:
case Operator.Is:
case Operator.As:
if (leftType.Match(rightType) || rightType.Match(leftType))
{
retVal = EfsSystem.Instance.BoolType;
}
break;
case Operator.In:
case Operator.NotIn:
Collection collection = rightType as Collection;
if (collection != null)
{
if (collection.Type == null)
{
retVal = EfsSystem.Instance.BoolType;
}
else if (collection.Type.Match(leftType))
{
retVal = EfsSystem.Instance.BoolType;
}
}
else
{
StateMachine stateMachine = rightType as StateMachine;
if (stateMachine != null && leftType.Match(stateMachine))
{
retVal = EfsSystem.Instance.BoolType;
}
}
break;
case Operator.Undef:
break;
}
}
}
}
return retVal;
}