CodeTypeDeclaration ExportStruct(StructMapping mapping) {
if (mapping.TypeDesc.IsRoot) {
ExportRoot(mapping, typeof(XmlIncludeAttribute));
return null;
}
string className = mapping.TypeDesc.Name;
string baseName = mapping.TypeDesc.BaseTypeDesc == null || mapping.TypeDesc.BaseTypeDesc.IsRoot ? string.Empty : mapping.TypeDesc.BaseTypeDesc.FullName;
CodeTypeDeclaration codeClass = new CodeTypeDeclaration(className);
codeClass.IsPartial = CodeProvider.Supports(GeneratorSupport.PartialTypes);
codeClass.Comments.Add(new CodeCommentStatement(Res.GetString(Res.XmlRemarks), true));
CodeNamespace.Types.Add(codeClass);
CodeConstructor ctor = new CodeConstructor();
ctor.Attributes = (ctor.Attributes & ~MemberAttributes.AccessMask) | MemberAttributes.Public;
codeClass.Members.Add(ctor);
if (mapping.TypeDesc.IsAbstract) {
ctor.Attributes |= MemberAttributes.Abstract;
}
if (baseName != null && baseName.Length > 0) {
codeClass.BaseTypes.Add(baseName);
}
else
AddPropertyChangedNotifier(codeClass);
codeClass.TypeAttributes |= TypeAttributes.Public;
if (mapping.TypeDesc.IsAbstract) {
codeClass.TypeAttributes |= TypeAttributes.Abstract;
}
AddIncludeMetadata(codeClass.CustomAttributes, mapping, typeof(XmlIncludeAttribute));
if (GenerateProperties) {
for (int i = 0; i < mapping.Members.Length; i++) {
ExportProperty(codeClass, mapping.Members[i], mapping.Namespace, mapping.Scope, ctor);
}
}
else {
for (int i = 0; i < mapping.Members.Length; i++) {
ExportMember(codeClass, mapping.Members[i], mapping.Namespace, ctor);
}
}
for (int i = 0; i < mapping.Members.Length; i++) {
EnsureTypesExported(mapping.Members[i].Elements, mapping.Namespace);
EnsureTypesExported(mapping.Members[i].Attribute, mapping.Namespace);
EnsureTypesExported(mapping.Members[i].Text, mapping.Namespace);
}
if (mapping.BaseMapping != null)
ExportType(mapping.BaseMapping, mapping.Namespace);
ExportDerivedStructs(mapping);
CodeGenerator.ValidateIdentifiers(codeClass);
if (ctor.Statements.Count == 0) codeClass.Members.Remove(ctor);
return codeClass;
}