public FunctionCallExpression4(FunctionExpression method, XzaarExpression arg0, XzaarExpression arg1, XzaarExpression arg2, XzaarExpression arg3)
     : base(method)
 {
     _arg0 = arg0;
     _arg1 = arg1;
     _arg2 = arg2;
     _arg3 = arg3;
 }
        public InstanceFunctionCallExpression2(FunctionExpression method, XzaarExpression instance, XzaarExpression arg0, XzaarExpression arg1)
            : base(method)
        {
            //Debug.Assert(instance != null);

            _instance = instance;
            _arg0     = arg0;
            _arg1     = arg1;
        }
        private static ParameterExpression[] GetParametersForValidation(FunctionExpression method, ExpressionType nodeKind)
        {
            if (nodeKind != ExpressionType.Dynamic)
            {
                return(method.Parameters);
            }
            var methodParam = method.Parameters;
            var param       = new ParameterExpression[methodParam.Length - 1];

            Array.Copy(methodParam, 1, param, 0, param.Length);
            return(param);
        }
        public static FunctionCallExpression Call(string alias, FunctionExpression method, params XzaarExpression[] arguments)
        {
            if (method == null)
            {
                throw new ArgumentNullException(nameof(method));
            }

            ReadOnlyCollection <XzaarExpression> argList = new ReadOnlyCollection <XzaarExpression>(arguments);

            ValidateMethodInfo(method);
            ValidateArgumentTypes(method, ExpressionType.Call, ref argList);

            return(new FunctionCallExpressionN(alias, method, argList));
        }
        private static XzaarExpression ValidateOneArgument(FunctionExpression method, ExpressionType nodeKind, XzaarExpression arg, ParameterExpression pi)
        {
            if (pi == null)
            {
                // this is most likely an 'Any' object
                return(arg);
            }

            RequiresCanRead(arg, "arguments");

            var pType = pi.Type.IsByRef ? pi.Type.GetElementType() : pi.Type;

            // XzaarTypeUtils.ValidateType(pType);
            if (!XzaarTypeUtils.AreReferenceAssignable(pType, arg.Type))
            {
                if (TryQuote(pType, ref arg))
                {
                    return(arg);
                }

                // Throw the right error for the node we were given
                switch (nodeKind)
                {
                case ExpressionType.New:
                    throw new InvalidOperationException();

                // throw Error.ExpressionTypeDoesNotMatchConstructorParameter(arg.Type, pType);
                case ExpressionType.Invoke:
                    throw new InvalidOperationException();

                // throw Error.ExpressionTypeDoesNotMatchParameter(arg.Type, pType);
                case ExpressionType.Dynamic:
                case ExpressionType.Call:
                    throw new ExpressionException("Expression type does not match method parameter: '" + arg.Type.Name + "' and '" + pType.Name + "'");

                // throw Error.ExpressionTypeDoesNotMatchMethodParameter(arg.Type, pType, method);
                default:
                    throw new InvalidOperationException();
                    // throw ContractUtils.Unreachable;
                }
            }
            return(arg);
        }
 internal FunctionCallExpression(string alias, FunctionExpression method, IList <XzaarExpression> args = null)
 {
     arguments     = args ?? new List <XzaarExpression>();
     this.function = method;
     this.alias    = alias;
 }
 internal FunctionCallExpression(FunctionExpression method, IList <XzaarExpression> args = null)
 {
     arguments     = args ?? new List <XzaarExpression>();
     this.function = method;
 }
 public FunctionCallExpression2(FunctionExpression method, XzaarExpression arg0, XzaarExpression arg1)
     : base(method)
 {
     _arg0 = arg0;
     _arg1 = arg1;
 }
 public FunctionCallExpression1(FunctionExpression method, XzaarExpression arg0)
     : base(method)
 {
     _arg0 = arg0;
 }
 public InstanceFunctionCallExpressionN(FunctionExpression method, XzaarExpression instance, IList <XzaarExpression> args)
     : base(method)
 {
     _instance = instance;
     arguments = args;
 }
 public FunctionCallExpressionN(string alias, FunctionExpression method, IList <XzaarExpression> args)
     : base(alias, method, args)
 {
     arguments = args;
 }
 public FunctionCallExpressionN(FunctionExpression method, IList <XzaarExpression> args) : base(method, args)
 {
     arguments = args;
 }