DataDictionary.Interpreter.BinaryExpression.GetExpressionType C# (CSharp) Method

GetExpressionType() public method

Provides the type of this expression
public GetExpressionType ( ) : Type
return DataDictionary.Types.Type
        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;
        }