Skip to content

Commit 72abaaf

Browse files
authored
Merge pull request #88 from jokokko/master
For mixed complexTypes, the XmlTextAttribute member should not collid…
2 parents 5d55070 + e1e5282 commit 72abaaf

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

XmlSchemaClassGenerator.Tests/XmlTests.cs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,56 @@ public void EditorBrowsableAttributeRespectsCodeTypeReferenceOptions(CodeTypeRef
377377
generatedType.First());
378378
}
379379

380+
[Fact]
381+
public void MixedTypeMustNotCollideWithExistingMembers()
382+
{
383+
const string xsd = @"<?xml version=""1.0"" encoding=""UTF-8""?>
384+
<xs:schema elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://local.none"" xmlns:l=""http://local.none"">
385+
<xs:element name=""document"" type=""l:elem"">
386+
</xs:element>
387+
<xs:complexType name=""elem"" mixed=""true"">
388+
<xs:attribute name=""Text"" type=""xs:string""/>
389+
</xs:complexType>
390+
</xs:schema>";
380391

381-
[Theory]
392+
var generatedType = ConvertXml(nameof(MixedTypeMustNotCollideWithExistingMembers), xsd, new Generator
393+
{
394+
NamespaceProvider = new NamespaceProvider
395+
{
396+
GenerateNamespace = key => "Test"
397+
}
398+
});
399+
400+
Assert.Contains(
401+
@"public string[] Text_1 { get; set; }",
402+
generatedType.First());
403+
}
404+
405+
[Fact]
406+
public void MixedTypeMustNotCollideWithContainingTypeName()
407+
{
408+
const string xsd = @"<?xml version=""1.0"" encoding=""UTF-8""?>
409+
<xs:schema elementFormDefault=""qualified"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" targetNamespace=""http://local.none"" xmlns:l=""http://local.none"">
410+
<xs:element name=""document"" type=""l:Text"">
411+
</xs:element>
412+
<xs:complexType name=""Text"" mixed=""true"">
413+
</xs:complexType>
414+
</xs:schema>";
415+
416+
var generatedType = ConvertXml(nameof(MixedTypeMustNotCollideWithExistingMembers), xsd, new Generator
417+
{
418+
NamespaceProvider = new NamespaceProvider
419+
{
420+
GenerateNamespace = key => "Test"
421+
}
422+
});
423+
424+
Assert.Contains(
425+
@"public string[] Text_1 { get; set; }",
426+
generatedType.First());
427+
}
428+
429+
[Theory]
382430
[InlineData(@"xml/sameattributenames.xsd", @"xml/sameattributenames_import.xsd")]
383431
public void CollidingAttributeAndPropertyNamesCanBeResolved(params string[] files)
384432
{

XmlSchemaClassGenerator/ModelBuilder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public ModelBuilder(GeneratorConfiguration configuration, XmlSchemaSet set)
5353

5454
foreach (var rootElement in set.GlobalElements.Values.Cast<XmlSchemaElement>())
5555
{
56-
var source = new Uri(rootElement.GetSchema().SourceUri);
56+
var rootSchema = rootElement.GetSchema();
57+
var source = !string.IsNullOrEmpty(rootSchema.SourceUri) ? new Uri(rootElement.GetSchema().SourceUri) : default(Uri);
5758
var qualifiedName = rootElement.ElementSchemaType.QualifiedName;
5859
if (qualifiedName.IsEmpty) { qualifiedName = rootElement.QualifiedName; }
5960
var type = CreateTypeModel(source, rootElement.ElementSchemaType, qualifiedName);

XmlSchemaClassGenerator/TypeModel.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,15 @@ public override CodeTypeDeclaration Generate()
398398
}
399399

400400
if (IsMixed && (BaseClass == null || (BaseClass is ClassModel && !AllBaseClasses.Any(b => b.IsMixed))))
401-
{
402-
var text = new CodeMemberField(typeof(string), "Text");
401+
{
402+
var propName = "Text";
403+
404+
// To not collide with any existing members
405+
for (var propertyIndex = 1; Properties.Any(x => x.Name.Equals(propName, StringComparison.Ordinal)) || propName.Equals(classDeclaration.Name, StringComparison.Ordinal); propertyIndex++)
406+
{
407+
propName = $"Text_{propertyIndex}";
408+
}
409+
var text = new CodeMemberField(typeof(string[]), propName);
403410
// hack to generate automatic property
404411
text.Name += " { get; set; }";
405412
text.Attributes = MemberAttributes.Public;

0 commit comments

Comments
 (0)