From e6b3c844d24fcacd248e605fd99c588629f8eecb Mon Sep 17 00:00:00 2001 From: Philip Gichuhi Date: Tue, 3 Oct 2023 11:26:18 +0300 Subject: [PATCH 1/4] Rename composed type wrapper when class exists in namespace --- .../Refiners/CommonLanguageRefiner.cs | 2 ++ .../Refiners/PhpLanguageRefinerTests.cs | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs index 0e725475c2..6b8f9aee1e 100644 --- a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs +++ b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs @@ -479,6 +479,8 @@ private static CodeTypeBase ConvertComposedTypeToWrapper(CodeClass codeClass, Co if (!supportsInnerClasses) { var @namespace = codeClass.GetImmediateParentOfType(); + if (@namespace.FindChildByName(codeComposedType.Name, false) is not null) + codeComposedType.Name = $"{codeComposedType.Name}Wrapper"; newClass = @namespace.AddClass(new CodeClass { Name = codeComposedType.Name, diff --git a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs index 943a730ab2..9f5f755d91 100644 --- a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs @@ -235,4 +235,31 @@ public async Task ImportsClassForDiscriminatorReturns() await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.PHP }, root); Assert.Equal(2, modelClass.Usings.Count()); } + + [Fact] + public async Task RenamesComposedTypeWrapperWhenSimilarClassExistsInNamespace() + { + var model = new CodeClass + { + Name = "Union", + Kind = CodeClassKind.Model + }; + var parent = new CodeClass + { + Name = "Parent" + }; + root.AddClass(model, parent); + + var composedType = new CodeUnionType { Name = "Union" }; + composedType.AddType(new CodeType { Name = "string" }, new CodeType { Name = "int"}); + + var composedProperty = parent.AddProperty(new CodeProperty + { + Name = "property", + Type = composedType + }).First(); + + await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.PHP }, root); + Assert.NotNull(root.FindChildByName("UnionWrapper", false)); + } } From 28b8860eddf08df6bd6ac5e00c1a0e50cfc88355 Mon Sep 17 00:00:00 2001 From: Philip Gichuhi Date: Tue, 3 Oct 2023 23:31:30 +0300 Subject: [PATCH 2/4] Add CHANGELOG entry --- CHANGELOG.md | 1 + .../Refiners/PhpLanguageRefinerTests.cs | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d726dc5047..3845dc48d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Log a message to stderr if a request is skipped due to missing data. (CLI) [#2210](https://github.com/microsoft/kiota/issues/2210) - Fixes code file generation in typescript [#3419](https://github.com/microsoft/kiota/issues/3419) - Writes fully qualified name of custom types when a type with a similar name exists in the class in PHP. +- Rename composed type wrapper when class already exists in the namespace. [#2964](https://github.com/microsoft/kiota/issues/2964) ## [1.6.1] - 2023-09-11 diff --git a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs index 9f5f755d91..56e2d5a7f2 100644 --- a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs @@ -249,16 +249,16 @@ public async Task RenamesComposedTypeWrapperWhenSimilarClassExistsInNamespace() Name = "Parent" }; root.AddClass(model, parent); - + var composedType = new CodeUnionType { Name = "Union" }; - composedType.AddType(new CodeType { Name = "string" }, new CodeType { Name = "int"}); - + composedType.AddType(new CodeType { Name = "string" }, new CodeType { Name = "int" }); + var composedProperty = parent.AddProperty(new CodeProperty { Name = "property", Type = composedType }).First(); - + await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.PHP }, root); Assert.NotNull(root.FindChildByName("UnionWrapper", false)); } From 87759f07b02392a5f70fd9d28e7408786d173186 Mon Sep 17 00:00:00 2001 From: Philip Gichuhi Date: Wed, 4 Oct 2023 11:06:01 +0300 Subject: [PATCH 3/4] Rename wrapper class only if existing class is not a composed type wrapper --- .../Refiners/CommonLanguageRefiner.cs | 3 +- .../Refiners/PhpLanguageRefinerTests.cs | 32 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs index 6b8f9aee1e..c9b1e4e2f0 100644 --- a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs +++ b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs @@ -479,7 +479,8 @@ private static CodeTypeBase ConvertComposedTypeToWrapper(CodeClass codeClass, Co if (!supportsInnerClasses) { var @namespace = codeClass.GetImmediateParentOfType(); - if (@namespace.FindChildByName(codeComposedType.Name, false) is not null) + var existingClass = @namespace.FindChildByName(codeComposedType.Name, false); + if (existingClass != null && existingClass.OriginalComposedType == null) codeComposedType.Name = $"{codeComposedType.Name}Wrapper"; newClass = @namespace.AddClass(new CodeClass { diff --git a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs index 56e2d5a7f2..ddebaaac77 100644 --- a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs @@ -253,13 +253,41 @@ public async Task RenamesComposedTypeWrapperWhenSimilarClassExistsInNamespace() var composedType = new CodeUnionType { Name = "Union" }; composedType.AddType(new CodeType { Name = "string" }, new CodeType { Name = "int" }); - var composedProperty = parent.AddProperty(new CodeProperty + parent.AddProperty(new CodeProperty { Name = "property", Type = composedType - }).First(); + }); await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.PHP }, root); Assert.NotNull(root.FindChildByName("UnionWrapper", false)); } + + [Fact] + public async Task DoesNotCreateDuplicateComposedTypeWrapperIfOneAlreadyExists() + { + var composedType = new CodeUnionType { Name = "Union" }; + composedType.AddType(new CodeType { Name = "string" }, new CodeType { Name = "int" }); + + var parent = new CodeClass + { + Name = "Parent" + }; + parent.AddProperty(new CodeProperty + { + Name = "property", + Type = composedType + }); + parent.AddProperty(new CodeProperty + { + Name = "property2", + Type = composedType + }); + root.AddClass(parent); + + await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.PHP }, root); + Assert.True(root.FindChildByName("Union", false) is CodeClass unionTypeWrapper && unionTypeWrapper.OriginalComposedType != null); + Assert.True(root.FindChildByName("UnionWrapper", false) is null); + } + } From f39f2e5e95bb92b930879f28cab270c433401224 Mon Sep 17 00:00:00 2001 From: Philip Gichuhi Date: Tue, 3 Oct 2023 11:26:18 +0300 Subject: [PATCH 4/4] Apply code review suggestion --- src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs | 3 +-- tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs index c9b1e4e2f0..ba248fa6c8 100644 --- a/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs +++ b/src/Kiota.Builder/Refiners/CommonLanguageRefiner.cs @@ -479,8 +479,7 @@ private static CodeTypeBase ConvertComposedTypeToWrapper(CodeClass codeClass, Co if (!supportsInnerClasses) { var @namespace = codeClass.GetImmediateParentOfType(); - var existingClass = @namespace.FindChildByName(codeComposedType.Name, false); - if (existingClass != null && existingClass.OriginalComposedType == null) + if (@namespace.FindChildByName(codeComposedType.Name, false) is CodeClass { OriginalComposedType: null }) codeComposedType.Name = $"{codeComposedType.Name}Wrapper"; newClass = @namespace.AddClass(new CodeClass { diff --git a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs index ddebaaac77..d18d1e4990 100644 --- a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs @@ -258,7 +258,6 @@ public async Task RenamesComposedTypeWrapperWhenSimilarClassExistsInNamespace() Name = "property", Type = composedType }); - await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.PHP }, root); Assert.NotNull(root.FindChildByName("UnionWrapper", false)); } @@ -289,5 +288,4 @@ public async Task DoesNotCreateDuplicateComposedTypeWrapperIfOneAlreadyExists() Assert.True(root.FindChildByName("Union", false) is CodeClass unionTypeWrapper && unionTypeWrapper.OriginalComposedType != null); Assert.True(root.FindChildByName("UnionWrapper", false) is null); } - }