Example #1
0
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
// </auto-generated>

#pragma warning disable 618
#pragma warning disable 612
#pragma warning disable 414
#pragma warning disable 168

#pragma warning disable SA1129 // Do not use default value type constructor
#pragma warning disable SA1200 // Using directives should be placed correctly
#pragma warning disable SA1309 // Field names should not begin with underscore
#pragma warning disable SA1312 // Variable names should begin with lower-case letter
#pragma warning disable SA1403 // File may only contain a single namespace
#pragma warning disable SA1649 // File name should match first type name

namespace ");
            this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
            this.Write("\r\n{\r\n    using System;\r\n    using System.Buffers;\r\n    using System.Runtime.Inter" +
                       "opServices;\r\n    using MessagePack;\r\n");

            var list = new List <ValueTuple <MemberSerializationInfo, byte[]> >();

            foreach (var objInfo in ObjectSerializationInfos)
            {
                list.Clear();
                foreach (var member in objInfo.Members)
                {
                    var binary = EmbedStringHelper.Utf8.GetBytes(member.StringKey);
                    list.Add(new ValueTuple <MemberSerializationInfo, byte[]>(member, binary));
                }

                string formatterName = objInfo.Name + (objInfo.IsOpenGenericType ? $"Formatter<{string.Join(",", (object[])objInfo.GenericTypeParameters)}>" : "Formatter");
                bool   isFormatterResolverNecessary = ShouldUseFormatterResolverHelper.ShouldUseFormatterResolver(objInfo.Members);

                this.Write("\r\n    public sealed class ");
                this.Write(this.ToStringHelper.ToStringWithCulture(formatterName));
                this.Write(" : global::MessagePack.Formatters.IMessagePackFormatter<");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(">\r\n    {\r\n");

                foreach (var memberAndBinary in list)
                {
                    var member = memberAndBinary.Item1;
                    var binary = memberAndBinary.Item2;

                    this.Write("        // ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.StringKey));
                    this.Write("\r\n        private static global::System.ReadOnlySpan<byte> GetSpan_");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                    this.Write("() => ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(EmbedStringHelper.ToByteArrayString(binary)));
                    this.Write(";\r\n");
                }

                this.Write("\r\n        public void Serialize(ref global::MessagePack.MessagePackWriter writer," +
                           " ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" value, global::MessagePack.MessagePackSerializerOptions options)\r\n        {\r\n");

                if (objInfo.IsClass)
                {
                    this.Write("            if (value is null)\r\n            {\r\n                writer.WriteNil();" +
                               "\r\n                return;\r\n            }\r\n\r\n");
                }

                if (isFormatterResolverNecessary)
                {
                    this.Write("            IFormatterResolver formatterResolver = options.Resolver;\r\n");
                }

                if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    if (objInfo.NeedsCastOnBefore)
                    {
                        this.Write("            ((global::MessagePack.IMessagePackSerializationCallbackReceiver)value" +
                                   ").OnBeforeSerialize();\r\n");
                    }
                    else
                    {
                        this.Write("            value.OnBeforeSerialize();\r\n");
                    }
                }

                this.Write("            writer.WriteMapHeader(");
                this.Write(this.ToStringHelper.ToStringWithCulture(list.Count));
                this.Write(");\r\n");

                foreach (var memberAndBinary in list)
                {
                    var member = memberAndBinary.Item1;

                    this.Write("            writer.WriteRaw(GetSpan_");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                    this.Write("());\r\n            ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString()));
                    this.Write(";\r\n");
                }

                this.Write("        }\r\n\r\n        public ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" Deserialize(ref global::MessagePack.MessagePackReader reader, global::MessagePac" +
                           "k.MessagePackSerializerOptions options)\r\n        {\r\n            if (reader.TryRe" +
                           "adNil())\r\n            {\r\n");

                if (objInfo.IsClass)
                {
                    this.Write("                return null;\r\n");
                }
                else
                {
                    this.Write("                throw new global::System.InvalidOperationException(\"typecode is n" +
                               "ull, struct not supported\");\r\n");
                }

                this.Write("            }\r\n\r\n");

                if (objInfo.Members.Length == 0)
                {
                    this.Write("            reader.Skip();\r\n            var ____result = new ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                    this.Write(";\r\n");
                }
                else
                {
                    this.Write("            options.Security.DepthStep(ref reader);\r\n");

                    if (isFormatterResolverNecessary)
                    {
                        this.Write("            IFormatterResolver formatterResolver = options.Resolver;\r\n");
                    }

                    this.Write("            var length = reader.ReadMapHeader();\r\n");

                    foreach (var memberInfo in objInfo.Members)
                    {
                        this.Write("            var __");
                        this.Write(this.ToStringHelper.ToStringWithCulture(memberInfo.Name));
                        this.Write("__ = default(");
                        this.Write(this.ToStringHelper.ToStringWithCulture(memberInfo.Type));
                        this.Write(");\r\n");
                    }

                    this.Write(@"
            for (int i = 0; i < length; i++)
            {
                ReadOnlySpan<byte> stringKey = global::MessagePack.Internal.CodeGenHelpers.ReadStringSpan(ref reader);
                switch (stringKey.Length)
                {
                    default:
                    FAIL:
                      reader.Skip();
                      continue;
");
                    this.Write(this.ToStringHelper.ToStringWithCulture(StringKeyFormatterDeserializeHelper.Classify(objInfo.Members, "                    ")));
                    this.Write("\r\n                }\r\n            }\r\n\r\n            var ____result = new ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                    this.Write("\r\n            {\r\n");

                    // Preparation for C#9 Record class
                    foreach (var member in objInfo.Members.Where(x => x.IsWritable))
                    {
                        this.Write("                ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                        this.Write(" = __");
                        this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                        this.Write("__,\r\n");
                    }

                    this.Write("            };\r\n\r\n");
                }

                if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    if (objInfo.NeedsCastOnAfter)
                    {
                        this.Write("            ((global::MessagePack.IMessagePackSerializationCallbackReceiver)____r" +
                                   "esult).OnAfterDeserialize();\r\n");
                    }
                    else
                    {
                        this.Write("            ____result.OnAfterDeserialize();\r\n");
                    }
                }

                if (objInfo.Members.Length != 0)
                {
                    this.Write("            reader.Depth--;\r\n");
                }

                this.Write("            return ____result;\r\n        }\r\n    }\r\n");
            }

            this.Write("}\r\n");
            return(this.GenerationEnvironment.ToString());
        }
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
// </auto-generated>

#pragma warning disable 618
#pragma warning disable 612
#pragma warning disable 414
#pragma warning disable 168
#pragma warning disable CS1591 // document public APIs

#pragma warning disable SA1129 // Do not use default value type constructor
#pragma warning disable SA1309 // Field names should not begin with underscore
#pragma warning disable SA1312 // Variable names should begin with lower-case letter
#pragma warning disable SA1403 // File may only contain a single namespace
#pragma warning disable SA1649 // File name should match first type name

namespace ");
            this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
            this.Write("\r\n{\r\n");
            var list = new List <ValueTuple <MemberSerializationInfo, byte[]> >();

            foreach (var objInfo in ObjectSerializationInfos)
            {
                list.Clear();
                foreach (var member in objInfo.Members)
                {
                    var binary = EmbedStringHelper.Utf8.GetBytes(member.StringKey);
                    list.Add(new ValueTuple <MemberSerializationInfo, byte[]>(member, binary));
                }

                bool isFormatterResolverNecessary = ShouldUseFormatterResolverHelper.ShouldUseFormatterResolver(objInfo.Members);
                this.Write("    public sealed class ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FormatterNameWithoutNameSpace));
                this.Write(" : global::MessagePack.Formatters.IMessagePackFormatter<");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(">\r\n");
                foreach (var typeArg in objInfo.GenericTypeParameters.Where(x => x.HasConstraints))
                {
                    this.Write("        where ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(typeArg.Name));
                    this.Write(" : ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(typeArg.Constraints));
                    this.Write("\r\n");
                }
                this.Write("    {\r\n");
                for (var i = 0; i < list.Count; i++)
                {
                    var member = list[i].Item1;
                    var binary = list[i].Item2;
                    this.Write("        // ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.StringKey));
                    this.Write("\r\n        private static global::System.ReadOnlySpan<byte> GetSpan_");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                    this.Write("() => ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(EmbedStringHelper.ToByteArrayString(binary)));
                    this.Write(";\r\n");
                }
                if (list.Count != 0)
                {
                    this.Write("\r\n");
                }
                this.Write("        public void Serialize(ref global::MessagePack.MessagePackWriter writer, ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" value, global::MessagePack.MessagePackSerializerOptions options)\r\n        {\r\n");
                if (objInfo.IsClass)
                {
                    this.Write("            if (value is null)\r\n            {\r\n                writer.WriteNil();" +
                               "\r\n                return;\r\n            }\r\n\r\n");
                }

                if (isFormatterResolverNecessary)
                {
                    this.Write("            var formatterResolver = options.Resolver;\r\n");
                }

                if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    if (objInfo.NeedsCastOnBefore)
                    {
                        this.Write("            ((global::MessagePack.IMessagePackSerializationCallbackReceiver)value" +
                                   ").OnBeforeSerialize();\r\n");
                    }
                    else
                    {
                        this.Write("            value.OnBeforeSerialize();\r\n");
                    }
                }
                this.Write("            writer.WriteMapHeader(");
                this.Write(this.ToStringHelper.ToStringWithCulture(list.Count));
                this.Write(");\r\n");
                foreach (var memberAndBinary in list)
                {
                    var member = memberAndBinary.Item1;
                    this.Write("            writer.WriteRaw(GetSpan_");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                    this.Write("());\r\n            ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString()));
                    this.Write(";\r\n");
                }
                this.Write("        }\r\n\r\n        public ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" Deserialize(ref global::MessagePack.MessagePackReader reader, global::MessagePac" +
                           "k.MessagePackSerializerOptions options)\r\n        {\r\n            if (reader.TryRe" +
                           "adNil())\r\n            {\r\n");
                if (objInfo.IsClass)
                {
                    this.Write("                return null;\r\n");
                }
                else
                {
                    this.Write("                throw new global::System.InvalidOperationException(\"typecode is n" +
                               "ull, struct not supported\");\r\n");
                }
                this.Write("            }\r\n\r\n");
                if (objInfo.Members.Length == 0)
                {
                    this.Write("            reader.Skip();\r\n            var ____result = new ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                    this.Write(";\r\n");
                }
                else
                {
                    this.Write("            options.Security.DepthStep(ref reader);\r\n");
                    if (isFormatterResolverNecessary)
                    {
                        this.Write("            var formatterResolver = options.Resolver;\r\n");
                    }
                    this.Write("            var length = reader.ReadMapHeader();\r\n");
                    var canOverwrite = objInfo.ConstructorParameters.Length == 0;
                    if (canOverwrite)
                    {
                        this.Write("            var ____result = new ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                        this.Write(";\r\n");
                    }
                    else
                    {
                        foreach (var member in objInfo.Members.Where(x => x.IsWritable || objInfo.ConstructorParameters.Any(p => p.Equals(x))))
                        {
                            if (objInfo.ConstructorParameters.All(p => !p.Equals(member)))
                            {
                                this.Write("            var __");
                                this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                                this.Write("__IsInitialized = false;\r\n");
                            }
                            this.Write("            var __");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write("__ = default(");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Type));
                            this.Write(");\r\n");
                        }
                    }
                    this.Write(@"
            for (int i = 0; i < length; i++)
            {
                var stringKey = global::MessagePack.Internal.CodeGenHelpers.ReadStringSpan(ref reader);
                switch (stringKey.Length)
                {
                    default:
                    FAIL:
                      reader.Skip();
                      continue;
");
                    this.Write(this.ToStringHelper.ToStringWithCulture(StringKeyFormatterDeserializeHelper.Classify(objInfo, "                    ", canOverwrite)));
                    this.Write("\r\n                }\r\n            }\r\n\r\n");
                    if (!canOverwrite)
                    {
                        this.Write("            var ____result = new ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                        this.Write(";\r\n");
                        foreach (var member in objInfo.Members.Where(x => x.IsWritable && !objInfo.ConstructorParameters.Any(p => p.Equals(x))))
                        {
                            this.Write("            if (__");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write("__IsInitialized)\r\n            {\r\n                ____result.");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write(" = __");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write("__;\r\n            }\r\n\r\n");
                        }
                    }
                }
                if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    if (objInfo.NeedsCastOnAfter)
                    {
                        this.Write("            ((global::MessagePack.IMessagePackSerializationCallbackReceiver)____r" +
                                   "esult).OnAfterDeserialize();\r\n");
                    }
                    else
                    {
                        this.Write("            ____result.OnAfterDeserialize();\r\n");
                    }
                }
                if (objInfo.Members.Length != 0)
                {
                    this.Write("            reader.Depth--;\r\n");
                }
                this.Write("            return ____result;\r\n        }\r\n    }\r\n\r\n");
            }
            this.Write(@"}

#pragma warning restore 168
#pragma warning restore 414
#pragma warning restore 618
#pragma warning restore 612

#pragma warning restore SA1129 // Do not use default value type constructor
#pragma warning restore SA1309 // Field names should not begin with underscore
#pragma warning restore SA1312 // Variable names should begin with lower-case letter
#pragma warning restore SA1403 // File may only contain a single namespace
#pragma warning restore SA1649 // File name should match first type name
");
            return(this.GenerationEnvironment.ToString());
        }
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
// </auto-generated>

#pragma warning disable 618
#pragma warning disable 612
#pragma warning disable 414
#pragma warning disable 168

#pragma warning disable SA1129 // Do not use default value type constructor
#pragma warning disable SA1200 // Using directives should be placed correctly
#pragma warning disable SA1309 // Field names should not begin with underscore
#pragma warning disable SA1312 // Variable names should begin with lower-case letter
#pragma warning disable SA1403 // File may only contain a single namespace
#pragma warning disable SA1649 // File name should match first type name

namespace ");
            this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
            this.Write("\r\n{\r\n    using System;\r\n    using System.Buffers;\r\n    using MessagePack;\r\n");
            foreach (var objInfo in ObjectSerializationInfos)
            {
                bool isFormatterResolverNecessary = ShouldUseFormatterResolverHelper.ShouldUseFormatterResolver(objInfo.Members);
                this.Write("\r\n    public sealed class ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.Name));
                this.Write("Formatter");
                this.Write(this.ToStringHelper.ToStringWithCulture((objInfo.IsOpenGenericType ? $"<{string.Join(",", objInfo.GenericTypeParameters.Select(x => x.Name))}>" : "")));
                this.Write(" : global::MessagePack.Formatters.IMessagePackFormatter<");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(">\r\n");
                foreach (var typeArg in objInfo.GenericTypeParameters.Where(x => x.HasConstraints))
                {
                    this.Write("        where ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(typeArg.Name));
                    this.Write(" : ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(typeArg.Constraints));
                    this.Write("\r\n");
                }
                this.Write("    {\r\n");
                foreach (var item in objInfo.Members)
                {
                    if (item.CustomFormatterTypeName != null)
                    {
                        this.Write("        ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(item.CustomFormatterTypeName));
                        this.Write(" __");
                        this.Write(this.ToStringHelper.ToStringWithCulture(item.Name));
                        this.Write("CustomFormatter__ = new ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(item.CustomFormatterTypeName));
                        this.Write("();\r\n");
                    }
                }
                this.Write("\r\n        public void Serialize(ref MessagePackWriter writer, ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" value, global::MessagePack.MessagePackSerializerOptions options)\r\n        {\r\n");
                if (objInfo.IsClass)
                {
                    this.Write("            if (value == null)\r\n            {\r\n                writer.WriteNil();" +
                               "\r\n                return;\r\n            }\r\n\r\n");
                }

                if (isFormatterResolverNecessary)
                {
                    this.Write("            IFormatterResolver formatterResolver = options.Resolver;\r\n");
                }

                if (objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnBefore)
                {
                    this.Write("            ((IMessagePackSerializationCallbackReceiver)value).OnBeforeSerialize(" +
                               ");\r\n");
                }
                else if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    this.Write("            value.OnBeforeSerialize();\r\n");
                }
                this.Write("            writer.WriteArrayHeader(");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1));
                this.Write(");\r\n");
                for (var i = 0; i <= objInfo.MaxKey; i++)
                {
                    var member = objInfo.GetMember(i);
                    if (member == null)
                    {
                        this.Write("            writer.WriteNil();\r\n");
                    }
                    else
                    {
                        this.Write("            ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString()));
                        this.Write(";\r\n");
                    }
                }
                this.Write("        }\r\n\r\n        public ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" Deserialize(ref MessagePackReader reader, global::MessagePack.MessagePackSeriali" +
                           "zerOptions options)\r\n        {\r\n            if (reader.TryReadNil())\r\n          " +
                           "  {\r\n");
                if (objInfo.IsClass)
                {
                    this.Write("                return null;\r\n");
                }
                else
                {
                    this.Write("                throw new InvalidOperationException(\"typecode is null, struct not" +
                               " supported\");\r\n");
                }
                this.Write("            }\r\n\r\n            options.Security.DepthStep(ref reader);\r\n");
                if (isFormatterResolverNecessary)
                {
                    this.Write("            IFormatterResolver formatterResolver = options.Resolver;\r\n");
                }
                this.Write("            var length = reader.ReadArrayHeader();\r\n");
                foreach (var x in objInfo.Members)
                {
                    this.Write("            var __");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
                    this.Write("__ = default(");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.Type));
                    this.Write(");\r\n");
                }
                this.Write("\r\n            for (int i = 0; i < length; i++)\r\n            {\r\n                sw" +
                           "itch (i)\r\n                {\r\n");
                foreach (var x in objInfo.Members)
                {
                    this.Write("                    case ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.IntKey));
                    this.Write(":\r\n                        __");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
                    this.Write("__ = ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.GetDeserializeMethodString()));
                    this.Write(";\r\n                        break;\r\n");
                }
                this.Write("                    default:\r\n                        reader.Skip();\r\n           " +
                           "             break;\r\n                }\r\n            }\r\n\r\n            var ____res" +
                           "ult = new ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                this.Write(";\r\n");
                foreach (var x in objInfo.Members.Where(x => x.IsWritable))
                {
                    this.Write("            ____result.");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
                    this.Write(" = __");
                    this.Write(this.ToStringHelper.ToStringWithCulture(x.Name));
                    this.Write("__;\r\n");
                }
                if (objInfo.HasIMessagePackSerializationCallbackReceiver && objInfo.NeedsCastOnAfter)
                {
                    this.Write("            ((IMessagePackSerializationCallbackReceiver)____result).OnAfterDeseri" +
                               "alize();\r\n");
                }
                else if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    this.Write("            ____result.OnAfterDeserialize();\r\n");
                }
                this.Write("            reader.Depth--;\r\n            return ____result;\r\n        }\r\n    }\r\n");
            }
            this.Write(@"}

#pragma warning restore 168
#pragma warning restore 414
#pragma warning restore 618
#pragma warning restore 612

#pragma warning restore SA1129 // Do not use default value type constructor
#pragma warning restore SA1200 // Using directives should be placed correctly
#pragma warning restore SA1309 // Field names should not begin with underscore
#pragma warning restore SA1312 // Variable names should begin with lower-case letter
#pragma warning restore SA1403 // File may only contain a single namespace
#pragma warning restore SA1649 // File name should match first type name
");
            return(this.GenerationEnvironment.ToString());
        }
        /// <summary>
        /// Create the template output
        /// </summary>
        public virtual string TransformText()
        {
            this.Write(@"// <auto-generated>
// THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
// </auto-generated>

#pragma warning disable 618
#pragma warning disable 612
#pragma warning disable 414
#pragma warning disable 168

#pragma warning disable SA1129 // Do not use default value type constructor
#pragma warning disable SA1200 // Using directives should be placed correctly
#pragma warning disable SA1309 // Field names should not begin with underscore
#pragma warning disable SA1312 // Variable names should begin with lower-case letter
#pragma warning disable SA1403 // File may only contain a single namespace
#pragma warning disable SA1649 // File name should match first type name

namespace ");
            this.Write(this.ToStringHelper.ToStringWithCulture(Namespace));
            this.Write("\r\n{\r\n    using global::System.Buffers;\r\n    using global::MessagePack;\r\n");
            foreach (var objInfo in ObjectSerializationInfos)
            {
                bool isFormatterResolverNecessary = ShouldUseFormatterResolverHelper.ShouldUseFormatterResolver(objInfo.Members);
                this.Write("\r\n    public sealed class ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FormatterNameWithoutNameSpace));
                this.Write(" : global::MessagePack.Formatters.IMessagePackFormatter<");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(">\r\n");
                foreach (var typeArg in objInfo.GenericTypeParameters.Where(x => x.HasConstraints))
                {
                    this.Write("        where ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(typeArg.Name));
                    this.Write(" : ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(typeArg.Constraints));
                    this.Write("\r\n");
                }
                this.Write("    {\r\n");
                foreach (var item in objInfo.Members)
                {
                    if (item.CustomFormatterTypeName != null)
                    {
                        this.Write("        private readonly ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(item.CustomFormatterTypeName));
                        this.Write(" __");
                        this.Write(this.ToStringHelper.ToStringWithCulture(item.Name));
                        this.Write("CustomFormatter__ = new ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(item.CustomFormatterTypeName));
                        this.Write("();\r\n");
                    }
                }
                this.Write("\r\n        public void Serialize(ref global::MessagePack.MessagePackWriter writer," +
                           " ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" value, global::MessagePack.MessagePackSerializerOptions options)\r\n        {\r\n");
                if (objInfo.IsClass)
                {
                    this.Write("            if (value == null)\r\n            {\r\n                writer.WriteNil();" +
                               "\r\n                return;\r\n            }\r\n\r\n");
                }

                if (isFormatterResolverNecessary)
                {
                    this.Write("            global::MessagePack.IFormatterResolver formatterResolver = options.Re" +
                               "solver;\r\n");
                }

                if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    if (objInfo.NeedsCastOnBefore)
                    {
                        this.Write("            ((global::MessagePack.IMessagePackSerializationCallbackReceiver)value" +
                                   ").OnBeforeSerialize();\r\n");
                    }
                    else
                    {
                        this.Write("            value.OnBeforeSerialize();\r\n");
                    }
                }
                this.Write("            writer.WriteArrayHeader(");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.MaxKey + 1));
                this.Write(");\r\n");
                for (var i = 0; i <= objInfo.MaxKey; i++)
                {
                    var member = objInfo.GetMember(i);
                    if (member == null)
                    {
                        this.Write("            writer.WriteNil();\r\n");
                    }
                    else
                    {
                        this.Write("            ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(member.GetSerializeMethodString()));
                        this.Write(";\r\n");
                    }
                }
                this.Write("        }\r\n\r\n        public ");
                this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.FullName));
                this.Write(" Deserialize(ref global::MessagePack.MessagePackReader reader, global::MessagePac" +
                           "k.MessagePackSerializerOptions options)\r\n        {\r\n            if (reader.TryRe" +
                           "adNil())\r\n            {\r\n");
                if (objInfo.IsClass)
                {
                    this.Write("                return null;\r\n");
                }
                else
                {
                    this.Write("                throw new global::System.InvalidOperationException(\"typecode is n" +
                               "ull, struct not supported\");\r\n");
                }
                this.Write("            }\r\n\r\n");
                if (objInfo.MaxKey == -1 && !objInfo.HasIMessagePackSerializationCallbackReceiver)
                {
                    this.Write("            reader.Skip();\r\n            return new ");
                    this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                    this.Write(";\r\n");
                }
                else
                {
                    this.Write("            options.Security.DepthStep(ref reader);\r\n");
                    if (isFormatterResolverNecessary)
                    {
                        this.Write("            global::MessagePack.IFormatterResolver formatterResolver = options.Re" +
                                   "solver;\r\n");
                    }
                    this.Write("            var length = reader.ReadArrayHeader();\r\n");
                    var canOverwrite = objInfo.ConstructorParameters.Length == 0;
                    if (canOverwrite)
                    {
                        this.Write("            var ____result = new ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                        this.Write(";\r\n");
                    }
                    else
                    {
                        foreach (var member in objInfo.Members)
                        {
                            this.Write("            var __");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write("__ = default(");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Type));
                            this.Write(");\r\n");
                        }
                    }
                    this.Write("\r\n            for (int i = 0; i < length; i++)\r\n            {\r\n                sw" +
                               "itch (i)\r\n                {\r\n");
                    for (var memberIndex = 0; memberIndex <= objInfo.MaxKey; memberIndex++)
                    {
                        var member = objInfo.GetMember(memberIndex);
                        if (member == null)
                        {
                            continue;
                        }
                        this.Write("                    case ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(member.IntKey));
                        this.Write(":\r\n");
                        if (canOverwrite)
                        {
                            if (member.IsWritable)
                            {
                                this.Write("                        ____result.");
                                this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                                this.Write(" = ");
                                this.Write(this.ToStringHelper.ToStringWithCulture(member.GetDeserializeMethodString()));
                                this.Write(";\r\n");
                            }
                            else
                            {
                                this.Write("                        ");
                                this.Write(this.ToStringHelper.ToStringWithCulture(member.GetDeserializeMethodString()));
                                this.Write(";\r\n");
                            }
                        }
                        else
                        {
                            this.Write("                        __");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write("__ = ");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.GetDeserializeMethodString()));
                            this.Write(";\r\n");
                        }
                        this.Write("                        break;\r\n");
                    }
                    this.Write("                    default:\r\n                        reader.Skip();\r\n           " +
                               "             break;\r\n                }\r\n            }\r\n\r\n");
                    if (!canOverwrite)
                    {
                        this.Write("            var ____result = new ");
                        this.Write(this.ToStringHelper.ToStringWithCulture(objInfo.GetConstructorString()));
                        this.Write(";\r\n");
                        bool memberAssignExists = false;
                        for (var memberIndex = 0; memberIndex <= objInfo.MaxKey; memberIndex++)
                        {
                            var member = objInfo.GetMember(memberIndex);
                            if (member == null || !member.IsWritable || objInfo.ConstructorParameters.Any(p => p.Equals(member)))
                            {
                                continue;
                            }
                            memberAssignExists = true;
                            this.Write("            if (length <= ");
                            this.Write(this.ToStringHelper.ToStringWithCulture(memberIndex));
                            this.Write(")\r\n            {\r\n                goto MEMBER_ASSIGNMENT_END;\r\n            }\r\n\r\n " +
                                       "           ____result.");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write(" = __");
                            this.Write(this.ToStringHelper.ToStringWithCulture(member.Name));
                            this.Write("__;\r\n");
                        }
                        if (memberAssignExists)
                        {
                            this.Write("\r\n        MEMBER_ASSIGNMENT_END:\r\n");
                        }
                    }

                    if (objInfo.HasIMessagePackSerializationCallbackReceiver)
                    {
                        if (objInfo.NeedsCastOnAfter)
                        {
                            this.Write("            ((global::MessagePack.IMessagePackSerializationCallbackReceiver)____r" +
                                       "esult).OnAfterDeserialize();\r\n");
                        }
                        else
                        {
                            this.Write("            ____result.OnAfterDeserialize();\r\n");
                        }
                    }
                    this.Write("            reader.Depth--;\r\n            return ____result;\r\n");
                }
                this.Write("        }\r\n    }\r\n");
            }
            this.Write(@"}

#pragma warning restore 168
#pragma warning restore 414
#pragma warning restore 618
#pragma warning restore 612

#pragma warning restore SA1129 // Do not use default value type constructor
#pragma warning restore SA1200 // Using directives should be placed correctly
#pragma warning restore SA1309 // Field names should not begin with underscore
#pragma warning restore SA1312 // Variable names should begin with lower-case letter
#pragma warning restore SA1403 // File may only contain a single namespace
#pragma warning restore SA1649 // File name should match first type name
");
            return(this.GenerationEnvironment.ToString());
        }