public INodesCollection Transform(INodesCollection nodes)
		{
			var newNodes = new NodesCollection();
			var boolType = typeof (bool);

			for (var i = 0; i < nodes.Count; i++)
			{
				var memberNode = nodes[i] as MemberNode;
				if(memberNode == null || memberNode.MemberType != boolType)
				{
					newNodes.AddNode(nodes[i]);
					continue;
				}

				var firstNextNode = nodes.GetItemOrNullByIndex(i + 1) as OperatorNode;
				var secondNextNode = nodes.GetItemOrNullByIndex(i + 2) as ValueNode;
				var memberNodeIsPartOfCompleteBoolExpression = 
					firstNextNode != null && 
					secondNextNode != null &&
					secondNextNode.Value is bool;
				
				if (memberNodeIsPartOfCompleteBoolExpression)
					newNodes.AddNode(memberNode);
				else
					newNodes.AddNodes(memberNode, new OperatorNode(Operator.Equal()), new ValueNode(true));
			}

			return newNodes;
		}
        public virtual INode[] Transform(int maxIndex, ref int index, INode node, INodesCollection orgNodes)
        {
            var nullableNode = node as NullableMemberNode;

            if (nullableNode == null || !nullableNode.IsForHasValueCheck)
            {
                return new[] { node }
            }
            ;

            if (index == maxIndex)
            {
                return new INode[] { nullableNode, new OperatorNode(Operator.IsNot()), new NullNode() }
            }
            ;

            var rightOperator = orgNodes.GetItemOrNullByIndex(index + 1) as OperatorNode;
            var rightValue    = orgNodes.GetItemOrNullByIndex(index + 2) as ValueNode;

            if (rightOperator == null || rightValue == null)
            {
                return new INode[] { nullableNode, new OperatorNode(Operator.IsNot()), new NullNode() }
            }
            ;

            var operatorType = rightOperator.Operator.OperatorType;
            var hasValueIs   = (bool)rightValue.Value;

            var shouldBeIsNotNullNodes =
                (operatorType == Operator.Types.Equal && hasValueIs) ||
                (operatorType == Operator.Types.NotEqual && hasValueIs == false);

            var shouldBeIsNullNodes =
                (operatorType == Operator.Types.Equal && hasValueIs == false) ||
                (operatorType == Operator.Types.Equal && hasValueIs == false);

            if (shouldBeIsNotNullNodes)
            {
                index += 2;

                return(new INode[] { nullableNode, new OperatorNode(Operator.IsNot()), new NullNode() });
            }

            if (shouldBeIsNullNodes)
            {
                index += 2;
                return(new INode[] { nullableNode, new OperatorNode(Operator.Is()), new NullNode() });
            }

            return(new[] { node });
        }
    }
}
        public virtual INode[] Transform(int maxIndex, ref int index, INode node, INodesCollection orgNodes)
        {
            var memberNode = node as MemberNode;
            if (memberNode == null || !memberNode.DataType.IsBoolType())
                return new[] { node };

            var firstNextNode = orgNodes.GetItemOrNullByIndex(index + 1) as OperatorNode;
            var secondNextNode = orgNodes.GetItemOrNullByIndex(index + 2) as ValueNode;
            var memberNodeIsPartOfCompleteBoolExpression =
                firstNextNode != null &&
                secondNextNode != null &&
                secondNextNode.Value is bool;

            return memberNodeIsPartOfCompleteBoolExpression 
                ? new[] { memberNode } 
                : new INode[] { memberNode, new OperatorNode(Operator.Equal()), new ValueNode(true) };
        }
        public virtual INode[] Transform(int maxIndex, ref int index, INode node, INodesCollection orgNodes)
        {
            var nullableNode = node as NullableMemberNode;
            if (nullableNode == null || !nullableNode.IsForHasValueCheck)
                return new[] { node };

            if (index == maxIndex)
                return new INode[] { nullableNode, new OperatorNode(Operator.IsNot()), new NullNode() };

            var rightOperator = orgNodes.GetItemOrNullByIndex(index + 1) as OperatorNode;
            var rightValue = orgNodes.GetItemOrNullByIndex(index + 2) as ValueNode;

            if (rightOperator == null || rightValue == null)
                return new INode[] { nullableNode, new OperatorNode(Operator.IsNot()), new NullNode() };

            var operatorType = rightOperator.Operator.OperatorType;
            var hasValueIs = (bool)rightValue.Value;

            var shouldBeIsNotNullNodes =
                (operatorType == Operator.Types.Equal && hasValueIs)
                || (operatorType == Operator.Types.NotEqual && hasValueIs == false);

            var shouldBeIsNullNodes =
                (operatorType == Operator.Types.Equal && hasValueIs == false)
                || (operatorType == Operator.Types.Equal && hasValueIs == false);

            if (shouldBeIsNotNullNodes)
            {
                index += 2;
                return new INode[] { nullableNode, new OperatorNode(Operator.IsNot()), new NullNode() };
            }

            if (shouldBeIsNullNodes)
            {
                index += 2;
                return new INode[] { nullableNode, new OperatorNode(Operator.Is()), new NullNode() };
            }

            return new[] { node };
        }
        public virtual INode[] Transform(int maxIndex, ref int index, INode node, INodesCollection orgNodes)
        {
            var memberNode = node as MemberNode;

            if (memberNode == null || !memberNode.DataType.IsBoolType())
            {
                return new[] { node }
            }
            ;

            var firstNextNode  = orgNodes.GetItemOrNullByIndex(index + 1) as OperatorNode;
            var secondNextNode = orgNodes.GetItemOrNullByIndex(index + 2) as ValueNode;
            var memberNodeIsPartOfCompleteBoolExpression =
                firstNextNode != null &&
                secondNextNode != null &&
                secondNextNode.Value is bool;

            return(memberNodeIsPartOfCompleteBoolExpression
                ? new[] { memberNode }
                : new INode[] { memberNode, new OperatorNode(Operator.Equal()), new ValueNode(true) });
        }
    }