From 9d32425d3271e4f6e5b6f27290da4a050a90e34c Mon Sep 17 00:00:00 2001 From: Alexander Titov Date: Fri, 1 May 2020 11:26:22 +0300 Subject: [PATCH] Remove dupplicate interface members in derived interfaces This commit ensures that all interface properties with the same name and type as in base interfaces are removed as duplicates. --- XmlSchemaClassGenerator.Tests/XmlTests.cs | 80 +++++++++++++++++++++++ XmlSchemaClassGenerator/ModelBuilder.cs | 20 ++++++ 2 files changed, 100 insertions(+) diff --git a/XmlSchemaClassGenerator.Tests/XmlTests.cs b/XmlSchemaClassGenerator.Tests/XmlTests.cs index dba8010d..bc0c0888 100644 --- a/XmlSchemaClassGenerator.Tests/XmlTests.cs +++ b/XmlSchemaClassGenerator.Tests/XmlTests.cs @@ -1502,5 +1502,85 @@ public void RenameInterfacePropertyInDerivedClassTest() Assert.Single(level3Interface.GetProperties()); Assert.Equal("ClassItemBaseProperty", level3Interface.GetProperties().First().Name); } + + [Fact] + public void DoNotGenerateSamePropertiesInDerivedInterfacesClassTest() + { + const string xsd = @" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "; + + var generator = new Generator + { + NamespaceProvider = new NamespaceProvider + { + GenerateNamespace = key => "Test" + }, + GenerateInterfaces = true, + AssemblyVisible = true + }; + var contents = ConvertXml(nameof(DoNotGenerateSamePropertiesInDerivedInterfacesClassTest), xsd, generator); + var content = Assert.Single(contents); + + var assembly = Compiler.Compile(nameof(DoNotGenerateSamePropertiesInDerivedInterfacesClassTest), content); + + var listType = assembly.GetType("Test.ParentClass"); + Assert.NotNull(listType); + + var listTypePropertyInfo = listType.GetProperties().FirstOrDefault(p => p.Name == "InterfaceProperty"); + Assert.NotNull(listTypePropertyInfo); + + var level1Interface = assembly.GetType("Test.ILevel1"); + Assert.NotNull(level1Interface); + Assert.Empty(level1Interface.GetProperties()); + + var level2Interface = assembly.GetType("Test.ILevel2"); + Assert.NotNull(level2Interface); + Assert.Empty(level2Interface.GetProperties()); + + var level3Interface = assembly.GetType("Test.ILevel3"); + Assert.NotNull(level3Interface); + var level3InterfacePropertyInfo = level3Interface.GetProperties().FirstOrDefault(p => p.Name == "InterfaceProperty"); + Assert.NotNull(level3InterfacePropertyInfo); + + } } } diff --git a/XmlSchemaClassGenerator/ModelBuilder.cs b/XmlSchemaClassGenerator/ModelBuilder.cs index 4d12b569..c281f361 100644 --- a/XmlSchemaClassGenerator/ModelBuilder.cs +++ b/XmlSchemaClassGenerator/ModelBuilder.cs @@ -66,6 +66,26 @@ public ModelBuilder(GeneratorConfiguration configuration, XmlSchemaSet set) if (configuration.GenerateInterfaces) { RenameInterfacePropertiesIfRenamedInDerivedClasses(); + RemoveDuplicateInterfaceProperties(); + } + } + + private void RemoveDuplicateInterfaceProperties() + { + foreach (var interfaceModel in Types.Values.OfType()) + { + var parentProperties = interfaceModel.Properties.ToList(); + foreach (var baseInterfaceType in interfaceModel.AllDerivedReferenceTypes().OfType()) + { + foreach (var parentProperty in parentProperties) + { + var baseProperties = baseInterfaceType.Properties.ToList(); + foreach (var baseProperty in baseProperties.Where(baseProperty => parentProperty.Name == baseProperty.Name && parentProperty.Type.Name == baseProperty.Type.Name)) + { + baseInterfaceType.Properties.Remove(baseProperty); + } + } + } } }