From feecfbcfa5484b49ce3b1fece8a8cd7e18cecff6 Mon Sep 17 00:00:00 2001 From: Aayush Pandey Date: Sun, 26 Jul 2026 00:08:29 -0700 Subject: [PATCH] fix: add PHP query parameter imports after renaming --- src/Kiota.Builder/Refiners/PhpRefiner.cs | 10 +++++-- .../Refiners/PhpLanguageRefinerTests.cs | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Kiota.Builder/Refiners/PhpRefiner.cs b/src/Kiota.Builder/Refiners/PhpRefiner.cs index 2ad4005b8c..0c3510c53f 100644 --- a/src/Kiota.Builder/Refiners/PhpRefiner.cs +++ b/src/Kiota.Builder/Refiners/PhpRefiner.cs @@ -139,6 +139,7 @@ public override Task RefineAsync(CodeNamespace generatedCode, CancellationToken CodePropertyKind.QueryParameter, }, static s => s.ToCamelCase(UnderscoreArray)); + AddDefaultImports(generatedCode, queryParameterUsingEvaluators); }, cancellationToken); } private static readonly Dictionary DateTypesReplacements = new(StringComparer.OrdinalIgnoreCase) @@ -212,13 +213,19 @@ public override Task RefineAsync(CodeNamespace generatedCode, CancellationToken new(static x => x is CodeProperty {Type.Name: {}} property && property.Type.Name.Equals("DateTime", StringComparison.OrdinalIgnoreCase), "", "\\DateTime"), new(static x => x is CodeProperty {Type.Name: {}} property && property.Type.Name.Equals("DateTimeOffset", StringComparison.OrdinalIgnoreCase), "", "\\DateTime"), new(static x => x is CodeMethod method && method.IsOfKind(CodeMethodKind.ClientConstructor), AbstractionsNamespaceName, "ApiClientBuilder"), - new(static x => x is CodeProperty property && property.IsOfKind(CodePropertyKind.QueryParameter) && !string.IsNullOrEmpty(property.SerializationName), AbstractionsNamespaceName, "QueryParameter"), new(static x => x is CodeClass codeClass && codeClass.IsOfKind(CodeClassKind.RequestConfiguration), AbstractionsNamespaceName, "RequestOption"), new (static x => x is CodeClass { OriginalComposedType: CodeIntersectionType intersectionType } && intersectionType.Types.Any(static y => !y.IsExternal), $@"{AbstractionsNamespaceName}\Serialization", "ParseNodeHelper"), new (static x => x is CodeMethod method && method.IsOfKind(CodeMethodKind.RequestExecutor, CodeMethodKind.RequestGenerator) && method.Parameters.Any(static y => y.IsOfKind(CodeParameterKind.RequestBody) && y.Type.Name.Equals(MultipartBodyClassName, StringComparison.OrdinalIgnoreCase)), AbstractionsNamespaceName, MultipartBodyClassName) }; + private static readonly AdditionalUsingEvaluator[] queryParameterUsingEvaluators = { + new(static x => x is CodeProperty property && + property.IsOfKind(CodePropertyKind.QueryParameter) && + !string.IsNullOrEmpty(property.SerializationName), + AbstractionsNamespaceName, + "QueryParameter"), + }; private const string MultipartBodyClassName = "MultiPartBody"; @@ -473,4 +480,3 @@ private static void AddQueryParameterFactoryMethod(CodeElement codeElement) CrawlTree(codeElement, AddQueryParameterFactoryMethod); } } - diff --git a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs index 66067b1f7a..6d09cb4c23 100644 --- a/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs +++ b/tests/Kiota.Builder.Tests/Refiners/PhpLanguageRefinerTests.cs @@ -111,6 +111,33 @@ public async Task AddsDefaultImportsAsync() Assert.NotEmpty(model.StartBlock.Usings); } + [Fact] + public async Task AddsQueryParameterImportAfterRenamingAsync() + { + var queryParameters = root.AddClass(new CodeClass + { + Name = "ThingsRequestBuilderGetQueryParameters", + Kind = CodeClassKind.QueryParameters, + }).First(); + var property = queryParameters.AddProperty(new CodeProperty + { + Name = "category_id", + Kind = CodePropertyKind.QueryParameter, + Type = new CodeType { Name = "string" }, + }).First(); + + await ILanguageRefiner.RefineAsync( + new GenerationConfiguration { Language = GenerationLanguage.PHP }, + root, + cancellationToken: TestContext.Current.CancellationToken); + + Assert.Equal("categoryId", property.Name); + Assert.Equal("category_id", property.SerializationName); + Assert.Contains(queryParameters.StartBlock.Usings, static x => + x.Name.Equals("QueryParameter", System.StringComparison.Ordinal) && + x.Declaration?.Name.Equals(@"Microsoft\Kiota\Abstractions", System.StringComparison.Ordinal) is true); + } + [Fact] public async Task AddsExceptionInheritanceOnErrorClassesAsync() {