protected internal Binary(NRefactory.BinaryOperatorExpression binaryOperatorExpression, IScope scope, INRefcatoryExpressionVisitor visitor)
            : base(scope, visitor) {

            _binaryOperatorExpression = binaryOperatorExpression;
            Left = binaryOperatorExpression.Left.AcceptVisitor(Visitor, ParentScope);
            Right = binaryOperatorExpression.Right.AcceptVisitor(Visitor, ParentScope);
            _binaryOperationType = GetBinaryOperator(binaryOperatorExpression.Operator);
            _promotionDecisions = BinaryNumericPromotionDecision.Decide(Left.Type, Right.Type);
            InternalType = binaryOperatorExpression.GetBinaryOperationType(_promotionDecisions, Left.Type);
        }
 protected internal Binary(NRefactory.BinaryOperatorExpression binaryOperatorExpression, IScope scope, INRefcatoryExpressionVisitor visitor)
     : base(scope, visitor)
 {
     _binaryOperatorExpression = binaryOperatorExpression;
     Left  = binaryOperatorExpression.Left.AcceptVisitor(Visitor, ParentScope);
     Right = binaryOperatorExpression.Right.AcceptVisitor(Visitor, ParentScope);
     _binaryOperationType = GetBinaryOperator(binaryOperatorExpression.Operator);
     _promotionDecisions  = BinaryNumericPromotionDecision.Decide(Left.Type, Right.Type);
     InternalType         = binaryOperatorExpression.GetBinaryOperationType(_promotionDecisions, Left.Type);
 }
        public static Type GetBinaryOperationType(this BinaryOperatorExpression binaryOperatorExpression, BinaryNumericPromotionDecision decision, Type fallbackType) {
            BinaryOperatorType binaryOperatorType = binaryOperatorExpression.Operator;

            bool booleanCondition = binaryOperatorType.Is(BinaryOperatorType.GreaterThan) ||
                                    binaryOperatorType.Is(BinaryOperatorType.GreaterThanOrEqual) ||
                                    binaryOperatorType.Is(BinaryOperatorType.LessThan) ||
                                    binaryOperatorType.Is(BinaryOperatorType.LessThanOrEqual) ||
                                    binaryOperatorType.Is(BinaryOperatorType.Equality) ||
                                    binaryOperatorType.Is(BinaryOperatorType.InEquality);

            if (booleanCondition) {
                return TypeSystem.Boolean;
            }

            if (!decision.IsNotNumericPromotion) {
                return decision.LeftType.IsPromoted ? decision.LeftType.To : decision.LeftType.From;
            }

            return fallbackType;
        }
        internal BinaryExpressionEmitter(BinaryOperatorExpression binaryOperatorExpression,
                                         ILGenerator ilGenerator,
                                         IOpCodeIndexer instructionIndexer,
                                         IAstVisitor <ILGenerator, AstNode> visitor,
                                         List <LocalBuilder> locals)
            : base(binaryOperatorExpression, ilGenerator, instructionIndexer, visitor, locals)
        {
            var leftTypeInformation  = Node.Left.Annotation <TypeInformation>();
            var rightTypeInformation = Node.Right.Annotation <TypeInformation>();

            if (leftTypeInformation != null && rightTypeInformation != null)
            {
                _leftType           = leftTypeInformation.InferredType.GetActualType();
                _rightType          = rightTypeInformation.InferredType.GetActualType();
                _promotionDecisions = BinaryNumericPromotionDecision.Decide(_leftType, _rightType);
                Type        = Node.GetBinaryOperationType(_promotionDecisions, _leftType);
                _emitAction = EmitBinaryExpression;
            }
            else
            {
                _emitAction = EmitTernaryConditionalExpression;
            }
        }
示例#5
0
        public static Type GetBinaryOperationType(this BinaryOperatorExpression binaryOperatorExpression, BinaryNumericPromotionDecision decision, Type fallbackType)
        {
            BinaryOperatorType binaryOperatorType = binaryOperatorExpression.Operator;

            bool booleanCondition = binaryOperatorType.Is(BinaryOperatorType.GreaterThan) ||
                                    binaryOperatorType.Is(BinaryOperatorType.GreaterThanOrEqual) ||
                                    binaryOperatorType.Is(BinaryOperatorType.LessThan) ||
                                    binaryOperatorType.Is(BinaryOperatorType.LessThanOrEqual) ||
                                    binaryOperatorType.Is(BinaryOperatorType.Equality) ||
                                    binaryOperatorType.Is(BinaryOperatorType.InEquality);

            if (booleanCondition)
            {
                return(TypeSystem.Boolean);
            }

            if (!decision.IsNotNumericPromotion)
            {
                return(decision.LeftType.IsPromoted ? decision.LeftType.To : decision.LeftType.From);
            }

            return(fallbackType);
        }