Exemplo n.º 1
0
        /// <summary>
        ///     The visit binary.
        /// </summary>
        /// <param name="b">
        ///     The b.
        /// </param>
        /// <returns>
        ///     The <see cref="Expression" />.
        /// </returns>
        protected override Expression VisitBinary(BinaryExpression expression)
        {
            BinaryType op;

            if (!BinaryType.TryParse(expression.NodeType.ToString(), out op))
            {
                if (expression.NodeType == ExpressionType.OrElse)
                {
                    op = BinaryType.Or;
                }
                else if (expression.NodeType == ExpressionType.AndAlso)
                {
                    op = BinaryType.And;
                }
                else
                {
                    throw new Exception(expression.NodeType.ToString());
                }
            }

            var node = new QNode()
            {
                Type = NodeType.Binary, Value = op
            };

            this.Visit(expression.Left);
            node.Left = this.Context.Pop();
            this.Visit(expression.Right);
            node.Right = this.Context.Pop();

            this.Context.Push(node);

            return(expression);
        }
Exemplo n.º 2
0
        /// <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);
        }