void LoadAttributes(XElement element, Class @class) { foreach(XElement elem in element.Elements()) { var typeAttr = elem.Attribute("type"); string elemName = elem.Name.LocalName; AttributeProperty property = new AttributeProperty(AttributeValueOrDefault(elem, "name"), elemName, GetType(typeAttr)); @class.Properties.Add(property); } }
Class LoadClass(XElement element, string name) { Class @class; if(this.classes.TryGetValue(name, out @class)) return @class; @class = new Class(AttributeValueOrDefault(element, "typename") ?? name.Capitalize(), AttributeValueOrDefault(element, "namespace") ?? DefaultNamespace); foreach(XElement elem in element.Elements()) { string propertyName = elem.Name.LocalName; if(propertyName == name + ".attributes") LoadAttributes(elem, @class); else if(propertyName == name + ".definitions") LoadDefinitions(elem); else LoadProperty(@class, elem, propertyName); } this.classes.Add(name, @class); return @class; }
CodeExpression GetSystemTypeInitializer(Class type, CodeExpression value) { if(type == Class.String) return value.Invoke("Trim"); return CodeDom.TypeRef(type.Name).Invoke("Parse", value); }
static void GenerateClass(CodeNamespace ns, Class @class) { CodeTypeDeclaration type = CodeDom.CreateClass(@class.Name); CodeConstructor constructor = CodeDom.CreateConstructor(@public: [email protected]); constructor.AddParameter<XElement>("element"); PropertyInitializerVisitor visitor = new PropertyInitializerVisitor(constructor); foreach(Property property in @class.Properties) { type.AddProperty(property.TypeName, property.Name); property.Accept(visitor); } type.Members.Add(constructor); if(@class.IsRootType) { type.Members.AddRange(new CodeTypeMember[] { CreateReadFromStringMethod(type), CreateReadFromStreamMethod(type), CreateReadFromFileMethod(type) }); } ns.Types.Add(type); }
public AttributeProperty(string name, string attributeName, Class type) : base(name, attributeName, type) { }
public Property(string name, string elementName, Class type) { this.name = name ?? elementName.Capitalize(); this.type = type; this.elementName = elementName; }
public ListProperty(string name, string elementName, Class type, string itemElementName, bool noListNode) : base(name, elementName, type) { this.itemElementName = itemElementName; this.noListNode = noListNode; }
void LoadProperty(Class @class, XElement elem, string propertyName) { Class propertyType; var typeAttr = elem.Attribute("type"); var listAttr = elem.Attribute("list"); bool noListNode = elem.Attribute("no_list_node") != null; bool isDefined = elem.Attribute("defined") != null; bool isList = listAttr != null; Property property; if(isList) { propertyType = isDefined ? this.classes[listAttr.Value] : LoadClass(elem, listAttr.Value); property = new ListProperty(AttributeValueOrDefault(elem, "name"), propertyName, propertyType, listAttr.Value, noListNode); } else { if(typeAttr != null) propertyType = GetType(typeAttr); else propertyType = isDefined ? this.classes[elem.Name.LocalName] : LoadClass(elem); property = new Property(AttributeValueOrDefault(elem, "name"), propertyName, propertyType); } @class.Properties.Add(property); }