Ejemplo n.º 1
0
        private void CreateSerializable(XmlClassItem data, GeneratorSettings context, bool isSerializableItem)
        {
            var code = new CodeFormatter();
            var name = data.name + Constants.SerializableClassSuffix;

            code.UseNamespace("System", false);
            code.UseNamespace("System.ComponentModel", false);
            code.UseNamespace(Constants.TypesNamespace);
            code.UseNamespace(Constants.SerializationNamespace);
            code.UseNamespace(context.EnumsNamespace);
            code.NewLine();
            code.Namespace(context.SerializableNamespace);
            code.Add("[Serializable]");
            if (isSerializableItem)
            {
                code.Class(name, true, "SerializableItem");
            }
            else
            {
                code.Class(name);
            }

            var members = new HashSet <string>();

            foreach (var item in data.members)
            {
                if (!members.Add(item.name))
                {
                    continue;
                }
                CommonCodeGenerator.WriteSerializableMember(item, code, _schema);
            }

            _codeWriter.Write(context.SerializableNamespace, name, code.ToString());
        }
Ejemplo n.º 2
0
        public void Generate(XmlClassItem data, ObjectType type, GeneratorSettings context)
        {
            switch (type)
            {
            case ObjectType.SimpleObject:
                CreateSerializable(data, context, true);
                CreateData(data, context, true);
                break;

            case ObjectType.SimpleStruct:
                CreateSerializable(data, context, false);
                CreateData(data, context, false);
                break;

            case ObjectType.MutableObject:
                CreateSerializable(data, context, true);
                CreateMutableData(data, context, true);
                break;

            case ObjectType.MutableStruct:
                CreateSerializable(data, context, false);
                CreateMutableData(data, context, false);
                break;
            }
        }
Ejemplo n.º 3
0
        private static void SortMembers(XmlClassItem data, out List <XmlClassMember> baseMembers, out Dictionary <string, List <XmlClassMember> > extraMembers)
        {
            extraMembers = new Dictionary <string, List <XmlClassMember> >();
            baseMembers  = new List <XmlClassMember>();

            foreach (var item in data.members)
            {
                if (string.IsNullOrEmpty(item.caseValue))
                {
                    baseMembers.Add(item);
                    continue;
                }

                var caseValues = item.caseValue.Split(Constants.ValueSeparators, StringSplitOptions.RemoveEmptyEntries);
                foreach (var value in caseValues)
                {
                    if (!extraMembers.TryGetValue(value, out var list))
                    {
                        extraMembers.Add(value, list = new List <XmlClassMember>());
                    }

                    list.Add(item);
                }
            }
        }
Ejemplo n.º 4
0
        private void GenerateSerializableClass(XmlClassItem item, ObjectType type)
        {
            var template = new SerializableTemplate(item, _schema, type);
            var data     = template.TransformText();

            _codeWriter.Write(Utils.SerializableNamespace, item.name, data);
        }
Ejemplo n.º 5
0
        private void CreateData(XmlClassItem data, GeneratorSettings settings, bool isSerializableItem)
        {
            var code = new CodeFormatter();
            var name = data.name + Constants.DataClassSuffix;

            code.UseNamespace("System", false);
            code.UseNamespace("System.Collections.Generic", false);
            code.UseNamespace("System.Linq", false);
            code.UseNamespace(Constants.TypesNamespace);
            code.UseNamespace(Constants.UtilsNamespace);
            code.UseNamespace(settings.SerializableNamespace);
            code.UseNamespace(settings.EnumsNamespace);
            code.NewLine();
            code.Namespace(settings.ClassesNamespace);
            code.Class(name);

            CommonCodeGenerator.WriteObjectDeserializer(data.name, settings, code);
            code.Add("return new ", name, "(serializable, database);");
            code.CloseBraces();
            code.NewLine();

            CommonCodeGenerator.WriteObjectConsturctor(data.name, settings, code);
            if (isSerializableItem)
            {
                code.Add("ItemId = new ItemId<", name, ">(serializable.Id, serializable.FileName);");
            }
            foreach (var item in data.members)
            {
                CommonCodeGenerator.WriteDeserializationCode(item, code, settings);
            }
            code.CloseBraces();
            code.NewLine();

            CommonCodeGenerator.WriteObjectSerializer(data.name, settings, code);
            code.Add("var serializable = new ", data.name, Constants.SerializableClassSuffix, "();");
            SerializeMembers(data.members, data.typeid, code, isSerializableItem);
            code.Add("return serializable;");
            code.CloseBraces();
            code.NewLine();

            if (isSerializableItem)
            {
                code.Add("public readonly ItemId<", name, "> ItemId;");
            }

            foreach (var item in data.members)
            {
                CommonCodeGenerator.WriteDataMember(item, code, _schema);
            }

            _codeWriter.Write(settings.ClassesNamespace, name, code.ToString());
        }
Ejemplo n.º 6
0
        private void GenerateDataClass(XmlClassItem item, ObjectType type)
        {
            string data;

            if (!string.IsNullOrEmpty(item.switchEnum))
            {
                data = new MutableObjectTemplate(item, _schema, type).TransformText();
            }
            else
            {
                data = new ObjectTemplate(item, _schema, type).TransformText();
            }

            _codeWriter.Write(Utils.ClassesNamespace, item.name, data);
        }
Ejemplo n.º 7
0
        private void SortMembers(XmlClassItem data, out List <XmlClassMember> baseMembers, out Dictionary <string, List <XmlClassMember> > extraMembers, out string switchEnumType)
        {
            baseMembers    = new List <XmlClassMember>();
            switchEnumType = string.Empty;

            foreach (var item in data.members)
            {
                if (!string.IsNullOrEmpty(item.caseValue))
                {
                    continue;
                }

                baseMembers.Add(item);
                if (item.name.Equals(ObjectData.switchEnum, StringComparison.Ordinal))
                {
                    switchEnumType = item.typeid;
                }
            }

            var switchEnum = Schema.GetEnum(switchEnumType);

            extraMembers = switchEnum.items.ToDictionary(item => item.name, item => new List <XmlClassMember>());

            foreach (var item in data.members)
            {
                if (string.IsNullOrEmpty(item.caseValue))
                {
                    continue;
                }

                var caseValues = item.caseValue.Split(Constants.ValueSeparators, StringSplitOptions.RemoveEmptyEntries);
                foreach (var value in caseValues)
                {
                    extraMembers[value].Add(item);
                }
            }
        }
Ejemplo n.º 8
0
 public static string ContentInterfaceName(XmlClassItem data)
 {
     return("I" + (string.IsNullOrEmpty(data.alias) ? data.name : data.alias) + "Content");
 }
Ejemplo n.º 9
0
 public static string DataClassName(XmlClassItem data)
 {
     return(string.IsNullOrEmpty(data.alias) ? data.name : data.alias);
 }
Ejemplo n.º 10
0
        private void CreateMutableData(XmlClassItem data, GeneratorSettings settings, bool isSerializableItem)
        {
            SortMembers(data, out var baseMembers, out var extraMembers);

            var code           = new CodeFormatter();
            var name           = data.name + Constants.DataClassSuffix;
            var switchEnumType = baseMembers.First(item => item.name.Equals(data.switchEnum, StringComparison.Ordinal)).typeid;

            code.UseNamespace("System", false);
            code.UseNamespace("System.Collections.Generic", false);
            code.UseNamespace("System.Linq", false);
            code.UseNamespace(Constants.TypesNamespace);
            code.UseNamespace(Constants.UtilsNamespace);
            code.UseNamespace(settings.SerializableNamespace);
            code.UseNamespace(settings.EnumsNamespace);
            code.NewLine();
            code.Namespace(settings.ClassesNamespace);
            code.Class(name, true, "IDataAdapter");

            CommonCodeGenerator.WriteObjectDeserializer(data.name, settings, code);
            code.Add("var data = new ", name, "(serializable, database); ");
            code.Add("data.CreateContent(serializable, database);");
            code.Add("return data;");
            code.CloseBraces();
            code.NewLine();

            CommonCodeGenerator.WriteObjectConsturctor(data.name, settings, code);
            if (isSerializableItem)
            {
                code.Add("ItemId = new ItemId<", name, ">(serializable.Id, serializable.FileName);");
            }
            foreach (var item in baseMembers)
            {
                CommonCodeGenerator.WriteDeserializationCode(item, code, settings);
            }
            code.CloseBraces();
            code.NewLine();

            code.Add("private void ", CreateContentMethodName, "(", CommonCodeGenerator.SerializableClass(data.name), " serializable, ", settings.DatabaseClass, " database)");
            code.OpenBraces();
            var first = true;

            foreach (var item in extraMembers)
            {
                code.Add(first ? "if (" : "else if (", "serializable.", data.switchEnum, " == ", switchEnumType, ".", item.Key, ")");
                code.Add(Constants.Indent, ContentPropertyName, " = new ", GetContentClassName(item.Key), "(serializable, database);");
                first = false;
            }
            if (!first)
            {
                code.Add("else");
            }
            code.Add(first ? string.Empty : Constants.Indent, ContentPropertyName, " = new ", EmptyContentClassName, "();");
            code.CloseBraces();
            code.NewLine();

            CommonCodeGenerator.WriteObjectSerializer(data.name, settings, code);
            code.Add("var serializable = Content.Serialize();");
            SerializeMembers(baseMembers, data.typeid, code, isSerializableItem);
            code.Add("return serializable;");
            code.CloseBraces();
            code.NewLine();

            AddDataAdapterImplementation(baseMembers, data.switchEnum, code);

            if (isSerializableItem)
            {
                code.Add("public readonly ItemId<", name, "> ItemId;");
            }
            foreach (var item in baseMembers)
            {
                CommonCodeGenerator.WriteDataMember(item, code, _schema);
            }
            code.NewLine();

            AddContentClasses(data.name, extraMembers, settings, code);

            _codeWriter.Write(settings.ClassesNamespace, name, code.ToString());
        }
Ejemplo n.º 11
0
 public SerializableTemplate(XmlClassItem objectData, DatabaseSchema schema, ObjectType type)
 {
     ObjectData = objectData; Schema = schema; ObjectType = type;
 }
Ejemplo n.º 12
0
 public LegacyObjectTemplate(XmlClassItem objectData, DatabaseSchema schema, ObjectType type)
 {
     ObjectData = objectData; Schema = schema; ObjectType = type;
 }