/// <summary>
 /// Visits the children of the <see cref="ElementInit" />.
 /// </summary>
 /// <param name="node">The expression to visit.</param>
 /// <returns>The modified expression, if it or any subexpression was modified;
 /// otherwise, returns the original expression.</returns>
 protected virtual ElementInit VisitElementInit(ElementInit node)
 {
     return(node.Update(Visit(node.Arguments)));
 }
Exemple #2
0
 private static StringBuilder AppendElementInit(this StringBuilder builder, ElementInit initializer)
 {
     return(builder.AppendCommaSeparated("{ ", initializer.Arguments, AppendExpression, " }"));
 }
Exemple #3
0
        /// <summary>
        /// 访问 <see cref="ElementInit"/>。
        /// </summary>
        /// <param name="initializer"></param>
        /// <returns></returns>
        protected virtual ElementInit VisitElementInitializer(ElementInit initializer)
        {
            var arguments = VisitMemberAndExpressionList(initializer.Arguments);

            return(arguments != initializer.Arguments ? Expression.ElementInit(initializer.AddMethod, arguments) : initializer);
        }
Exemple #4
0
 protected override void VisitElementInitializer(ElementInit initializer)
 {
     CannotConvertToSoda(initializer);
 }
Exemple #5
0
        public void UpdateDifferentNumberArgumentsDifferetInstanceReturned()
        {
            ElementInit init = Expression.ElementInit(typeof(List <int>).GetMethod("Add"), Expression.Constant(0));

            Assert.NotSame(init, init.Update(Enumerable.Repeat(Expression.Constant(1), 1)));
        }
Exemple #6
0
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     return(GiveUp(node));
 }
Exemple #7
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ElementInitNode"/> class.
 /// </summary>
 /// <param name="factory">The factory.</param>
 /// <param name="elementInit">The element init.</param>
 public ElementInitNode(INodeFactory factory, ElementInit elementInit)
     : base(factory)
 {
     this.Initialize(elementInit);
 }
 /// <inheritdoc/>
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     mVisitedNodes.Enqueue(node);
     return(base.VisitElementInit(node));
 }
Exemple #9
0
        public virtual bool IsEvaluatableElementInit(ElementInit node)
        {
            ArgumentUtility.CheckNotNull("node", node);

            return(true);
        }
Exemple #10
0
 private bool CompareElementInit(ElementInit a, ElementInit b)
 {
     return(a.AddMethod == b.AddMethod &&
            CompareExpressionList(a.Arguments, b.Arguments));
 }
Exemple #11
0
        private Result RewriteListInitExpression(Expression expr, Stack stack)
        {
            var node = (ListInitExpression)expr;

            // Constructor runs on initial stack.
            Result        newResult    = RewriteExpression(node.NewExpression, stack);
            Expression    rewrittenNew = newResult.Node;
            RewriteAction action       = newResult.Action;

            ReadOnlyCollection <ElementInit> inits = node.Initializers;
            int count = inits.Count;

            ChildRewriter[] cloneCrs = new ChildRewriter[count];

            for (int i = 0; i < count; i++)
            {
                ElementInit init = inits[i];

                // Initializers all run on non-empty stack (the list instance is on it).
                var cr = new ChildRewriter(this, Stack.NonEmpty, init.Arguments.Count);
                cr.Add(init.Arguments);

                action     |= cr.Action;
                cloneCrs[i] = cr;
            }

            switch (action)
            {
            case RewriteAction.None:
                break;

            case RewriteAction.Copy:
                ElementInit[] newInits = new ElementInit[count];
                for (int i = 0; i < count; i++)
                {
                    ChildRewriter cr = cloneCrs[i];
                    if (cr.Action == RewriteAction.None)
                    {
                        newInits[i] = inits[i];
                    }
                    else
                    {
                        newInits[i] = new ElementInit(inits[i].AddMethod, new TrueReadOnlyCollection <Expression>(cr[0, -1]));
                    }
                }
                expr = new ListInitExpression((NewExpression)rewrittenNew, new TrueReadOnlyCollection <ElementInit>(newInits));
                break;

            case RewriteAction.SpillStack:
                bool isRefNew = IsRefInstance(node.NewExpression);

                var comma = new ArrayBuilder <Expression>(count + 2 + (isRefNew ? 1 : 0));

                ParameterExpression tempNew = MakeTemp(rewrittenNew.Type);
                comma.UncheckedAdd(new AssignBinaryExpression(tempNew, rewrittenNew));

                ParameterExpression refTempNew = tempNew;
                if (isRefNew)
                {
                    refTempNew = MakeTemp(tempNew.Type.MakeByRefType());
                    comma.UncheckedAdd(new ByRefAssignBinaryExpression(refTempNew, tempNew));
                }

                for (int i = 0; i < count; i++)
                {
                    ChildRewriter cr  = cloneCrs[i];
                    Result        add = cr.Finish(new InstanceMethodCallExpressionN(inits[i].AddMethod, refTempNew, cr[0, -1]));
                    comma.UncheckedAdd(add.Node);
                }

                comma.UncheckedAdd(tempNew);

                expr = MakeBlock(comma);
                break;

            default:
                throw ContractUtils.Unreachable;
            }

            return(new Result(action, expr));
        }
Exemple #12
0
 /// <inheritdoc/>
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     Hash(node.AddMethod);
     return(base.VisitElementInit(node));
 }
Exemple #13
0
 /// <summary>
 /// Visits an ElementInit node.
 /// </summary>
 /// <param name="node">The ElementInit node.</param>
 /// <returns>The ElementInit node.</returns>
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     throw new NotImplementedException();
 }
 protected virtual ElementInit VisitElementInitializer(ElementInit initializer)
 {
     ReadOnlyCollection<Expression> arguments = this.VisitExpressionList(initializer.Arguments);
     if (arguments != initializer.Arguments)
     {
         return Expression.ElementInit(initializer.AddMethod, arguments);
     }
     return initializer;
 }
 /// <summary>
 ///     This is an internal API that supports the Entity Framework Core infrastructure and not subject to
 ///     the same compatibility standards as public APIs. It may be changed or removed without notice in
 ///     any release. You should only use it directly in your code with extreme caution and knowing that
 ///     doing so can result in application failures when updating to a new Entity Framework Core release.
 /// </summary>
 protected override ElementInit VisitElementInit(ElementInit elementInit)
 => elementInit.Update(elementInit.Arguments.Select(e => MatchTypes(Visit(e), e.Type)));
 internal override MemberBinding AsBinding()
 {
     switch (_action)
     {
         case RewriteAction.None:
             return _binding;
         case RewriteAction.Copy:
             ElementInit[] newInits = new ElementInit[_inits.Count];
             for (int i = 0; i < _inits.Count; i++)
             {
                 ChildRewriter cr = _childRewriters[i];
                 if (cr.Action == RewriteAction.None)
                 {
                     newInits[i] = _inits[i];
                 }
                 else
                 {
                     newInits[i] = Expression.ElementInit(_inits[i].AddMethod, cr[0, -1]);
                 }
             }
             return Expression.ListBind(_binding.Member, new TrueReadOnlyCollection<ElementInit>(newInits));
     }
     throw ContractUtils.Unreachable;
 }
        /// <summary>
        /// ElementInit visit method
        /// </summary>
        /// <param name="initializer">The ElementInit expression to visit</param>
        /// <returns>The visited ElementInit expression </returns>
        internal virtual ElementInit VisitElementInitializer(ElementInit initializer)
        {
            ReadOnlyCollection <Expression> arguments = this.VisitExpressionList(initializer.Arguments);

            return(arguments != initializer.Arguments ? Expression.ElementInit(initializer.AddMethod, arguments) : initializer);
        }
 /// <summary>
 /// Visits an ElementInit node.
 /// </summary>
 /// <param name="node">The ElementInit node.</param>
 /// <returns>The ElementInit node.</returns>
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     _sb.Append("<ElementInit>");
     return(node);
 }
 private bool CompareElementInit(ElementInit a, ElementInit b)
 => Equals(a.AddMethod, b.AddMethod) &&
 CompareExpressionList(a.Arguments, b.Arguments);
Exemple #20
0
        public void CanRetrieveMethod()
        {
            ElementInit init = Expression.ElementInit(typeof(List <int>).GetMethod("Add"), Expression.Constant(0));

            Assert.Equal(typeof(List <int>).GetMethod("Add"), init.AddMethod);
        }
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     return(base.VisitElementInit(node));
 }
Exemple #22
0
 /// <summary>
 /// Converts a <see cref="ElementInit"/> to a
 /// <see cref="SerializableElementInit"/>.
 /// </summary>
 /// <param name="elementInit"><see cref="ElementInit"/> to convert.</param>
 /// <returns>Returns the converted <see cref="SerializableElementInit"/>.</returns>
 /// <seealso cref="ExpressionVisitor.VisitElementInit"/>
 protected override object VisitElementInit(ElementInit elementInit)
 {
     return(new SerializableElementInit(elementInit, this));
 }
Exemple #23
0
 public static int ArgumentCount(this ElementInit expression)
 {
     return(expression.Arguments.Count());
 }
Exemple #24
0
 private static void CannotConvertToSoda(ElementInit init)
 {
     throw new LinqQueryException(init.ToString());
 }
Exemple #25
0
 public static Expression GetArgument(this ElementInit expression, int index)
 {
     return(expression.Arguments[index]);
 }
Exemple #26
0
        object GenerateXmlFromElementInitList(string propName, IEnumerable <ElementInit> initializers)
        {
            if (initializers == null)
            {
                initializers = new ElementInit[] { }
            }
            ;
            return(new XElement(propName,
                                from elementInit in initializers
                                select GenerateXmlFromElementInitializer(elementInit)));
        }

        object GenerateXmlFromElementInitializer(ElementInit elementInit)
        {
            return(new XElement("ElementInit",
                                GenerateXmlFromMethodInfo("AddMethod", elementInit.AddMethod),
                                GenerateXmlFromExpressionList("Arguments", elementInit.Arguments)));
        }

        object GenerateXmlFromExpressionList(string propName, IEnumerable <Expression> expressions)
        {
            return(new XElement(propName,
                                from expression in expressions
                                select GenerateXmlFromExpressionCore(expression)));
        }

        object GenerateXmlFromMemberInfoList(string propName, IEnumerable <MemberInfo> members)
        {
            if (members == null)
            {
                members = new MemberInfo[] { }
            }
            ;
            return(new XElement(propName,
                                from member in members
                                select GenerateXmlFromProperty(member.GetType(), "Info", member)));
        }

        object GenerateXmlFromBindingList(string propName, IEnumerable <MemberBinding> bindings)
        {
            if (bindings == null)
            {
                bindings = new MemberBinding[] { }
            }
            ;
            return(new XElement(propName,
                                from binding in bindings
                                select GenerateXmlFromBinding(binding)));
        }

        object GenerateXmlFromBinding(MemberBinding binding)
        {
            switch (binding.BindingType)
            {
            case MemberBindingType.Assignment:
                return(GenerateXmlFromAssignment(binding as MemberAssignment));

            case MemberBindingType.ListBinding:
                return(GenerateXmlFromListBinding(binding as MemberListBinding));

            case MemberBindingType.MemberBinding:
                return(GenerateXmlFromMemberBinding(binding as MemberMemberBinding));

            default:
                throw new NotSupportedException(string.Format("Binding type {0} not supported.", binding.BindingType));
            }
        }

        object GenerateXmlFromMemberBinding(MemberMemberBinding memberMemberBinding)
        {
            return(new XElement("MemberMemberBinding",
                                GenerateXmlFromProperty(memberMemberBinding.Member.GetType(), "Member", memberMemberBinding.Member),
                                GenerateXmlFromBindingList("Bindings", memberMemberBinding.Bindings)));
        }

        object GenerateXmlFromListBinding(MemberListBinding memberListBinding)
        {
            return(new XElement("MemberListBinding",
                                GenerateXmlFromProperty(memberListBinding.Member.GetType(), "Member", memberListBinding.Member),
                                GenerateXmlFromProperty(memberListBinding.Initializers.GetType(), "Initializers", memberListBinding.Initializers)));
        }

        object GenerateXmlFromAssignment(MemberAssignment memberAssignment)
        {
            return(new XElement("MemberAssignment",
                                GenerateXmlFromProperty(memberAssignment.Member.GetType(), "Member", memberAssignment.Member),
                                GenerateXmlFromProperty(memberAssignment.Expression.GetType(), "Expression", memberAssignment.Expression)));
        }

        XElement GenerateXmlFromExpression(string propName, Expression e)
        {
            return(new XElement(propName, GenerateXmlFromExpressionCore(e)));
        }

        object GenerateXmlFromType(string propName, Type type)
        {
            return(new XElement(propName, GenerateXmlFromTypeCore(type)));
        }

        XElement GenerateXmlFromTypeCore(Type type)
        {
            // vsadov: add detection of VB anon types
            if (type.Name.StartsWith("<>f__") || type.Name.StartsWith("VB$AnonymousType"))
            {
                return(new XElement("AnonymousType",
                                    new XAttribute("Name", type.FullName),
                                    from property in type.GetProperties()
                                    select new XElement("Property",
                                                        new XAttribute("Name", property.Name),
                                                        GenerateXmlFromTypeCore(property.PropertyType)),
                                    new XElement("Constructor",
                                                 from parameter in type.GetConstructors().First().GetParameters()
                                                 select new XElement("Parameter",
                                                                     new XAttribute("Name", parameter.Name),
                                                                     GenerateXmlFromTypeCore(parameter.ParameterType))
                                                 )));
            }
            else
            {
                // vsadov: GetGenericArguments returns args for nongeneric types
                // like arrays no need to save them.
                if (type.IsGenericType)
                {
                    return(new XElement("Type",
                                        new XAttribute("Name", type.GetGenericTypeDefinition().FullName),
                                        from genArgType in type.GetGenericArguments()
                                        select GenerateXmlFromTypeCore(genArgType)));
                }
                else
                {
                    return(new XElement("Type", new XAttribute("Name", type.FullName)));
                }
            }
        }

        object GenerateXmlFromPrimitive(string propName, object value)
        {
            return(new XAttribute(propName, value ?? string.Empty));
        }

        object GenerateXmlFromMethodInfo(string propName, MethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                return(new XElement(propName));
            }
            return(new XElement(propName,
                                new XAttribute("MemberType", methodInfo.MemberType),
                                new XAttribute("MethodName", methodInfo.Name),
                                GenerateXmlFromType("DeclaringType", methodInfo.DeclaringType),
                                new XElement("Parameters",
                                             from param in methodInfo.GetParameters()
                                             select GenerateXmlFromType("Type", param.ParameterType)),
                                new XElement("GenericArgTypes",
                                             from argType in methodInfo.GetGenericArguments()
                                             select GenerateXmlFromType("Type", argType))));
        }

        object GenerateXmlFromPropertyInfo(string propName, PropertyInfo propertyInfo)
        {
            if (propertyInfo == null)
            {
                return(new XElement(propName));
            }
            return(new XElement(propName,
                                new XAttribute("MemberType", propertyInfo.MemberType),
                                new XAttribute("PropertyName", propertyInfo.Name),
                                GenerateXmlFromType("DeclaringType", propertyInfo.DeclaringType),
                                new XElement("IndexParameters",
                                             from param in propertyInfo.GetIndexParameters()
                                             select GenerateXmlFromType("Type", param.ParameterType))));
        }

        object GenerateXmlFromFieldInfo(string propName, FieldInfo fieldInfo)
        {
            if (fieldInfo == null)
            {
                return(new XElement(propName));
            }
            return(new XElement(propName,
                                new XAttribute("MemberType", fieldInfo.MemberType),
                                new XAttribute("FieldName", fieldInfo.Name),
                                GenerateXmlFromType("DeclaringType", fieldInfo.DeclaringType)));
        }

        object GenerateXmlFromConstructorInfo(string propName, ConstructorInfo constructorInfo)
        {
            if (constructorInfo == null)
            {
                return(new XElement(propName));
            }
            return(new XElement(propName,
                                new XAttribute("MemberType", constructorInfo.MemberType),
                                new XAttribute("MethodName", constructorInfo.Name),
                                GenerateXmlFromType("DeclaringType", constructorInfo.DeclaringType),
                                new XElement("Parameters",
                                             from param in constructorInfo.GetParameters()
                                             select new XElement("Parameter",
                                                                 new XAttribute("Name", param.Name),
                                                                 GenerateXmlFromType("Type", param.ParameterType)))));
        }

        /*
         * DESERIALIZATION
         */
        Expression ParseExpressionFromXml(XElement xml)
        {
            if (xml.IsEmpty)
            {
                return(null);
            }

            return(ParseExpressionFromXmlNonNull(xml.Elements().First()));
        }

        Expression ParseExpressionFromXmlNonNull(XElement xml)
        {
            var expression = ApplyCustomDeserializers(xml);

            if (expression != null)
            {
                return(expression);
            }
            switch (xml.Name.LocalName)
            {
            case "BinaryExpression":
            case "SimpleBinaryExpression":
            case "LogicalBinaryExpression":
            case "MethodBinaryExpression":
                return(ParseBinaryExpresssionFromXml(xml));

            case "ConstantExpression":
            case "TypedConstantExpression":
                return(ParseConstatExpressionFromXml(xml));

            case "ParameterExpression":
            case "PrimitiveParameterExpression_x0060_1":
            case "PrimitiveParameterExpressionx00601":
            case "TypedParameterExpression":
                return(ParseParameterExpressionFromXml(xml));

            case "LambdaExpression":
                return(ParseLambdaExpressionFromXml(xml));

            case "MethodCallExpression":
            case "MethodCallExpressionN":
            case "InstanceMethodCallExpressionN":
                return(ParseMethodCallExpressionFromXml(xml));

            case "UnaryExpression":
                return(ParseUnaryExpressionFromXml(xml));

            case "MemberExpression":
            case "PropertyExpression":
            case "FieldExpression":
                return(ParseMemberExpressionFromXml(xml));

            case "NewExpression":
                return(ParseNewExpressionFromXml(xml));

            case "ListInitExpression":
                return(ParseListInitExpressionFromXml(xml));

            case "MemberInitExpression":
                return(ParseMemberInitExpressionFromXml(xml));

            case "ConditionalExpression":
            case "FullConditionalExpression":
                return(ParseConditionalExpressionFromXml(xml));

            case "NewArrayExpression":
            case "NewArrayInitExpression":
            case "NewArrayBoundsExpression":
                return(ParseNewArrayExpressionFromXml(xml));

            case "TypeBinaryExpression":
                return(ParseTypeBinaryExpressionFromXml(xml));

            case "InvocationExpression":
                return(ParseInvocationExpressionFromXml(xml));

            default:
                throw new NotSupportedException(xml.Name.LocalName);
            }
        }

        Expression ApplyCustomDeserializers(XElement xml)
        {
            foreach (var converter in Converters)
            {
                var result = converter.Deserialize(xml);
                if (result != null)
                {
                    return(result);
                }
            }

            return(null);
        }

        Expression ParseInvocationExpressionFromXml(XElement xml)
        {
            var expression = ParseExpressionFromXml(xml.Element("Expression"));
            var arguments  = ParseExpressionListFromXml <Expression>(xml, "Arguments");

            return(Expression.Invoke(expression, arguments));
        }

        Expression ParseTypeBinaryExpressionFromXml(XElement xml)
        {
            var expression  = ParseExpressionFromXml(xml.Element("Expression"));
            var typeOperand = ParseTypeFromXml(xml.Element("TypeOperand"));

            return(Expression.TypeIs(expression, typeOperand));
        }

        Expression ParseNewArrayExpressionFromXml(XElement xml)
        {
            var type = ParseTypeFromXml(xml.Element("Type"));

            if (!type.IsArray)
            {
                throw new Exception("Expected array type");
            }
            var elemType    = type.GetElementType();
            var expressions = ParseExpressionListFromXml <Expression>(xml, "Expressions");

            switch (xml.Attribute("NodeType").Value)
            {
            case "NewArrayInit":
                return(Expression.NewArrayInit(elemType, expressions));

            case "NewArrayBounds":
                return(Expression.NewArrayBounds(elemType, expressions));

            default:
                throw new Exception("Expected NewArrayInit or NewArrayBounds");
            }
        }

        Expression ParseConditionalExpressionFromXml(XElement xml)
        {
            var test    = ParseExpressionFromXml(xml.Element("Test"));
            var ifTrue  = ParseExpressionFromXml(xml.Element("IfTrue"));
            var ifFalse = ParseExpressionFromXml(xml.Element("IfFalse"));

            return(Expression.Condition(test, ifTrue, ifFalse));
        }

        Expression ParseMemberInitExpressionFromXml(XElement xml)
        {
            var newExpression = ParseNewExpressionFromXml(xml.Element("NewExpression").Element("NewExpression")) as NewExpression;
            var bindings      = ParseBindingListFromXml(xml, "Bindings").ToArray();

            return(Expression.MemberInit(newExpression, bindings));
        }

        Expression ParseListInitExpressionFromXml(XElement xml)
        {
            var newExpression = ParseExpressionFromXml(xml.Element("NewExpression")) as NewExpression;

            if (newExpression == null)
            {
                throw new Exception("Expceted a NewExpression");
            }
            var initializers = ParseElementInitListFromXml(xml, "Initializers").ToArray();

            return(Expression.ListInit(newExpression, initializers));
        }

        Expression ParseNewExpressionFromXml(XElement xml)
        {
            var constructor = ParseConstructorInfoFromXml(xml.Element("Constructor"));
            var arguments   = ParseExpressionListFromXml <Expression>(xml, "Arguments").ToArray();
            var members     = ParseMemberInfoListFromXml <MemberInfo>(xml, "Members").ToArray();

            if (members.Length == 0)
            {
                return(Expression.New(constructor, arguments));
            }
            return(Expression.New(constructor, arguments, members));
        }

        Expression ParseMemberExpressionFromXml(XElement xml)
        {
            var expression = ParseExpressionFromXml(xml.Element("Expression"));
            var member     = ParseMemberInfoFromXml(xml.Element("Member"));

            return(Expression.MakeMemberAccess(expression, member));
        }

        MemberInfo ParseMemberInfoFromXml(XElement xml)
        {
            var memberType = (MemberTypes)ParseConstantFromAttribute <MemberTypes>(xml, "MemberType");

            switch (memberType)
            {
            case MemberTypes.Field:
                return(ParseFieldInfoFromXml(xml));

            case MemberTypes.Property:
                return(ParsePropertyInfoFromXml(xml));

            case MemberTypes.Method:
                return(ParseMethodInfoFromXml(xml));

            case MemberTypes.Constructor:
                return(ParseConstructorInfoFromXml(xml));

            case MemberTypes.Custom:
            case MemberTypes.Event:
            case MemberTypes.NestedType:
            case MemberTypes.TypeInfo:
            default:
                throw new NotSupportedException(string.Format("MEmberType {0} not supported", memberType));
            }
        }

        MemberInfo ParseFieldInfoFromXml(XElement xml)
        {
            string fieldName     = (string)ParseConstantFromAttribute <string>(xml, "FieldName");
            var    declaringType = ParseTypeFromXml(xml.Element("DeclaringType"));

            return(declaringType.GetField(fieldName));
        }

        MemberInfo ParsePropertyInfoFromXml(XElement xml)
        {
            string propertyName  = (string)ParseConstantFromAttribute <string>(xml, "PropertyName");
            var    declaringType = ParseTypeFromXml(xml.Element("DeclaringType"));
            var    ps            = from paramXml in xml.Element("IndexParameters").Elements()
                                   select ParseTypeFromXml(paramXml);

            // return declaringType.GetProperty(propertyName, typeof(Type), ps.ToArray());
            return(declaringType.GetProperty(propertyName, ps.ToArray()));
        }

        Expression ParseUnaryExpressionFromXml(XElement xml)
        {
            var  operand        = ParseExpressionFromXml(xml.Element("Operand"));
            var  method         = ParseMethodInfoFromXml(xml.Element("Method"));
            bool isLifted       = (bool)ParseConstantFromAttribute <bool>(xml, "IsLifted");
            bool isLiftedToNull = (bool)ParseConstantFromAttribute <bool>(xml, "IsLiftedToNull");
            var  expressionType = (ExpressionType)ParseConstantFromAttribute <ExpressionType>(xml, "NodeType");
            var  type           = ParseTypeFromXml(xml.Element("Type"));

            // TODO: Why can't we use IsLifted and IsLiftedToNull here?
            // May need to special case a nodeType if it needs them.
            return(Expression.MakeUnary(expressionType, operand, type, method));
        }

        Expression ParseMethodCallExpressionFromXml(XElement xml)
        {
            var instance  = ParseExpressionFromXml(xml.Element("Object"));
            var method    = ParseMethodInfoFromXml(xml.Element("Method"));
            var arguments = ParseExpressionListFromXml <Expression>(xml, "Arguments").ToArray();

            return(Expression.Call(instance, method, arguments));
        }

        Expression ParseLambdaExpressionFromXml(XElement xml)
        {
            var body       = ParseExpressionFromXml(xml.Element("Body"));
            var parameters = ParseExpressionListFromXml <ParameterExpression>(xml, "Parameters");
            var type       = ParseTypeFromXml(xml.Element("Type"));

            // We may need to
            // var lambdaExpressionReturnType = type.GetMethod("Invoke").ReturnType;
            // if (lambdaExpressionReturnType.IsArray)
            // {

            // type = typeof(IEnumerable<>).MakeGenericType(type.GetElementType());
            // }
            return(Expression.Lambda(type, body, parameters));
        }

        IEnumerable <T> ParseExpressionListFromXml <T>(XElement xml, string elemName) where T : Expression
        {
            return(from tXml in xml.Element(elemName).Elements()
                   select(T) ParseExpressionFromXmlNonNull(tXml));
        }

        IEnumerable <T> ParseMemberInfoListFromXml <T>(XElement xml, string elemName) where T : MemberInfo
        {
            return(from tXml in xml.Element(elemName).Elements()
                   select(T) ParseMemberInfoFromXml(tXml));
        }

        IEnumerable <ElementInit> ParseElementInitListFromXml(XElement xml, string elemName)
        {
            return(from tXml in xml.Element(elemName).Elements()
                   select ParseElementInitFromXml(tXml));
        }

        ElementInit ParseElementInitFromXml(XElement xml)
        {
            var addMethod = ParseMethodInfoFromXml(xml.Element("AddMethod"));
            var arguments = ParseExpressionListFromXml <Expression>(xml, "Arguments");

            return(Expression.ElementInit(addMethod, arguments));
        }

        IEnumerable <MemberBinding> ParseBindingListFromXml(XElement xml, string elemName)
        {
            return(from tXml in xml.Element(elemName).Elements()
                   select ParseBindingFromXml(tXml));
        }

        MemberBinding ParseBindingFromXml(XElement tXml)
        {
            var member = ParseMemberInfoFromXml(tXml.Element("Member"));

            switch (tXml.Name.LocalName)
            {
            case "MemberAssignment":
                var expression = ParseExpressionFromXml(tXml.Element("Expression"));
                return(Expression.Bind(member, expression));

            case "MemberMemberBinding":
                var bindings = ParseBindingListFromXml(tXml, "Bindings");
                return(Expression.MemberBind(member, bindings));

            case "MemberListBinding":
                var initializers = ParseElementInitListFromXml(tXml, "Initializers");
                return(Expression.ListBind(member, initializers));
            }

            throw new NotImplementedException();
        }

        Expression ParseParameterExpressionFromXml(XElement xml)
        {
            var    type = ParseTypeFromXml(xml.Element("Type"));
            string name = (string)ParseConstantFromAttribute <string>(xml, "Name");

            // vs: hack
            string id = name + type.FullName;

            if (!this.parameters.ContainsKey(id))
            {
                this.parameters.Add(id, Expression.Parameter(type, name));
            }
            return(this.parameters[id]);
        }

        Expression ParseConstatExpressionFromXml(XElement xml)
        {
            var type = ParseTypeFromXml(xml.Element("Type"));

            return(Expression.Constant(ParseConstantFromElement(xml, "Value", type), type));
        }

        Type ParseTypeFromXml(XElement xml)
        {
            Debug.Assert(xml.Elements().Count() == 1);
            return(ParseTypeFromXmlCore(xml.Elements().First()));
        }

        Type ParseTypeFromXmlCore(XElement xml)
        {
            switch (xml.Name.ToString())
            {
            case "Type":
                return(ParseNormalTypeFromXmlCore(xml));

            case "AnonymousType":
                return(ParseAnonymousTypeFromXmlCore(xml));

            default:
                throw new ArgumentException("Expected 'Type' or 'AnonymousType'");
            }
        }

        Type ParseNormalTypeFromXmlCore(XElement xml)
        {
            if (!xml.HasElements)
            {
                return(this.resolver.GetType(xml.Attribute("Name").Value));
            }

            var genericArgumentTypes = from genArgXml in xml.Elements()
                                       select ParseTypeFromXmlCore(genArgXml);

            return(this.resolver.GetType(xml.Attribute("Name").Value, genericArgumentTypes));
        }

        Type ParseAnonymousTypeFromXmlCore(XElement xElement)
        {
            string name       = xElement.Attribute("Name").Value;
            var    properties = from propXml in xElement.Elements("Property")
                                select new ExpressionSerializationTypeResolver.NameTypePair
            {
                Name = propXml.Attribute("Name").Value,
                Type = ParseTypeFromXml(propXml)
            };
            var ctr_params = from propXml in xElement.Elements("Constructor").Elements("Parameter")
                             select new ExpressionSerializationTypeResolver.NameTypePair
            {
                Name = propXml.Attribute("Name").Value,
                Type = ParseTypeFromXml(propXml)
            };

            return(this.resolver.GetOrCreateAnonymousTypeFor(name, properties.ToArray(), ctr_params.ToArray()));
        }

        Expression ParseBinaryExpresssionFromXml(XElement xml)
        {
            var expressionType = (ExpressionType)ParseConstantFromAttribute <ExpressionType>(xml, "NodeType");

            var  left           = ParseExpressionFromXml(xml.Element("Left"));
            var  right          = ParseExpressionFromXml(xml.Element("Right"));
            bool isLifted       = (bool)ParseConstantFromAttribute <bool>(xml, "IsLifted");
            bool isLiftedToNull = (bool)ParseConstantFromAttribute <bool>(xml, "IsLiftedToNull");
            var  type           = ParseTypeFromXml(xml.Element("Type"));
            var  method         = ParseMethodInfoFromXml(xml.Element("Method"));
            var  conversion     = ParseExpressionFromXml(xml.Element("Conversion")) as LambdaExpression;

            if (expressionType == ExpressionType.Coalesce)
            {
                return(Expression.Coalesce(left, right, conversion));
            }
            return(Expression.MakeBinary(expressionType, left, right, isLiftedToNull, method));
        }

        MethodInfo ParseMethodInfoFromXml(XElement xml)
        {
            if (xml.IsEmpty)
            {
                return(null);
            }
            string name          = (string)ParseConstantFromAttribute <string>(xml, "MethodName");
            var    declaringType = ParseTypeFromXml(xml.Element("DeclaringType"));
            var    ps            = from paramXml in xml.Element("Parameters").Elements()
                                   select ParseTypeFromXml(paramXml);

            var genArgs = from argXml in xml.Element("GenericArgTypes").Elements()
                          select ParseTypeFromXml(argXml);

            return(this.resolver.GetMethod(declaringType, name, ps.ToArray(), genArgs.ToArray()));
        }

        ConstructorInfo ParseConstructorInfoFromXml(XElement xml)
        {
            if (xml.IsEmpty)
            {
                return(null);
            }
            var declaringType = ParseTypeFromXml(xml.Element("DeclaringType"));
            var ps            = from paramXml in xml.Element("Parameters").Elements()
                                select ParseParameterFromXml(paramXml);

            var ci = declaringType.GetConstructor(ps.ToArray());

            return(ci);
        }

        Type ParseParameterFromXml(XElement xml)
        {
            string name = (string)ParseConstantFromAttribute <string>(xml, "Name");
            var    type = ParseTypeFromXml(xml.Element("Type"));

            return(type);
        }

        object ParseConstantFromAttribute <T>(XElement xml, string attrName)
        {
            string objectStringValue = xml.Attribute(attrName).Value;

            if (typeof(Type).IsAssignableFrom(typeof(T)))
            {
                throw new Exception("We should never be encoding Types in attributes now.");
            }
            if (typeof(Enum).IsAssignableFrom(typeof(T)))
            {
                return(Enum.Parse(typeof(T), objectStringValue, true));
            }
            return(Convert.ChangeType(objectStringValue, typeof(T), CultureInfo.CurrentCulture));
        }

        object ParseConstantFromElement(XElement xml, string elemName, Type type)
        {
            string objectStringValue = xml.Element(elemName).Value;

            if (typeof(Type).IsAssignableFrom(type))
            {
                return(ParseTypeFromXml(xml.Element("Value")));
            }
            if (typeof(Enum).IsAssignableFrom(type))
            {
                return(Enum.Parse(type, objectStringValue, true));
            }
            return(Convert.ChangeType(objectStringValue, type, CultureInfo.CurrentCulture));
        }

        ////ncrunch: no coverage end
    }
}
Exemple #27
0
 /// <summary>
 /// Visits the children of <see cref="System.Linq.Expressions.ElementInit"/>.
 /// </summary>
 /// <param name="node">The expression to visit.</param>
 /// <returns>The modified expression, if it or any subexpression was modified; otherwise,
 /// returns the original expression.</returns>
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     throw new NotSupportedException(string.Format(Resources.EX_PROCESS_NODE_NOT_SUPPORT, node.GetType().Name));
 }
Exemple #28
0
        private ElementInit TransformElementInit(ElementInit p)
        {
            var args = Transform(p.Arguments);

            return(args != p.Arguments ? Expression.ElementInit(p.AddMethod, args) : p);
        }
Exemple #29
0
 protected override ElementInit VisitElementInit(ElementInit elementInit)
 {
     return(base.VisitElementInit(elementInit));
 }
 protected override ElementInit VisitElementInitializer(ElementInit initializer)
 {
     Accumulate(initializer.AddMethod);
     return base.VisitElementInitializer(initializer);
 }
        protected override ElementInit VisitElementInit(ElementInit node)
        {
            var arguments = Visit(node.Arguments, arg => context.Rewrite(arg, Visit));

            return(node.Update(arguments));
        }
 protected virtual bool CompareElementInit(ElementInit a, ElementInit b)
 {
     return a.AddMethod == b.AddMethod
         && this.CompareExpressionList(a.Arguments, b.Arguments);
 }
 protected virtual bool CompareElementInit(ElementInit a, ElementInit b)
 {
     return(a.AddMethod == b.AddMethod &&
            this.CompareExpressionList(a.Arguments, b.Arguments));
 }
        /// <summary>
        /// Creates a <see cref="ListInitExpression"/> that uses a specified method to add elements to a collection. 
        /// </summary>
        /// <param name="newExpression">A <see cref="NewExpression"/> to set the <see cref="P:ListInitExpression.NewExpression"/> property equal to.</param>
        /// <param name="addMethod">A <see cref="MethodInfo"/> that represents an instance method named "Add" (case insensitive), that adds an element to a collection. </param>
        /// <param name="initializers">An <see cref="IEnumerable{T}"/> that contains <see cref="Expression"/> objects to use to populate the Initializers collection.</param>
        /// <returns>A <see cref="ListInitExpression"/> that has the <see cref="P:ListInitExpression.NodeType"/> property equal to ListInit and the <see cref="P:ListInitExpression.NewExpression"/> property set to the specified value.</returns>
        public static ListInitExpression ListInit(NewExpression newExpression, MethodInfo addMethod, IEnumerable<Expression> initializers) {
            if (addMethod == null) {
                return ListInit(newExpression, initializers);
            }
            ContractUtils.RequiresNotNull(newExpression, "newExpression");
            ContractUtils.RequiresNotNull(initializers, "initializers");

            var initializerlist = initializers.ToReadOnly();
            if (initializerlist.Count == 0) {
                throw Error.ListInitializerWithZeroMembers();
            }
            ElementInit[] initList = new ElementInit[initializerlist.Count];
            for (int i = 0; i < initializerlist.Count; i++) {
                initList[i] = ElementInit(addMethod, initializerlist[i]);
            }
            return ListInit(newExpression, new TrueReadOnlyCollection<ElementInit>(initList));
        }
Exemple #35
0
 protected override ElementInit VisitElementInit(ElementInit node)
 {
     Console.WriteLine($"call {MethodBase.GetCurrentMethod().Name} : {node}");
     return(base.VisitElementInit(node));
 }