static AotCompiler()
        {
            // AOT
#pragma warning disable 1720
            if (typeof(AotCompiler).Name == string.Empty)
            {
                // ReSharper disable PossibleNullReferenceException
                // ReSharper disable ReturnValueOfPureMethodIsNotUsed
                default(ArrayIndexNode).Run(default(Closure));
                default(ArrayIndexNode).ToString();
                default(Closure).GetType(default(object));
                default(ArrayLengthNode).Run(default(Closure));
                default(ArrayLengthNode).ToString();
                default(BinaryNode).Run(default(Closure));
                BinaryNode.Create(default(BinaryExpression), default(ConstantExpression[]), default(ParameterExpression[]));
                default(BinaryNode).ToString();
                default(CallNode).Run(default(Closure));
                default(CallNode).ToString();
                default(CoalesceNode).Run(default(Closure));
                default(CoalesceNode).ToString();
                default(ConditionalNode).Run(default(Closure));
                default(ConditionalNode).ToString();
                default(ConstantNode).Run(default(Closure));
                default(ConstantNode).ToString();
                default(ExecutionNode).Run(default(Closure));
                FastCall.TryCreate(default(System.Reflection.MethodInfo));
                Intrinsic.InvokeBinaryOperation(default(Closure), default(object), default(object), default(ExpressionType), default(Intrinsic.BinaryOperation));
                Intrinsic.InvokeUnaryOperation(default(Closure), default(object), default(ExpressionType), default(Intrinsic.UnaryOperation));
                Intrinsic.InvokeConversion(default(Closure), default(object), default(Type), default(ExpressionType), default(Intrinsic.UnaryOperation));
                Intrinsic.CreateUnaryOperationFn(default(System.Reflection.MethodInfo));
                Intrinsic.CreateBinaryOperationFn(default(System.Reflection.MethodInfo));
                Intrinsic.WrapUnaryOperation(default(Type), default(string));
                Intrinsic.WrapUnaryOperation(default(System.Reflection.MethodInfo));
                Intrinsic.WrapBinaryOperation(default(Type), default(string));
                Intrinsic.WrapBinaryOperation(default(System.Reflection.MethodInfo));
                default(InvocationNode).Run(default(Closure));
                default(InvocationNode).ToString();
                default(LambdaNode).Run(default(Closure));
                default(LambdaNode).ToString();
                default(ListInitNode).Run(default(Closure));
                default(ListInitNode).ToString();
                default(LocalNode).Run(default(Closure));
                default(LocalNode).ToString();
                default(MemberAccessNode).Run(default(Closure));
                default(MemberAccessNode).ToString();
                default(MemberAssignmentsNode).Run(default(Closure));
                default(MemberAssignmentsNode).ToString();
                default(MemberInitNode).Run(default(Closure));
                default(MemberInitNode).ToString();
                default(MemberListBindingsNode).Run(default(Closure));
                default(MemberListBindingsNode).ToString();
                default(MemberMemberBindingsNode).Run(default(Closure));
                default(MemberMemberBindingsNode).ToString();
                default(NewArrayBoundsNode).Run(default(Closure));
                default(NewArrayBoundsNode).ToString();
                default(NewArrayInitNode).Run(default(Closure));
                default(NewArrayInitNode).ToString();
                default(NewNode).Run(default(Closure));
                default(NewNode).ToString();
                default(UnaryNode).Run(default(Closure));
                UnaryNode.Create(default(UnaryExpression), default(ConstantExpression[]), default(ParameterExpression[]));
                default(UnaryNode).ToString();
                default(NullNode).Run(default(Closure));
                default(NullNode).ToString();
                default(ParameterNode).Run(default(Closure));
                default(ParameterNode).ToString();
                default(QuoteNode).Run(default(Closure));
                default(QuoteNode).ToString();
                default(TypeAsNode).Run(default(Closure));
                default(TypeAsNode).ToString();
                default(TypeIsNode).Run(default(Closure));
                default(TypeIsNode).ToString();
                // ReSharper restore ReturnValueOfPureMethodIsNotUsed
                // ReSharper restore PossibleNullReferenceException
            }
#pragma warning restore 1720
        }
        public static ExecutionNode Compile(Expression expression, ConstantExpression[] constExpressions, ParameterExpression[] parameterExpressions)
        {
            if (expression == null)
            {
                return(NullNode.Instance);
            }

            if (constExpressions == null)
            {
                throw new ArgumentNullException("constExpressions");
            }
            if (parameterExpressions == null)
            {
                throw new ArgumentNullException("parameterExpressions");
            }

            switch (expression.NodeType)
            {
            case ExpressionType.ArrayIndex:
                return(new ArrayIndexNode(expression, constExpressions, parameterExpressions));

            case ExpressionType.Coalesce:
                return(new CoalesceNode((BinaryExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Add:
            case ExpressionType.AddChecked:
            case ExpressionType.And:
            case ExpressionType.AndAlso:
            case ExpressionType.Divide:
            case ExpressionType.Equal:
            case ExpressionType.ExclusiveOr:
            case ExpressionType.GreaterThan:
            case ExpressionType.GreaterThanOrEqual:
            case ExpressionType.LeftShift:
            case ExpressionType.LessThan:
            case ExpressionType.LessThanOrEqual:
            case ExpressionType.Modulo:
            case ExpressionType.Multiply:
            case ExpressionType.MultiplyChecked:
            case ExpressionType.NotEqual:
            case ExpressionType.Or:
            case ExpressionType.OrElse:
            case ExpressionType.Power:
            case ExpressionType.RightShift:
            case ExpressionType.Subtract:
            case ExpressionType.SubtractChecked:
                return(BinaryNode.Create((BinaryExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.ArrayLength:
                return(new ArrayLengthNode((UnaryExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Negate:
            case ExpressionType.UnaryPlus:
            case ExpressionType.NegateChecked:
            case ExpressionType.Not:
                return(UnaryNode.Create((UnaryExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Quote:
                return(new QuoteNode((UnaryExpression)expression));

            case ExpressionType.Call:
                return(new CallNode((MethodCallExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Conditional:
                return(new ConditionalNode((ConditionalExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Constant:
                return(new ConstantNode((ConstantExpression)expression, constExpressions));

            case ExpressionType.Invoke:
                return(new InvocationNode((InvocationExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Lambda:
                return(new LambdaNode((LambdaExpression)expression, parameterExpressions));

            case ExpressionType.ListInit:
                return(new ListInitNode((ListInitExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.MemberAccess:
                return(new MemberAccessNode((MemberExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.MemberInit:
                return(new MemberInitNode((MemberInitExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.New:
                return(new NewNode((NewExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.NewArrayInit:
                return(new NewArrayInitNode((NewArrayExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.NewArrayBounds:
                return(new NewArrayBoundsNode((NewArrayExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.Parameter:
                return(new ParameterNode((ParameterExpression)expression, parameterExpressions));

            case ExpressionType.Convert:
            case ExpressionType.ConvertChecked:
                return(new ConvertNode((UnaryExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.TypeAs:
                return(new TypeAsNode((UnaryExpression)expression, constExpressions, parameterExpressions));

            case ExpressionType.TypeIs:
                return(new TypeIsNode((TypeBinaryExpression)expression, constExpressions, parameterExpressions));

            default:
                throw new InvalidOperationException(string.Format(Properties.Resources.EXCEPTION_COMPIL_UNKNOWNEXPRTYPE, expression.Type));
            }
        }