예제 #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());
        }