static private MultiNode BuildMulti(BinaryExpression be, BaseNode parent, bool negate) { var result = new MultiNode(); result.Not = negate; result.Mode = be.NodeType == ExpressionType.AndAlso ? MultiNode.Operator.All : MultiNode.Operator.Any; if ((parent as MultiNode)?.Mode == result.Mode) { (parent as MultiNode).AddNode(BuildFromExpression(be.Left, parent)); (parent as MultiNode).AddNode(BuildFromExpression(be.Right, parent)); return(null); } else { result.AddNode(BuildFromExpression(be.Left, result)); result.AddNode(BuildFromExpression(be.Right, result)); } return(result); }
/// <summary> /// Injects a new MultiNode into the tree, in place of the current node, and makes the current node a child of the MultiNode. /// </summary> /// <returns>The injected MultiNode</returns> public MultiNode PromoteToMulti() { var multi = new MultiNode(); if (Parent != null) { var i = Parent.Children.IndexOf(this); Parent.Children.Remove(this); Parent.AddNode(multi, i); } multi.AddNode(this); return(multi); }