protected override BoundExpression RewriteUnaryExpression(BoundUnaryExpression expression) { if (expression.Operand.Type != NodeType.UnaryExpression) { return(base.RewriteUnaryExpression(expression)); } var subUnary = (BoundUnaryExpression)expression.Operand; bool isIdentity = (expression.Op.OperatorType == UnaryOperatorType.Identity && subUnary.Op.OperatorType == UnaryOperatorType.Identity) || (expression.Op.OperatorType == UnaryOperatorType.Negation && subUnary.Op.OperatorType == UnaryOperatorType.Negation) || (expression.Op.OperatorType == UnaryOperatorType.LogicalNot && subUnary.Op.OperatorType == UnaryOperatorType.LogicalNot); bool isNegation = (expression.Op.OperatorType == UnaryOperatorType.Identity && subUnary.Op.OperatorType == UnaryOperatorType.Negation) || (expression.Op.OperatorType == UnaryOperatorType.Negation && subUnary.Op.OperatorType == UnaryOperatorType.Identity); if (isIdentity) { return(RewriteExpression(subUnary.Operand)); } if (isNegation) { return(RewriteExpression(new BoundUnaryExpression(UnaryOperator.Bind("-", subUnary.Op.OperandType), subUnary.Operand))); } return(base.RewriteUnaryExpression(expression)); }
private BoundExpression Negate(BoundExpression condition) { if (condition is BoundLiteral literal) { var value = (bool)literal.Value; return(new BoundLiteral(!value)); } var op = UnaryOperator.Bind("!", ValueTypeSymbol.Boolean); return(new BoundUnaryExpression(op, condition)); }