/// <summary>
        ///     The visit method call.
        /// </summary>
        /// <param name="m">
        ///     The memberAccess.
        /// </param>
        /// <returns>
        ///     The <see cref="Expression" />.
        /// </returns>
        protected override Expression VisitMethodCall(MethodCallExpression m)
        {
            QNode      node;
            MethodType method;
            BinaryType binary;

            if (MethodType.TryParse(m.Method.Name, out method))
            {
                node = new QNode()
                {
                    Type = NodeType.Method, Value = method
                };
            }
            else if (BinaryType.TryParse(m.Method.Name, out binary))
            {
                node = new QNode()
                {
                    Type = NodeType.Binary, Value = binary
                };
            }
            else
            {
                throw new Exception(m.Method.Name);
            }


            if (m.Object != null)
            {
                if (m.Arguments[0].NodeType == ExpressionType.MemberAccess)
                {
                    if (typeof(IConstantPlaceHolder).IsAssignableFrom(
                            ((MemberExpression)m.Arguments[0]).Expression.Type))
                    {
                        this.Visit(m.Object);
                        node.Left = this.Context.Pop();
                        this.Visit(m.Arguments[0]);
                        node.Right = this.Context.Pop();
                    }
                    else
                    {
                        //node = new CallNode("In");
                        //this.Visit(m.Arguments[0]);
                        //node.Left = this.Context.Pop();
                        //this.Visit(m.Object);
                        //node.Right = this.Context.Pop();
                    }
                }
                else
                {
                    this.Visit(m.Object);
                    node.Left = this.Context.Pop();
                    this.Visit(m.Arguments[0]);
                    node.Right = this.Context.Pop();
                }
            }
            else
            {
                this.Visit(m.Arguments[0]);
                node.Left = this.Context.Pop();
                if (m.Arguments.Count > 1)
                {
                    this.Visit(m.Arguments[1]);
                    node.Right = this.Context.Pop();
                }
            }

            this.Context.Push(node);
            return(m);
        }