示例#1
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));
        }
示例#2
0
        private TypeDef AddTypeRecordStructural(StructuralTypeSlim type, ReadOnlyCollection <TypeSlim> genericArguments)
        {
            var properties = type.Properties;
            var count      = properties.Count;

            var members = new RecordStructuralTypeMember[count];

            for (var i = 0; i < count; i++)
            {
                var property = properties[i];
                var member   = new RecordStructuralTypeMember {
                    Name = property.Name, Type = AddType(property.PropertyType, genericArguments)
                };
                members[i] = member;
            }

            return(new RecordStructuralTypeDef(type.HasValueEqualitySemantics, members));
        }