Example #1
0
        public static void ToSerializeCall(this CodeWriter writer, XmlElementSerialization serialization, CodeWriterDelegate name, CodeWriterDelegate?writerName = null, CodeWriterDelegate?nameHint = null)
        {
            writerName ??= w => w.AppendRaw("writer");

            switch (serialization)
            {
            case XmlArraySerialization array:

                if (array.Wrapped)
                {
                    writer.Line($"{writerName}.WriteStartElement({array.Name:L});");
                }

                var itemVariable = new CodeWriterDeclaration("item");

                using (writer.Scope($"foreach (var {itemVariable:D} in {name})"))
                {
                    writer.ToSerializeCall(
                        array.ValueSerialization,
                        w => w.Append($"{itemVariable}"),
                        writerName);
                }

                if (array.Wrapped)
                {
                    writer.Line($"{writerName}.WriteEndElement();");
                }

                break;

            case XmlDictionarySerialization dictionarySerialization:
                var pairVariable = new CodeWriterDeclaration("pair");
                using (writer.Scope($"foreach (var {pairVariable:D} in {name})"))
                {
                    writer.ToSerializeCall(
                        dictionarySerialization.ValueSerialization,
                        w => w.Append($"{pairVariable}.Value"),
                        writerName);
                }

                break;

            case XmlObjectSerialization objectSerialization:
                if (nameHint != null)
                {
                    writer.Line($"{writerName}.WriteStartElement({nameHint} ?? {objectSerialization.Name:L});");
                }
                else
                {
                    writer.Line($"{writerName}.WriteStartElement({objectSerialization.Name:L});");
                }

                CodeWriter.CodeWriterScope?CheckPropertyForNull(ObjectTypeProperty objectTypeProperty)
                {
                    return(objectTypeProperty.Declaration.Type.IsNullable ? writer.Scope($"if ({objectTypeProperty.Declaration.Name} != null)") : default);
                }

                foreach (XmlObjectAttributeSerialization property in objectSerialization.Attributes)
                {
                    using (CheckPropertyForNull(property.Property))
                    {
                        writer.Line($"{writerName}.WriteStartAttribute({property.Name:L});");
                        writer.ToSerializeValueCall(
                            w => w.Append($"{property.Property.Declaration.Name}"),
                            writerName,
                            property.ValueSerialization);
                        writer.Line($"{writerName}.WriteEndAttribute();");
                    }
                }

                foreach (XmlObjectElementSerialization property in objectSerialization.Elements)
                {
                    using (CheckPropertyForNull(property.Property))
                    {
                        writer.ToSerializeCall(
                            property.ValueSerialization,
                            w => w.Append($"{property.Property.Declaration.Name}"));
                    }
                }

                foreach (XmlObjectArraySerialization property in objectSerialization.EmbeddedArrays)
                {
                    using (CheckPropertyForNull(property.Property))
                    {
                        writer.ToSerializeCall(
                            property.ArraySerialization,
                            w => w.Append($"{property.Property.Declaration.Name}"));
                    }
                }

                writer.Line($"{writerName}.WriteEndElement();");
                return;