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()); }
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; } }
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); } } }
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); }
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()); }
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); }
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); } } }
public static string ContentInterfaceName(XmlClassItem data) { return("I" + (string.IsNullOrEmpty(data.alias) ? data.name : data.alias) + "Content"); }
public static string DataClassName(XmlClassItem data) { return(string.IsNullOrEmpty(data.alias) ? data.name : data.alias); }
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()); }
public SerializableTemplate(XmlClassItem objectData, DatabaseSchema schema, ObjectType type) { ObjectData = objectData; Schema = schema; ObjectType = type; }
public LegacyObjectTemplate(XmlClassItem objectData, DatabaseSchema schema, ObjectType type) { ObjectData = objectData; Schema = schema; ObjectType = type; }