Пример #1
0
        public static MemberDef FromJson(DeserializationDomain domain, Json.Expression member)
        {
            if (member is not Json.ArrayExpression info)
            {
                throw new BonsaiParseException("Expected a JSON array for a member definition.", member);
            }

            if (info.ElementCount < 1)
            {
                throw new BonsaiParseException("Expected at least 1 JSON array element for a member definition.", member);
            }

            var type = info.GetElement(0);

            if (type.NodeType != Json.ExpressionType.String)
            {
                throw new BonsaiParseException("Expected a JSON string in 'node[0]' for the member type discriminator.", member);
            }

            var kind = (string)((Json.ConstantExpression)type).Value;

            return(kind switch
            {
                Discriminators.MemberInfo.Constructor => GetConstructorDef(domain, info),
                Discriminators.MemberInfo.Field => GetFieldDef(domain, info),
                Discriminators.MemberInfo.Property => GetPropertyDef(domain, info),
                Discriminators.MemberInfo.SimpleMethod => GetSimpleMethodDef(domain, info),
                Discriminators.MemberInfo.OpenGenericMethod => GetOpenGenericMethodDef(domain, info),
                Discriminators.MemberInfo.ClosedGenericMethod => GetClosedGenericMethodDef(info),
                _ => throw new BonsaiParseException(string.Format(CultureInfo.InvariantCulture, "Unexpected member type discriminator '{0}'.", kind), member),
            });
Пример #2
0
        public static TypeDef FromJson(DeserializationDomain domain, Json.Expression expression)
        {
            if (expression is not Json.ArrayExpression type)
            {
                throw new BonsaiParseException("Expected a JSON array containing a type definition.", expression);
            }

            if (type.ElementCount == 0)
            {
                throw new BonsaiParseException("Expected at least one JSON array element containing a type discriminator.", expression);
            }

            var kind = type.GetElement(0);

            if (kind.NodeType != Json.ExpressionType.String)
            {
                throw new BonsaiParseException("Expected a JSON string at 'node[0]' containing a type discriminator.", expression);
            }

            var typeDiscriminator = (string)((Json.ConstantExpression)kind).Value;

            return(typeDiscriminator switch
            {
                Discriminators.Type.Simple => SimpleTypeDef.FromJson(type),
                Discriminators.Type.Generic => GenericTypeDef.FromJson(type),
                Discriminators.Type.Array => ArrayTypeDef.FromJson(type),
                Discriminators.Type.Anonymous => AnonymousStructuralTypeDef.FromJson(type),
                Discriminators.Type.Record => RecordStructuralTypeDef.FromJson(domain, type),
                _ => throw new BonsaiParseException(string.Format(CultureInfo.InvariantCulture, "Unexpected type discriminator '{0}' at 'node[0]'.", typeDiscriminator), expression),
            });
Пример #3
0
        public override TypeSlim ToType(DeserializationDomain domain, TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                var def = domain.GetType(_genericTypeDefinition).ToType(domain, genericArguments);
                GenericDefinitionTypeSlim genDef;

                switch (def.Kind)
                {
                case TypeSlimKind.Simple:
                    var simple = (SimpleTypeSlim)def;
                    genDef = TypeSlim.GenericDefinition(simple.Assembly, simple.Name);
                    break;

                default:
                    throw new InvalidOperationException("Expected either simple type slim discriminator for generic definition type.");
                }

                var n        = _genericTypeArguments.Length;
                var argsList = new TypeSlim[n];

                for (var i = 0; i < n; i++)
                {
                    var arg     = _genericTypeArguments[i];
                    var argType = domain.GetType(arg).ToType(domain, genericArguments);
                    argsList[i] = argType;
                }

                var args = new TrueReadOnlyCollection <TypeSlim>(/* transfer ownership */ argsList);
                _type = TypeSlim.Generic(genDef, args);
            }

            return(_type);
        }
Пример #4
0
        public override TypeSlim ToType(DeserializationDomain domain, params TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                _type = TypeSlim.Simple(domain.GetAssembly(_assembly), _typeName);
            }

            return(_type);
        }
Пример #5
0
        public DeserializationState(Json.Expression state, Version version)
        {
            _domain      = new DeserializationDomain(state);
            _params      = new Stack <ParameterExpression[]>();
            _globals     = GetGlobals(state);
            _labelTagets = GetLabelTargets(state);

            Debug.Assert(_domain.SupportsVersion(version));
        }
Пример #6
0
        public override TypeSlim ToType(DeserializationDomain domain, TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                var elementType = domain.GetType(_elementType).ToType(domain, genericArguments);

                _type = _rank == null?TypeSlim.Array(elementType) : TypeSlim.Array(elementType, _rank.Value);
            }

            return(_type);
        }
Пример #7
0
        public override TypeSlim ToType(DeserializationDomain domain, params TypeSlim[] genericArguments)
        {
            if (_type == null)
            {
                var refType = StructuralTypeSlimReference.Create(hasValueEqualitySemantics: true, Kind, _members.Length);
                _type = refType;
                foreach (var member in _members)
                {
                    var newPropertyType = domain.GetType(member.Type).ToType(domain, genericArguments);
                    var newProperty     = _type.GetProperty(member.Name, newPropertyType, s_emptyTypeList, member.CanWrite);
                    refType.AddProperty(newProperty);
                }
                refType.Freeze();
            }

            return(_type);
        }
Пример #8
0
        public static RecordStructuralTypeDef FromJson(DeserializationDomain domain, Json.ArrayExpression type)
        {
            if (domain.IsV08)
            {
                throw new NotSupportedException("Record types are only supported in Bonsai v0.9 or later.");
            }

            var count = type.ElementCount;

            if (count is not 2 and not 3)
            {
                throw new BonsaiParseException("Expected 2 or 3 JSON array elements for a structural type definition.", type);
            }

            if (type.GetElement(1) is not Json.ArrayExpression membersJson)
            {
                throw new BonsaiParseException("Expected a JSON array in 'node[1]' for the structural type members.", type);
            }

            var membersCount = membersJson.ElementCount;

            var members = new RecordStructuralTypeMember[membersCount];

            for (var i = 0; i < membersCount; i++)
            {
                var memberJson = membersJson.GetElement(i);
                var member     = RecordStructuralTypeMember.FromJson(memberJson);
                members[i] = member;
            }

            var hasValueEqualitySemantics = true;

            if (count == 3)
            {
                var hasValueEqualitySemanticsExpr = type.GetElement(2);

                if (hasValueEqualitySemanticsExpr.NodeType != Json.ExpressionType.Boolean)
                {
                    throw new BonsaiParseException("Expected a JSON Boolean in 'node[2]' for the value equality semantics flag.", type);
                }

                hasValueEqualitySemantics = (bool)((Json.ConstantExpression)hasValueEqualitySemanticsExpr).Value;
            }

            return(new RecordStructuralTypeDef(hasValueEqualitySemantics, members));
        }
Пример #9
0
        public override MemberInfoSlim ToMember(DeserializationDomain domain)
        {
            // PERF: This is a heavy allocator; should we support caching the result?

            var def = ((GenericDefinitionMethodInfoSlim)domain.GetMember(_genericMethodDefinition));

            var count = _genericArguments.Length;

            var argsList = new TypeSlim[count];

            for (var i = 0; i < count; i++)
            {
                argsList[i] = domain.GetType(_genericArguments[i]).ToType(domain);
            }

            var args = new TrueReadOnlyCollection <TypeSlim>(/* transfer ownership */ argsList);

            return(def.DeclaringType.GetGenericMethod(def, args));
        }
Пример #10
0
 public abstract MemberInfoSlim ToMember(DeserializationDomain domain);
 public override TypeSlim ToType(DeserializationDomain domain, params TypeSlim[] genericArguments)
 {
     return(genericArguments[_index]);
 }
Пример #12
0
 public override MemberInfoSlim ToMember(DeserializationDomain domain) => Method;
Пример #13
0
 public override MemberInfoSlim ToMember(DeserializationDomain domain) => _constructor;
Пример #14
0
 public override MemberInfoSlim ToMember(DeserializationDomain domain) => _property;
Пример #15
0
 public abstract TypeSlim ToType(DeserializationDomain domain, params TypeSlim[] genericArguments);