From b4f5cd7d6da74d859ccbf8b86cd5598edc32d426 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Wed, 22 Oct 2025 10:39:56 -0700 Subject: [PATCH 1/3] minor: added long path support to prerequisite --- packages/http-client-csharp/CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/http-client-csharp/CONTRIBUTING.md b/packages/http-client-csharp/CONTRIBUTING.md index d32813e3357..53518283b9c 100644 --- a/packages/http-client-csharp/CONTRIBUTING.md +++ b/packages/http-client-csharp/CONTRIBUTING.md @@ -22,6 +22,7 @@ Before you begin, ensure you have the following installed: - [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) - [Git](https://git-scm.com/) - [PowerShell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell) (version 7.0 or higher, for advanced testing and code generation scenarios) +- [Long Path Support](https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=powershell#registry-setting-to-enable-long-paths) (Windows only required to avoid path length limitations during development) ## Getting Started From 1349fcb3ae0cdc1a4c9a6b95f514de50f3e3ffac Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Wed, 28 Jan 2026 16:56:18 -0800 Subject: [PATCH 2/3] rename top to maxCount --- .../src/Providers/RestClientProvider.cs | 9 ++++++ .../ListPageableTests.cs | 28 +++++++++++++++++++ .../src/InputTypes/InputParameter.cs | 12 ++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 2ed3406ed73..3b4bfb5a7d4 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -24,6 +24,8 @@ public class RestClientProvider : TypeProvider private const string RepeatabilityRequestIdHeader = "Repeatability-Request-ID"; private const string RepeatabilityFirstSentHeader = "Repeatability-First-Sent"; private const string MaxPageSizeParameterName = "maxpagesize"; + private const string TopParameterName = "top"; + private const string MaxCountParameterName = "maxCount"; private static readonly Dictionary _knownSpecialHeaderParams = new(StringComparer.OrdinalIgnoreCase) { @@ -942,6 +944,13 @@ internal static List GetMethodParameters( continue; } + // For paging operations, rename "top" parameter to "maxCount" + if (serviceMethod is InputPagingServiceMethod && + string.Equals(inputParam.Name, TopParameterName, StringComparison.OrdinalIgnoreCase)) + { + inputParam.Update(name: MaxCountParameterName); + } + ParameterProvider? parameter = ScmCodeModelGenerator.Instance.TypeFactory.CreateParameter(inputParam)?.ToPublicInputParameter(); if (parameter is null) { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs index b5d7272863c..ceda2f04e23 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs @@ -39,7 +39,35 @@ public void NoNextLinkOrContinuationTokenAsync() var file = writer.Write(); Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content); } + [Test] + public void TopParameterRenamedToMaxCountInPagingOperation() + { + var topParameter = InputFactory.QueryParameter("top", InputPrimitiveType.Int32); + var pagingMetadata = InputFactory.PagingMetadata(["items"], null, null); + var responseModel = InputFactory.Model("Response", properties: [ + InputFactory.Property("items", InputFactory.Array(InputPrimitiveType.String)) + ]); + var response = InputFactory.OperationResponse([200], responseModel); + var operation = InputFactory.Operation("getItems", parameters: [topParameter], responses: [response]); + var pagingMethod = InputFactory.PagingServiceMethod("getItems", operation, pagingMetadata: pagingMetadata); + var client = InputFactory.Client("testClient", methods: [pagingMethod]); + + MockHelpers.LoadMockGenerator(inputModels: () => [responseModel], clients: () => [client]); + var restClientProviders = ScmCodeModelGenerator.Instance.OutputLibrary.TypeProviders + .OfType().ToList(); + + Assert.IsTrue(restClientProviders.Count > 0, "RestClientProvider should be generated"); + + var parameterNames = restClientProviders + .SelectMany(p => p.Methods) + .SelectMany(m => m.Signature.Parameters) + .Select(param => param.Name) + .ToList(); + + Assert.Contains("maxCount", parameterNames, "Should contain 'maxCount' parameter"); + Assert.IsFalse(parameterNames.Contains("top"), "Should not contain 'top' parameter after renaming"); + } [Test] public void NoNextLinkOrContinuationTokenOfT() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs index 458afd617dc..1dfd9e14a5c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs @@ -31,9 +31,17 @@ protected InputParameter( /// Update the instance with given parameters. /// /// The scope of the - public void Update(InputParameterScope scope) + /// The name of the + public void Update(InputParameterScope? scope = null, string? name = null) { - Scope = scope; + if (scope.HasValue) + { + Scope = scope.Value; + } + if (name != null) + { + Name = name; + } } public static InputParameterScope ParseScope(InputType type, string name, string? scope) From 396f51c77aa9ba89aacacb0a7c5a8670e2393636 Mon Sep 17 00:00:00 2001 From: Radhika Gupta Date: Wed, 28 Jan 2026 17:00:47 -0800 Subject: [PATCH 3/3] rename top to maxCount --- .../Providers/CollectionResultDefinitions/ListPageableTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs index ceda2f04e23..c7654a7d662 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs @@ -39,6 +39,7 @@ public void NoNextLinkOrContinuationTokenAsync() var file = writer.Write(); Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content); } + [Test] public void TopParameterRenamedToMaxCountInPagingOperation() { @@ -68,6 +69,7 @@ public void TopParameterRenamedToMaxCountInPagingOperation() Assert.Contains("maxCount", parameterNames, "Should contain 'maxCount' parameter"); Assert.IsFalse(parameterNames.Contains("top"), "Should not contain 'top' parameter after renaming"); } + [Test] public void NoNextLinkOrContinuationTokenOfT() {