Skip to content

Commit c88b0d9

Browse files
author
Michael Ganss
committed
Pass parent MinOccurs and MaxOccurs when creating properties (see #273)
1 parent aaa3a12 commit c88b0d9

2 files changed

Lines changed: 15 additions & 12 deletions

File tree

XmlSchemaClassGenerator/ModelBuilder.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ private void CreateSubstitutes()
119119
var cls = (ClassModel)prop.OwningType;
120120
var schema = substitute.Element.GetSchema();
121121
var source = CodeUtilities.CreateUri(schema.SourceUri);
122-
var props = CreatePropertiesForElements(source, cls, prop.XmlParticle, new[] { prop.Particle }, substitute, order);
122+
var props = CreatePropertiesForElements(source, cls, prop.Particle, new[] { prop.Particle }, substitute, order);
123123

124124
cls.Properties.AddRange(props);
125125

@@ -379,8 +379,9 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaGroup group, NamespaceMod
379379
Types[key] = interfaceModel;
380380
}
381381

382-
var particle = group.Particle;
383-
var items = GetElements(particle);
382+
var xmlParticle = group.Particle;
383+
var particle = new Particle(xmlParticle, group.Parent);
384+
var items = GetElements(xmlParticle);
384385
var properties = CreatePropertiesForElements(source, interfaceModel, particle, items.Where(i => !(i.XmlParticle is XmlSchemaGroupRef)));
385386
interfaceModel.Properties.AddRange(properties);
386387
var interfaces = items.Select(i => i.XmlParticle).OfType<XmlSchemaGroupRef>()
@@ -462,20 +463,20 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType,
462463
if (baseModel is ClassModel baseClassModel) { baseClassModel.DerivedTypes.Add(classModel); }
463464
}
464465

465-
XmlSchemaParticle particle = null;
466+
XmlSchemaParticle xmlParticle = null;
466467
if (classModel.BaseClass != null)
467468
{
468469
if (complexType.ContentModel.Content is XmlSchemaComplexContentExtension complexContent)
469470
{
470-
particle = complexContent.Particle;
471+
xmlParticle = complexContent.Particle;
471472
}
472473

473474
// If it's a restriction, do not duplicate elements on the derived class, they're already in the base class.
474475
// See https://msdn.microsoft.com/en-us/library/f3z3wh0y.aspx
475476
}
476-
else particle = complexType.Particle ?? complexType.ContentTypeParticle;
477+
else xmlParticle = complexType.Particle ?? complexType.ContentTypeParticle;
477478

478-
var items = GetElements(particle, complexType).ToList();
479+
var items = GetElements(xmlParticle, complexType).ToList();
479480

480481
if (_configuration.GenerateInterfaces)
481482
{
@@ -485,6 +486,7 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType,
485486
classModel.AddInterfaces(interfaces);
486487
}
487488

489+
var particle = new Particle(xmlParticle, xmlParticle?.Parent);
488490
var properties = CreatePropertiesForElements(source, classModel, particle, items);
489491
classModel.Properties.AddRange(properties);
490492

@@ -763,10 +765,11 @@ private IEnumerable<PropertyModel> CreatePropertiesForAttributes(Uri source, Typ
763765
return properties;
764766
}
765767

766-
private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeModel typeModel, XmlSchemaParticle particle, IEnumerable<Particle> items,
768+
private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeModel typeModel, Particle particle, IEnumerable<Particle> items,
767769
Substitute substitute = null, int order = 0)
768770
{
769771
var properties = new List<PropertyModel>();
772+
var xmlParticle = particle.XmlParticle;
770773

771774
foreach (var item in items)
772775
{
@@ -784,7 +787,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
784787
if (elementQualifiedName.IsEmpty)
785788
{
786789
// inner type, have to generate a type name
787-
var typeModelName = particle is XmlSchemaGroupRef groupRef ? groupRef.RefName : typeModel.XmlSchemaName;
790+
var typeModelName = xmlParticle is XmlSchemaGroupRef groupRef ? groupRef.RefName : typeModel.XmlSchemaName;
788791
var typeName = _configuration.NamingProvider.PropertyNameFromElement(typeModelName.Name, element.QualifiedName.Name);
789792
elementQualifiedName = new XmlQualifiedName(typeName, typeModel.XmlSchemaName.Namespace);
790793
// try to avoid name clashes
@@ -861,7 +864,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
861864
}
862865

863866
var groupItems = GetElements(group.Particle);
864-
var groupProperties = CreatePropertiesForElements(source, typeModel, item.XmlParticle, groupItems, order: order).ToList();
867+
var groupProperties = CreatePropertiesForElements(source, typeModel, item, groupItems, order: order).ToList();
865868
if (_configuration.EmitOrder)
866869
{
867870
order += groupProperties.Count;

XmlSchemaClassGenerator/Particle.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public Particle(XmlSchemaParticle particle, XmlSchemaObject parent)
1313
{
1414
XmlParticle = particle;
1515
XmlParent = parent;
16-
MinOccurs = particle.MinOccurs;
17-
MaxOccurs = particle.MaxOccurs;
16+
MinOccurs = particle?.MinOccurs ?? 1;
17+
MaxOccurs = particle?.MaxOccurs ?? 1;
1818
}
1919

2020
public XmlSchemaParticle XmlParticle { get; set; }

0 commit comments

Comments
 (0)