/// <summary>
        /// Makes an expression slim representing a NewExpression with the given children.
        /// </summary>
        /// <param name="node">Original expression.</param>
        /// <param name="arguments">Argument expression slims.</param>
        /// <returns>Slim representation of the original expression.</returns>
        protected override ExpressionSlim MakeNew(NewExpression node, ReadOnlyCollection <ExpressionSlim> arguments)
        {
            if (node.Constructor != null)
            {
                var constructor = MakeConstructor(node.Constructor);

                var richMembers = node.Members;
                var slimMembers = default(IList <MemberInfoSlim>);
                if (richMembers != null)
                {
                    var n = richMembers.Count;

                    slimMembers = new MemberInfoSlim[n];

                    for (var i = 0; i < n; i++)
                    {
                        slimMembers[i] = MakeMember(richMembers[i]);
                    }
                }

                return(_factory.New(constructor, arguments, slimMembers));
            }
            else
            {
                var type = MakeType(node.Type);
                return(_factory.New(type));
            }
        }
Пример #2
0
        public Json.Expression AddMember(MemberInfoSlim member)
        {
            if (member == null)
            {
                throw new ArgumentNullException(nameof(member));
            }

            if (!_members.TryGetValue(member, out int index))
            {
                var typeRef   = AddType(member.DeclaringType);
                var memberDef = member.MemberType switch
                {
                    MemberTypes.Method => AddMethod(typeRef, (MethodInfoSlim)member),
                    MemberTypes.Constructor => AddConstructor(typeRef, (ConstructorInfoSlim)member),
                    MemberTypes.Field => new FieldDef(typeRef, (FieldInfoSlim)member),
                    MemberTypes.Property => new PropertyDef(typeRef, (PropertyInfoSlim)member),
                    _ => throw new NotSupportedException("Invalid member type."),
                };
                index = _members.Count;
                _memberDefs.Add(memberDef);
                _members.Add(member, index);
            }

            return(index.ToJsonNumber());
        }
Пример #3
0
 public static string GetName(this MemberInfoSlim m)
 {
     return(m switch
     {
         SimpleMethodInfoSlimBase smtd => smtd.Name,
         GenericMethodInfoSlim gmtd => gmtd.GenericMethodDefinition.GetName(),
         PropertyInfoSlim prp => prp.Name,
         FieldInfoSlim fld => fld.Name,
         _ => "<unknown>",
     });
Пример #4
0
 internal static MemberExpressionSlim Make(ExpressionSlim expression, MemberInfoSlim member)
 {
     if (expression == null)
     {
         return(new MemberExpressionSlim(member));
     }
     else
     {
         return(new InstanceMemberExpressionSlim(expression, member));
     }
 }
Пример #5
0
        /// <summary>
        /// Visits the specified member.
        /// </summary>
        /// <param name="member">Member to visit.</param>
        /// <returns>Result of the visit.</returns>
        public MemberInfoSlim Visit(MemberInfoSlim member)
        {
            if (member == null)
            {
                throw new ArgumentNullException(nameof(member));
            }

            return(member.MemberType switch
            {
                MemberTypes.Constructor => VisitConstructor((ConstructorInfoSlim)member),
                MemberTypes.Field => VisitField((FieldInfoSlim)member),
                MemberTypes.Method => VisitMethod((MethodInfoSlim)member),
                MemberTypes.Property => VisitProperty((PropertyInfoSlim)member),
                _ => throw new NotSupportedException("Unknown type kind."),
            });
Пример #6
0
        private static void AssertAreSame(MemberInfo member, MemberInfoSlim slimMember)
        {
            switch (slimMember.MemberType)
            {
            case MemberTypes.Constructor:
                AssertAreSameConstructor((ConstructorInfo)member, (ConstructorInfoSlim)slimMember);
                return;

            case MemberTypes.Field:
                AssertAreSameField((FieldInfo)member, (FieldInfoSlim)slimMember);
                return;

            case MemberTypes.Method:
                AssertAreSameMethod((MethodInfo)member, (MethodInfoSlim)slimMember);
                return;

            case MemberTypes.Property:
                AssertAreSameProperty((PropertyInfo)member, (PropertyInfoSlim)slimMember);
                return;
            }

            Fail(member, slimMember);
        }
Пример #7
0
 private static void Fail(MemberInfo member, MemberInfoSlim slimMember)
 {
     Assert.Fail(string.Format(CultureInfo.InvariantCulture, "Expected '{0}', Actual: '{1}'", member, slimMember));
 }
 internal MemberMemberBindingSlim(MemberInfoSlim member, ReadOnlyCollection<MemberBindingSlim> bindings)
     : base(member)
 {
     Bindings = bindings;
 }
Пример #9
0
 internal MemberAssignmentSlim(MemberInfoSlim member, ExpressionSlim expression)
     : base(member)
 {
     Expression = expression;
 }
Пример #10
0
 protected override bool EqualsExtension(MemberInfoSlim x, MemberInfoSlim y) => true;
Пример #11
0
 protected override bool EqualsNestedType(MemberInfoSlim x, MemberInfoSlim y) => true;
Пример #12
0
 internal MemberListBindingSlim(MemberInfoSlim member, ReadOnlyCollection <ElementInitSlim> initializers)
     : base(member)
 {
     Initializers = initializers;
 }
Пример #13
0
 protected override bool EqualsTypeInfo(MemberInfoSlim x, MemberInfoSlim y) => true;
Пример #14
0
 internal MemberBindingSlim(MemberInfoSlim member)
 {
     Member = member;
 }
Пример #15
0
 private void Append(MemberInfoSlim member) => _sb.Append(member?.ToString());
Пример #16
0
 protected override bool EqualsEvent(MemberInfoSlim x, MemberInfoSlim y) => true;
Пример #17
0
 protected override int GetHashCodeCustom(MemberInfoSlim obj) => 42;
Пример #18
0
 protected override int GetHashCodeTypeInfo(MemberInfoSlim obj) => 42;
Пример #19
0
 protected override int GetHashCodeNestedType(MemberInfoSlim obj) => 42;
Пример #20
0
 protected override int GetHashCodeExtension(MemberInfoSlim obj) => 42;
Пример #21
0
 protected override int GetHashCodeEvent(MemberInfoSlim obj) => 42;
Пример #22
0
 internal InstanceMemberExpressionSlim(ExpressionSlim expression, MemberInfoSlim member)
     : base(member)
 {
     Expression = expression;
 }
Пример #23
0
 internal MemberExpressionSlim(MemberInfoSlim member)
 {
     Member = member;
 }
Пример #24
0
            // NB: Hashing of members is independent of any context. This assumption would change in case members
            //     could have references to generic parameters of defining types. However, we don't deal with open
            //     generic declaring types for members in the context of expression trees, so we can memoize just
            //     fine over here.

            public override int Visit(MemberInfoSlim member) => _visitCache.Delegate(member);
Пример #25
0
 protected override bool EqualsCustom(MemberInfoSlim x, MemberInfoSlim y) => true;