From 9c6f1dc356fc28d57633c07f41b33e257086fbbc Mon Sep 17 00:00:00 2001 From: Michael Ganss Date: Mon, 29 Nov 2021 17:21:02 +0100 Subject: [PATCH] Relax requirements for enums (fixes #294) --- XmlSchemaClassGenerator/ModelBuilder.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/XmlSchemaClassGenerator/ModelBuilder.cs b/XmlSchemaClassGenerator/ModelBuilder.cs index d0d73b62..c9ec1fce 100644 --- a/XmlSchemaClassGenerator/ModelBuilder.cs +++ b/XmlSchemaClassGenerator/ModelBuilder.cs @@ -624,19 +624,28 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType, private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel namespaceModel, XmlQualifiedName qualifiedName, List docs) { var restrictions = new List(); + var allBasesHaveEnums = true; List facets = new(); if (simpleType.Content is XmlSchemaSimpleTypeRestriction typeRestriction) + { facets = typeRestriction.Facets.Cast().ToList(); + } else if (simpleType.Content is XmlSchemaSimpleTypeUnion typeUnion && typeUnion.BaseMemberTypes.All(b => b.Content is XmlSchemaSimpleTypeRestriction r && r.Facets.Count > 0)) - facets = typeUnion.BaseMemberTypes.SelectMany(b => ((XmlSchemaSimpleTypeRestriction)b.Content).Facets.Cast()).ToList(); + { + var baseFacets = typeUnion.BaseMemberTypes.Select(b => ((XmlSchemaSimpleTypeRestriction)b.Content).Facets.Cast()).ToList(); + // if a union has enum restrictions, there must be an enum restriction in all parts of the union + allBasesHaveEnums = baseFacets.All(fs => fs.OfType().Any()); + facets = baseFacets.SelectMany(f => f).ToList(); + } if (facets.Any()) { var enumFacets = facets.OfType().ToList(); // If there are other restrictions mixed into the enumeration values, we'll generate a string to play it safe. - var isEnum = enumFacets.Count > 0 && enumFacets.Count == facets.Count; + var isEnum = enumFacets.Any() && allBasesHaveEnums; + if (isEnum) { // we got an enum