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; } }
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); }