From 62f2a61178b4118c40304473fb1ca65e4fc14966 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 17 Sep 2026 17:34:09 +0000 Subject: [PATCH 1/9] Initial plan From d37edbaa33349d6647b6ab6b3d5488ddc87fe711 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:40:21 +0000 Subject: [PATCH 2/9] test(csharp): cover deterministic Response-to-Result model names Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../EnumProviders/EnumProviderTests.cs | 2 + .../ModelProviders/ModelProviderTests.cs | 116 ++++++++++++++++++ .../WidgetResult.cs | 9 ++ .../CustomizedModels.cs | 19 +++ .../ExistingModels.cs | 14 +++ 5 files changed, 160 insertions(+) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsCustomizationCollision/WidgetResult.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomName/CustomizedModels.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesExistingName/ExistingModels.cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/EnumProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/EnumProviderTests.cs index b319b9c71d3..f0f3339e5dc 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/EnumProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/EnumProviders/EnumProviderTests.cs @@ -97,6 +97,8 @@ public void BuildEnumType_ValidateStringBasedFixedEnum() [TestCase(false, "IPV4AddressIPV6", false, "IPV4AddressIPV6")] [TestCase(true, "OsloIpsumOsmosisDbz", false, "OsloIpsumOsmosisDbz")] [TestCase(false, "IpKind", true, "IpKind")] + [TestCase(false, "WidgetResponse", false, "WidgetResponse")] + [TestCase(true, "IpResponse", false, "IPResponse")] public void BuildEnumType_NormalizesTypeAcronymCasing( bool isExtensible, string inputName, diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs index ed9345d2f60..01433f7cf40 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs @@ -130,6 +130,122 @@ public void TestBuildName_NormalizesAcronymCasing(string inputName, bool isExact Assert.AreEqual(expectedName, modelProvider.Name); } + [TestCase("WidgetResponse", false, "WidgetResult")] + [TestCase("Response", false, "Result")] + [TestCase("widget_response", false, "WidgetResult")] + [TestCase("IpResponse", false, "IPResult")] + [TestCase("WidgetResponseResponse", false, "WidgetResponseResult")] + [TestCase("WidgetResponse", true, "WidgetResponse")] + [TestCase("IpResponse", true, "IpResponse")] + [TestCase("WidgetResult", false, "WidgetResult")] + [TestCase("ResponseWidget", false, "ResponseWidget")] + [TestCase("WidgetResponses", false, "WidgetResponses")] + [TestCase("Widgetresponse", false, "Widgetresponse")] + public void TestBuildName_ResponseSuffix(string inputName, bool isExactName, string expectedName) + { + var inputModel = InputFactory.Model( + inputName, + isExactName: isExactName, + properties: [InputFactory.Property("serviceResponse", InputPrimitiveType.String)]); + var model = new ModelProvider(inputModel); + + Assert.AreEqual(expectedName, model.Name); + Assert.AreEqual($"{expectedName}.cs", Path.GetFileName(model.RelativeFilePath)); + Assert.AreEqual("ServiceResponse", model.Properties[0].Name); + } + + [TestCase("WidgetResponse", "WidgetResponse", false, false)] + [TestCase("WidgetResponse", "WidgetResponse", true, false)] + [TestCase("WidgetResponse", "WidgetResponse", false, true)] + [TestCase("WidgetResponse", "WidgetResponse", true, true)] + [TestCase("IpResponse", "IPResponse", false, false)] + [TestCase("IpResponse", "IPResponse", true, false)] + [TestCase("IpResponse", "IPResponse", false, true)] + [TestCase("IpResponse", "IPResponse", true, true)] + [TestCase("DbResponse", "DbResponse", false, false)] + [TestCase("DbResponse", "DbResponse", true, false)] + [TestCase("DbResponse", "DbResponse", false, true)] + [TestCase("DbResponse", "DbResponse", true, true)] + public async Task TestBuildName_ResponseSuffixPreservesExistingName( + string inputName, string expectedName, bool lastContract, bool updateNamespace) + { + var inputModel = InputFactory.Model( + inputName, @namespace: updateNamespace ? "Sample" : "Sample.Models"); + var compilation = await Helpers.GetCompilationFromDirectoryAsync(); + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [inputModel], + compilation: lastContract ? null : () => Task.FromResult(compilation), + lastContractCompilation: lastContract ? () => Task.FromResult(compilation) : null); + var model = CodeModelGenerator.Instance.TypeFactory.CreateModel(inputModel)!; + + if (updateNamespace) + { + Assert.That(model.Name, Does.EndWith("Result")); + model.Update(@namespace: "Sample.Models"); + } + + Assert.AreEqual(expectedName, model.Name); + Assert.IsNotNull(lastContract ? model.LastContractView : model.CustomCodeView); + } + + [TestCase("WidgetResponse", "CustomizedWidget")] + [TestCase("IpResponse", "CustomizedIP")] + [TestCase("GadgetResponse", "CustomizedGadget")] + public async Task TestBuildName_ResponseSuffixPreservesCustomName(string inputName, string expectedName) + { + var inputModel = InputFactory.Model(inputName); + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [inputModel], + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + var model = CodeModelGenerator.Instance.TypeFactory.CreateModel(inputModel)!; + + Assert.AreEqual(expectedName, model.Name); + Assert.IsNotNull(model.CustomCodeView); + } + + [TestCase(false, false)] + [TestCase(false, true)] + [TestCase(true, false)] + [TestCase(true, true)] + public void TestBuildName_ResponseSuffixAvoidsModelCollision(bool reverseOrder, bool differentNamespace) + { + var response = InputFactory.Model("WidgetResponse"); + var result = InputFactory.Model("WidgetResult", @namespace: differentNamespace ? "Other" : "Sample.Models"); + InputModelType[] models = reverseOrder ? [result, response] : [response, result]; + MockHelpers.LoadMockGenerator(inputModelTypes: models); + + var providers = models.Select(m => CodeModelGenerator.Instance.TypeFactory.CreateModel(m)!).ToArray(); + + CollectionAssert.AreEquivalent(new[] { "WidgetResponse", "WidgetResult" }, providers.Select(p => p.Name)); + } + + [TestCase(false)] + [TestCase(true)] + public void TestBuildName_ResponseSuffixAvoidsEnumCollision(bool isExtensible) + { + var response = InputFactory.Model("IpResponse"); + var result = InputFactory.StringEnum("IpResult", [("Value", "value")], isExtensible: isExtensible); + MockHelpers.LoadMockGenerator(inputModelTypes: [response], inputEnumTypes: [result]); + + Assert.AreEqual("IPResponse", CodeModelGenerator.Instance.TypeFactory.CreateModel(response)!.Name); + Assert.AreEqual("IPResult", CodeModelGenerator.Instance.TypeFactory.CreateEnum(result)!.Name); + } + + [TestCase("OtherModel")] + [TestCase("WidgetResult")] + public async Task TestBuildName_ResponseSuffixAvoidsCustomizationCollision(string otherName) + { + var response = InputFactory.Model("WidgetResponse"); + var other = InputFactory.Model(otherName); + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [response, other], + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + Assert.AreEqual("WidgetResponse", CodeModelGenerator.Instance.TypeFactory.CreateModel(response)!.Name); + Assert.AreEqual("WidgetResult", CodeModelGenerator.Instance.TypeFactory.CreateModel(other)!.Name); + } + [Test] public async Task TestBuildName_BackCompatTakesPrecedenceOverAcronymNormalization() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsCustomizationCollision/WidgetResult.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsCustomizationCollision/WidgetResult.cs new file mode 100644 index 00000000000..db82a5a75a5 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsCustomizationCollision/WidgetResult.cs @@ -0,0 +1,9 @@ +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + [CodeGenType("OtherModel")] + public partial class WidgetResult + { + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomName/CustomizedModels.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomName/CustomizedModels.cs new file mode 100644 index 00000000000..9f06d5460bb --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomName/CustomizedModels.cs @@ -0,0 +1,19 @@ +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + [CodeGenType("WidgetResponse")] + public partial class CustomizedWidget + { + } + + [CodeGenType("IPResponse")] + public partial class CustomizedIP + { + } + + [CodeGenType("GadgetResult")] + public partial class CustomizedGadget + { + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesExistingName/ExistingModels.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesExistingName/ExistingModels.cs new file mode 100644 index 00000000000..fc09d2295c4 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesExistingName/ExistingModels.cs @@ -0,0 +1,14 @@ +namespace Sample.Models +{ + public partial class WidgetResponse + { + } + + public partial class IPResponse + { + } + + public partial class DbResponse + { + } +} From 4af1e99de679962da08b9c2bbf0170b681711922 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:53:26 +0000 Subject: [PATCH 3/9] feat(csharp): normalize Response model suffixes to Result Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../ClientBodyDependencyReferenceMapTests.cs | 10 +- .../src/Providers/TypeProvider.cs | 106 +++++++++++++++++- .../ModelProviders/ModelProviderTests.cs | 29 +++-- ...hContinuationTokenAsyncCollectionResult.cs | 4 +- ...ntinuationTokenAsyncCollectionResultOfT.cs | 6 +- ...etWithContinuationTokenCollectionResult.cs | 4 +- ...ithContinuationTokenCollectionResultOfT.cs | 6 +- ...nHeaderResponseAsyncCollectionResultOfT.cs | 2 +- ...nTokenHeaderResponseCollectionResultOfT.cs | 2 +- ...entGetWithNextLinkAsyncCollectionResult.cs | 4 +- ...GetWithNextLinkAsyncCollectionResultOfT.cs | 6 +- ...ecClientGetWithNextLinkCollectionResult.cs | 4 +- ...lientGetWithNextLinkCollectionResultOfT.cs | 6 +- ...WithStringNextLinkAsyncCollectionResult.cs | 4 +- ...hStringNextLinkAsyncCollectionResultOfT.cs | 6 +- ...ntGetWithStringNextLinkCollectionResult.cs | 4 +- ...etWithStringNextLinkCollectionResultOfT.cs | 6 +- .../Sample-TypeSpec/src/Generated/Metrics.cs | 8 +- ....cs => GetNotebookResult.Serialization.cs} | 52 ++++----- ...tebookResponse.cs => GetNotebookResult.cs} | 12 +- ...> GetWidgetMetricsResult.Serialization.cs} | 52 ++++----- ...sResponse.cs => GetWidgetMetricsResult.cs} | 12 +- ...okenHeaderResponseResult.Serialization.cs} | 52 ++++----- ...hContinuationTokenHeaderResponseResult.cs} | 12 +- ...hContinuationTokenResult.Serialization.cs} | 52 ++++----- ....cs => ListWithContinuationTokenResult.cs} | 12 +- ...> ListWithNextLinkResult.Serialization.cs} | 52 ++++----- ...kResponse.cs => ListWithNextLinkResult.cs} | 12 +- ...WithStringNextLinkResult.Serialization.cs} | 52 ++++----- ...nse.cs => ListWithStringNextLinkResult.cs} | 12 +- ...urnsAnonymousModelResult.Serialization.cs} | 48 ++++---- ...onse.cs => ReturnsAnonymousModelResult.cs} | 12 +- .../Generated/Models/SampleTypeSpecContext.cs | 14 +-- .../src/Generated/Notebooks.cs | 8 +- .../src/Generated/SampleTypeSpecClient.cs | 8 +- .../Generated/SampleTypeSpecModelFactory.cs | 24 ++-- .../Models/GetResponse.Serialization.cs | 36 ------ .../Models/GetResult.Serialization.cs | 36 ++++++ .../Models/{GetResponse.cs => GetResult.cs} | 2 +- .../src/Generated/Models/_TypeUnionContext.cs | 2 +- .../type/union/src/Generated/StringsOnly.cs | 4 +- .../src/Generated/TypeUnionModelFactory.cs | 2 +- 42 files changed, 453 insertions(+), 344 deletions(-) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{GetNotebookResponse.Serialization.cs => GetNotebookResult.Serialization.cs} (68%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{GetNotebookResponse.cs => GetNotebookResult.cs} (77%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{GetWidgetMetricsResponse.Serialization.cs => GetWidgetMetricsResult.Serialization.cs} (67%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{GetWidgetMetricsResponse.cs => GetWidgetMetricsResult.cs} (76%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithContinuationTokenHeaderResponseResponse.Serialization.cs => ListWithContinuationTokenHeaderResponseResult.Serialization.cs} (72%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithContinuationTokenHeaderResponseResponse.cs => ListWithContinuationTokenHeaderResponseResult.cs} (74%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithContinuationTokenResponse.Serialization.cs => ListWithContinuationTokenResult.Serialization.cs} (69%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithContinuationTokenResponse.cs => ListWithContinuationTokenResult.cs} (72%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithNextLinkResponse.Serialization.cs => ListWithNextLinkResult.Serialization.cs} (69%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithNextLinkResponse.cs => ListWithNextLinkResult.cs} (74%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithStringNextLinkResponse.Serialization.cs => ListWithStringNextLinkResult.Serialization.cs} (69%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ListWithStringNextLinkResponse.cs => ListWithStringNextLinkResult.cs} (73%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ReturnsAnonymousModelResponse.Serialization.cs => ReturnsAnonymousModelResult.Serialization.cs} (65%) rename packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/{ReturnsAnonymousModelResponse.cs => ReturnsAnonymousModelResult.cs} (67%) delete mode 100644 packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.Serialization.cs create mode 100644 packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.Serialization.cs rename packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/{GetResponse.cs => GetResult.cs} (77%) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/ReferenceMap/ClientBodyDependencyReferenceMapTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/ReferenceMap/ClientBodyDependencyReferenceMapTests.cs index 8b3d23beffb..2eac575dd1f 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/ReferenceMap/ClientBodyDependencyReferenceMapTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/ReferenceMap/ClientBodyDependencyReferenceMapTests.cs @@ -177,7 +177,7 @@ await GenerateAndAssertFiles( clients: [client], customFiles: [], expectedFiles: [], - publicModelNames: ["MetadataOnlyResponse"]); + publicModelNames: ["MetadataOnlyResult"]); } [Test] @@ -227,13 +227,13 @@ await GenerateAndAssertFiles( clients: [client], customFiles: [], expectedFiles: [ - Path.Combine("src", "Generated", "Models", "MetadataOnlyResponse.cs"), - Path.Combine("src", "Generated", "Models", "MetadataOnlyResponse.Serialization.cs") + Path.Combine("src", "Generated", "Models", "MetadataOnlyResult.cs"), + Path.Combine("src", "Generated", "Models", "MetadataOnlyResult.Serialization.cs") ], - internalModelNames: ["MetadataOnlyResponse"], + internalModelNames: ["MetadataOnlyResult"], configureGenerator: () => { - var provider = CodeModelGenerator.Instance.OutputLibrary.TypeProviders.Single(provider => provider.Name == "MetadataOnlyResponse"); + var provider = CodeModelGenerator.Instance.OutputLibrary.TypeProviders.Single(provider => provider.Name == "MetadataOnlyResult"); CodeModelGenerator.Instance.AddTypeToKeep(provider); }); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs index 564e3bbd43f..4bf30ab77b2 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs @@ -45,10 +45,36 @@ protected TypeProvider() : this(null) } private protected virtual TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) - => CodeModelGenerator.Instance.SourceInputModel.FindForTypeInCurrentCompilation( - generatedTypeNamespace ?? BuildNamespace(), - generatedTypeName ?? BuildName(), + { + var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); + var typeName = generatedTypeName ?? BuildName(); + var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + var customCodeView = sourceInputModel.FindForTypeInCurrentCompilation( + typeNamespace, + typeName, _declaringTypeName.Value); + if (customCodeView is not null || this is not ModelProvider || _inputType is null || _inputType.IsExactName) + { + return customCodeView; + } + + var originalName = _inputType.Name.ToIdentifierName(); + if (!originalName.EndsWith("Response", StringComparison.Ordinal) || + originalName == typeName || + typeName != NormalizeTypeName(originalName)) + { + return null; + } + + return sourceInputModel.FindForTypeInCurrentCompilation( + typeNamespace, + originalName, + _declaringTypeName.Value) ?? + sourceInputModel.FindForTypeInCurrentCompilation( + typeNamespace, + originalName.NormalizeCSharpAcronyms(), + _declaringTypeName.Value); + } private protected virtual TypeProvider? BuildLastContractView(string? generatedTypeName = null, string? generatedTypeNamespace = null) { @@ -64,7 +90,7 @@ protected TypeProvider() : this(null) } var originalName = _inputType.Name.ToIdentifierName(); - var normalizedOriginalName = originalName.NormalizeCSharpAcronyms(); + var normalizedOriginalName = NormalizeTypeName(originalName); if (normalizedOriginalName == originalName || typeName != normalizedOriginalName) { return null; @@ -73,7 +99,11 @@ protected TypeProvider() : this(null) return CodeModelGenerator.Instance.SourceInputModel.FindForTypeInLastContract( typeNamespace, originalName, - _declaringTypeName.Value); + _declaringTypeName.Value) ?? + CodeModelGenerator.Instance.SourceInputModel.FindForTypeInLastContract( + typeNamespace, + originalName.NormalizeCSharpAcronyms(), + _declaringTypeName.Value); } private static string? GetDeclaringTypeName(TypeProvider? declaringTypeProvider) @@ -748,7 +778,7 @@ protected string NormalizeTypeNameForNewContract(string name) return name; } - var normalizedName = name.NormalizeCSharpAcronyms(); + var normalizedName = NormalizeTypeName(name); if (normalizedName == name) { return name; @@ -761,6 +791,70 @@ protected string NormalizeTypeNameForNewContract(string name) return lastContractType is null ? normalizedName : name; } + private string NormalizeTypeName(string name) + { + var normalizedName = name.NormalizeCSharpAcronyms(); + const string responseSuffix = "Response"; + if (this is not ModelProvider || !normalizedName.EndsWith(responseSuffix, StringComparison.Ordinal)) + { + return normalizedName; + } + + var typeNamespace = BuildNamespace(); + var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + if (sourceInputModel.FindForTypeInCurrentCompilation(typeNamespace, normalizedName, _declaringTypeName.Value) is not null || + sourceInputModel.FindForTypeInLastContract(typeNamespace, normalizedName, _declaringTypeName.Value) is not null) + { + return normalizedName; + } + + var resultName = $"{normalizedName[..^responseSuffix.Length]}Result"; + var inputNamespace = CodeModelGenerator.Instance.InputLibrary.InputNamespace; + // Model and enum files share a flat output directory, even across namespaces. + return inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace)) || + inputNamespace.Enums.Any(@enum => HasConflictingName(@enum, @enum.Namespace)) || + inputNamespace.Clients.Any(HasConflictingClientName) + ? normalizedName + : resultName; + + bool HasConflictingName(InputType inputType, string inputTypeNamespace) + { + if (inputType == _inputType) + { + return false; + } + + var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); + var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); + var customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, otherName); + if (customType is null && !inputType.IsExactName) + { + var normalizedOtherName = otherName.NormalizeCSharpAcronyms(); + customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, normalizedOtherName); + if (sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) + { + otherName = normalizedOtherName; + } + } + + return string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase) || + string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase); + } + + bool HasConflictingClientName(InputClient client) + { + var clientNamespace = string.IsNullOrEmpty(client.Namespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(client.Namespace); + var clientName = client.IsExactName ? client.Name : client.Name.ToIdentifierName(); + var customType = sourceInputModel.FindForTypeInCurrentCompilation(clientNamespace, clientName); + return (customType?.Type.Namespace ?? clientNamespace) == typeNamespace && + (customType?.Name ?? clientName) == resultName; + } + } + /// /// Resets only the cached methods so they are rebuilt on next access. /// Use this instead of when you need to force a method diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs index 01433f7cf40..2bf5ec5402e 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs @@ -204,20 +204,35 @@ await MockHelpers.LoadMockGeneratorAsync( Assert.IsNotNull(model.CustomCodeView); } - [TestCase(false, false)] - [TestCase(false, true)] - [TestCase(true, false)] - [TestCase(true, true)] - public void TestBuildName_ResponseSuffixAvoidsModelCollision(bool reverseOrder, bool differentNamespace) + [TestCase(false, false, "WidgetResult", false)] + [TestCase(false, true, "WidgetResult", false)] + [TestCase(true, false, "WidgetResult", false)] + [TestCase(true, true, "WidgetResult", false)] + [TestCase(false, false, "widgetResult", true)] + public void TestBuildName_ResponseSuffixAvoidsModelCollision( + bool reverseOrder, bool differentNamespace, string resultName, bool isExactName) { var response = InputFactory.Model("WidgetResponse"); - var result = InputFactory.Model("WidgetResult", @namespace: differentNamespace ? "Other" : "Sample.Models"); + var result = InputFactory.Model( + resultName, @namespace: differentNamespace ? "Other" : "Sample.Models", isExactName: isExactName); InputModelType[] models = reverseOrder ? [result, response] : [response, result]; MockHelpers.LoadMockGenerator(inputModelTypes: models); var providers = models.Select(m => CodeModelGenerator.Instance.TypeFactory.CreateModel(m)!).ToArray(); - CollectionAssert.AreEquivalent(new[] { "WidgetResponse", "WidgetResult" }, providers.Select(p => p.Name)); + CollectionAssert.AreEquivalent(new[] { "WidgetResponse", resultName }, providers.Select(p => p.Name)); + } + + [TestCase("Sample.Models", "WidgetResponse")] + [TestCase("Other", "WidgetResult")] + public void TestBuildName_ResponseSuffixAvoidsClientCollision(string clientNamespace, string expectedName) + { + var response = InputFactory.Model("WidgetResponse"); + var client = InputFactory.Client("WidgetResult"); + client.Update(@namespace: clientNamespace); + MockHelpers.LoadMockGenerator(inputModelTypes: [response], inputClients: [client]); + + Assert.AreEqual(expectedName, CodeModelGenerator.Instance.TypeFactory.CreateModel(response)!.Name); } [TestCase(false)] diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResult.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResult.cs index 850e32848fd..5f90a26974c 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResult.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResult.cs @@ -41,7 +41,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() ClientResult result = await GetNextResponseAsync(message).ConfigureAwait(false); yield return result; - nextToken = ((ListWithContinuationTokenResponse)result).NextToken; + nextToken = ((ListWithContinuationTokenResult)result).NextToken; if (string.IsNullOrEmpty(nextToken)) { yield break; @@ -55,7 +55,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithContinuationTokenResponse)page).NextToken; + string nextPage = ((ListWithContinuationTokenResult)page).NextToken; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResultOfT.cs index 9c3d3170ab2..8d9683bab41 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenAsyncCollectionResultOfT.cs @@ -41,7 +41,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() ClientResult result = await GetNextResponseAsync(message).ConfigureAwait(false); yield return result; - nextToken = ((ListWithContinuationTokenResponse)result).NextToken; + nextToken = ((ListWithContinuationTokenResult)result).NextToken; if (string.IsNullOrEmpty(nextToken)) { yield break; @@ -55,7 +55,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithContinuationTokenResponse)page).NextToken; + string nextPage = ((ListWithContinuationTokenResult)page).NextToken; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); @@ -71,7 +71,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override async IAsyncEnumerable GetValuesFromPageAsync(ClientResult page) { - foreach (Thing item in ((ListWithContinuationTokenResponse)page).Things) + foreach (Thing item in ((ListWithContinuationTokenResult)page).Things) { yield return item; await Task.Yield(); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResult.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResult.cs index b1cfc1098f8..da17822ee6c 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResult.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResult.cs @@ -40,7 +40,7 @@ public override IEnumerable GetRawPages() ClientResult result = GetNextResponse(message); yield return result; - nextToken = ((ListWithContinuationTokenResponse)result).NextToken; + nextToken = ((ListWithContinuationTokenResult)result).NextToken; if (string.IsNullOrEmpty(nextToken)) { yield break; @@ -54,7 +54,7 @@ public override IEnumerable GetRawPages() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithContinuationTokenResponse)page).NextToken; + string nextPage = ((ListWithContinuationTokenResult)page).NextToken; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResultOfT.cs index 69acd134fc1..ab20b9a9354 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenCollectionResultOfT.cs @@ -40,7 +40,7 @@ public override IEnumerable GetRawPages() ClientResult result = GetNextResponse(message); yield return result; - nextToken = ((ListWithContinuationTokenResponse)result).NextToken; + nextToken = ((ListWithContinuationTokenResult)result).NextToken; if (string.IsNullOrEmpty(nextToken)) { yield break; @@ -54,7 +54,7 @@ public override IEnumerable GetRawPages() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithContinuationTokenResponse)page).NextToken; + string nextPage = ((ListWithContinuationTokenResult)page).NextToken; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); @@ -70,7 +70,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override IEnumerable GetValuesFromPage(ClientResult page) { - return ((ListWithContinuationTokenResponse)page).Things; + return ((ListWithContinuationTokenResult)page).Things; } /// Sends the request in the pipeline message and returns the response. diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseAsyncCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseAsyncCollectionResultOfT.cs index c4a863befcb..e234c85759e 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseAsyncCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseAsyncCollectionResultOfT.cs @@ -73,7 +73,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override async IAsyncEnumerable GetValuesFromPageAsync(ClientResult page) { - foreach (Thing item in ((ListWithContinuationTokenHeaderResponseResponse)page).Things) + foreach (Thing item in ((ListWithContinuationTokenHeaderResponseResult)page).Things) { yield return item; await Task.Yield(); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseCollectionResultOfT.cs index af88f217ecb..bc0cbbc2e7d 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithContinuationTokenHeaderResponseCollectionResultOfT.cs @@ -72,7 +72,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override IEnumerable GetValuesFromPage(ClientResult page) { - return ((ListWithContinuationTokenHeaderResponseResponse)page).Things; + return ((ListWithContinuationTokenHeaderResponseResult)page).Things; } /// Sends the request in the pipeline message and returns the response. diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResult.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResult.cs index fcbb4f3315d..b1a35c06dc3 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResult.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResult.cs @@ -38,7 +38,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() ClientResult result = await GetNextResponseAsync(message).ConfigureAwait(false); yield return result; - nextPageUri = ((ListWithNextLinkResponse)result).Next; + nextPageUri = ((ListWithNextLinkResult)result).Next; if (nextPageUri == null) { yield break; @@ -52,7 +52,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - Uri nextPage = ((ListWithNextLinkResponse)page).Next; + Uri nextPage = ((ListWithNextLinkResult)page).Next; if (nextPage != null) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage.IsAbsoluteUri ? nextPage.AbsoluteUri : nextPage.OriginalString)); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResultOfT.cs index 366d3aac566..77f0df84b9f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkAsyncCollectionResultOfT.cs @@ -38,7 +38,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() ClientResult result = await GetNextResponseAsync(message).ConfigureAwait(false); yield return result; - nextPageUri = ((ListWithNextLinkResponse)result).Next; + nextPageUri = ((ListWithNextLinkResult)result).Next; if (nextPageUri == null) { yield break; @@ -52,7 +52,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - Uri nextPage = ((ListWithNextLinkResponse)page).Next; + Uri nextPage = ((ListWithNextLinkResult)page).Next; if (nextPage != null) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage.IsAbsoluteUri ? nextPage.AbsoluteUri : nextPage.OriginalString)); @@ -68,7 +68,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override async IAsyncEnumerable GetValuesFromPageAsync(ClientResult page) { - foreach (Thing item in ((ListWithNextLinkResponse)page).Things) + foreach (Thing item in ((ListWithNextLinkResult)page).Things) { yield return item; await Task.Yield(); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResult.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResult.cs index a4f3f2aca9e..e9b516f5892 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResult.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResult.cs @@ -37,7 +37,7 @@ public override IEnumerable GetRawPages() ClientResult result = GetNextResponse(message); yield return result; - nextPageUri = ((ListWithNextLinkResponse)result).Next; + nextPageUri = ((ListWithNextLinkResult)result).Next; if (nextPageUri == null) { yield break; @@ -51,7 +51,7 @@ public override IEnumerable GetRawPages() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - Uri nextPage = ((ListWithNextLinkResponse)page).Next; + Uri nextPage = ((ListWithNextLinkResult)page).Next; if (nextPage != null) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage.IsAbsoluteUri ? nextPage.AbsoluteUri : nextPage.OriginalString)); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResultOfT.cs index 2384f493d80..651d9e3487f 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithNextLinkCollectionResultOfT.cs @@ -37,7 +37,7 @@ public override IEnumerable GetRawPages() ClientResult result = GetNextResponse(message); yield return result; - nextPageUri = ((ListWithNextLinkResponse)result).Next; + nextPageUri = ((ListWithNextLinkResult)result).Next; if (nextPageUri == null) { yield break; @@ -51,7 +51,7 @@ public override IEnumerable GetRawPages() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - Uri nextPage = ((ListWithNextLinkResponse)page).Next; + Uri nextPage = ((ListWithNextLinkResult)page).Next; if (nextPage != null) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage.IsAbsoluteUri ? nextPage.AbsoluteUri : nextPage.OriginalString)); @@ -67,7 +67,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override IEnumerable GetValuesFromPage(ClientResult page) { - return ((ListWithNextLinkResponse)page).Things; + return ((ListWithNextLinkResult)page).Things; } /// Sends the request in the pipeline message and returns the response. diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResult.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResult.cs index 754698b6891..f41c7b3d264 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResult.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResult.cs @@ -38,7 +38,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() ClientResult result = await GetNextResponseAsync(message).ConfigureAwait(false); yield return result; - string nextPageString = ((ListWithStringNextLinkResponse)result).Next; + string nextPageString = ((ListWithStringNextLinkResult)result).Next; if (string.IsNullOrEmpty(nextPageString)) { yield break; @@ -53,7 +53,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithStringNextLinkResponse)page).Next; + string nextPage = ((ListWithStringNextLinkResult)page).Next; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResultOfT.cs index b777d15a10a..7f48abdf7f7 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkAsyncCollectionResultOfT.cs @@ -38,7 +38,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() ClientResult result = await GetNextResponseAsync(message).ConfigureAwait(false); yield return result; - string nextPageString = ((ListWithStringNextLinkResponse)result).Next; + string nextPageString = ((ListWithStringNextLinkResult)result).Next; if (string.IsNullOrEmpty(nextPageString)) { yield break; @@ -53,7 +53,7 @@ public override async IAsyncEnumerable GetRawPagesAsync() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithStringNextLinkResponse)page).Next; + string nextPage = ((ListWithStringNextLinkResult)page).Next; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); @@ -69,7 +69,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override async IAsyncEnumerable GetValuesFromPageAsync(ClientResult page) { - foreach (Thing item in ((ListWithStringNextLinkResponse)page).Things) + foreach (Thing item in ((ListWithStringNextLinkResult)page).Things) { yield return item; await Task.Yield(); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResult.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResult.cs index 5402f8cac11..1da5ae62fa4 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResult.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResult.cs @@ -37,7 +37,7 @@ public override IEnumerable GetRawPages() ClientResult result = GetNextResponse(message); yield return result; - string nextPageString = ((ListWithStringNextLinkResponse)result).Next; + string nextPageString = ((ListWithStringNextLinkResult)result).Next; if (string.IsNullOrEmpty(nextPageString)) { yield break; @@ -52,7 +52,7 @@ public override IEnumerable GetRawPages() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithStringNextLinkResponse)page).Next; + string nextPage = ((ListWithStringNextLinkResult)page).Next; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResultOfT.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResultOfT.cs index 3eae436b639..462d2612bed 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResultOfT.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/CollectionResults/SampleTypeSpecClientGetWithStringNextLinkCollectionResultOfT.cs @@ -37,7 +37,7 @@ public override IEnumerable GetRawPages() ClientResult result = GetNextResponse(message); yield return result; - string nextPageString = ((ListWithStringNextLinkResponse)result).Next; + string nextPageString = ((ListWithStringNextLinkResult)result).Next; if (string.IsNullOrEmpty(nextPageString)) { yield break; @@ -52,7 +52,7 @@ public override IEnumerable GetRawPages() /// The continuation token for the specified page. public override ContinuationToken GetContinuationToken(ClientResult page) { - string nextPage = ((ListWithStringNextLinkResponse)page).Next; + string nextPage = ((ListWithStringNextLinkResult)page).Next; if (!string.IsNullOrEmpty(nextPage)) { return ContinuationToken.FromBytes(BinaryData.FromString(nextPage)); @@ -68,7 +68,7 @@ public override ContinuationToken GetContinuationToken(ClientResult page) /// The values from the specified page. protected override IEnumerable GetValuesFromPage(ClientResult page) { - return ((ListWithStringNextLinkResponse)page).Things; + return ((ListWithStringNextLinkResult)page).Things; } /// Sends the request in the pipeline message and returns the response. diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Metrics.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Metrics.cs index dab61b07de2..28bf5903d4a 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Metrics.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Metrics.cs @@ -164,20 +164,20 @@ public virtual async Task GetWidgetMetricsAsync(string day, Reques /// /// The cancellation token that can be used to cancel the operation. /// Service returned a non-success status code. - public virtual ClientResult GetWidgetMetrics(DaysOfWeekExtensibleEnum day, CancellationToken cancellationToken = default) + public virtual ClientResult GetWidgetMetrics(DaysOfWeekExtensibleEnum day, CancellationToken cancellationToken = default) { ClientResult result = GetWidgetMetrics(day.ToString(), cancellationToken.ToRequestOptions()); - return ClientResult.FromValue((GetWidgetMetricsResponse)result, result.GetRawResponse()); + return ClientResult.FromValue((GetWidgetMetricsResult)result, result.GetRawResponse()); } /// Get Widget metrics for given day of week. /// /// The cancellation token that can be used to cancel the operation. /// Service returned a non-success status code. - public virtual async Task> GetWidgetMetricsAsync(DaysOfWeekExtensibleEnum day, CancellationToken cancellationToken = default) + public virtual async Task> GetWidgetMetricsAsync(DaysOfWeekExtensibleEnum day, CancellationToken cancellationToken = default) { ClientResult result = await GetWidgetMetricsAsync(day.ToString(), cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return ClientResult.FromValue((GetWidgetMetricsResponse)result, result.GetRawResponse()); + return ClientResult.FromValue((GetWidgetMetricsResult)result, result.GetRawResponse()); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResult.Serialization.cs similarity index 68% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResult.Serialization.cs index 78120dd38a3..14a86aef841 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResult.Serialization.cs @@ -13,65 +13,65 @@ namespace SampleTypeSpec { - /// The GetNotebookResponse. - public partial class GetNotebookResponse : IJsonModel + /// The GetNotebookResult. + public partial class GetNotebookResult : IJsonModel { - /// Initializes a new instance of for deserialization. - internal GetNotebookResponse() + /// Initializes a new instance of for deserialization. + internal GetNotebookResult() { } /// The data to parse. /// The client options for reading and writing models. - protected virtual GetNotebookResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual GetNotebookResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeGetNotebookResponse(document.RootElement, options); + return DeserializeGetNotebookResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(GetNotebookResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(GetNotebookResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(GetNotebookResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(GetNotebookResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - GetNotebookResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + GetNotebookResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator GetNotebookResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator GetNotebookResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeGetNotebookResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeGetNotebookResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -82,10 +82,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWri /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(GetNotebookResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(GetNotebookResult)} does not support writing '{format}' format."); } writer.WritePropertyName("name"u8); writer.WriteStringValue(Name); @@ -110,24 +110,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - GetNotebookResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + GetNotebookResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual GetNotebookResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual GetNotebookResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(GetNotebookResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(GetNotebookResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeGetNotebookResponse(document.RootElement, options); + return DeserializeGetNotebookResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static GetNotebookResponse DeserializeGetNotebookResponse(JsonElement element, ModelReaderWriterOptions options) + internal static GetNotebookResult DeserializeGetNotebookResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -153,7 +153,7 @@ internal static GetNotebookResponse DeserializeGetNotebookResponse(JsonElement e additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new GetNotebookResponse(name, content, additionalBinaryDataProperties); + return new GetNotebookResult(name, content, additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResult.cs similarity index 77% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResult.cs index af0f633f72a..869f6b3a7cd 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResult.cs @@ -10,26 +10,26 @@ namespace SampleTypeSpec { - /// The GetNotebookResponse. - public partial class GetNotebookResponse + /// The GetNotebookResult. + public partial class GetNotebookResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// - internal GetNotebookResponse(string name, string content) + internal GetNotebookResult(string name, string content) { Name = name; Content = content; } - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// /// Keeps track of any properties unknown to the library. - internal GetNotebookResponse(string name, string content, IDictionary additionalBinaryDataProperties) + internal GetNotebookResult(string name, string content, IDictionary additionalBinaryDataProperties) { Name = name; Content = content; diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResult.Serialization.cs similarity index 67% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResult.Serialization.cs index a0c21a889d3..732ec427356 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResult.Serialization.cs @@ -13,65 +13,65 @@ namespace SampleTypeSpec { - /// The GetWidgetMetricsResponse. - public partial class GetWidgetMetricsResponse : IJsonModel + /// The GetWidgetMetricsResult. + public partial class GetWidgetMetricsResult : IJsonModel { - /// Initializes a new instance of for deserialization. - internal GetWidgetMetricsResponse() + /// Initializes a new instance of for deserialization. + internal GetWidgetMetricsResult() { } /// The data to parse. /// The client options for reading and writing models. - protected virtual GetWidgetMetricsResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual GetWidgetMetricsResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeGetWidgetMetricsResponse(document.RootElement, options); + return DeserializeGetWidgetMetricsResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(GetWidgetMetricsResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(GetWidgetMetricsResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(GetWidgetMetricsResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(GetWidgetMetricsResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - GetWidgetMetricsResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + GetWidgetMetricsResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator GetWidgetMetricsResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator GetWidgetMetricsResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeGetWidgetMetricsResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeGetWidgetMetricsResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -82,10 +82,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRead /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(GetWidgetMetricsResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(GetWidgetMetricsResult)} does not support writing '{format}' format."); } writer.WritePropertyName("numSold"u8); writer.WriteNumberValue(NumSold); @@ -110,24 +110,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - GetWidgetMetricsResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + GetWidgetMetricsResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual GetWidgetMetricsResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual GetWidgetMetricsResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(GetWidgetMetricsResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(GetWidgetMetricsResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeGetWidgetMetricsResponse(document.RootElement, options); + return DeserializeGetWidgetMetricsResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static GetWidgetMetricsResponse DeserializeGetWidgetMetricsResponse(JsonElement element, ModelReaderWriterOptions options) + internal static GetWidgetMetricsResult DeserializeGetWidgetMetricsResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -153,7 +153,7 @@ internal static GetWidgetMetricsResponse DeserializeGetWidgetMetricsResponse(Jso additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new GetWidgetMetricsResponse(numSold, averagePrice, additionalBinaryDataProperties); + return new GetWidgetMetricsResult(numSold, averagePrice, additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResult.cs similarity index 76% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResult.cs index ddfc7b1530f..33ce5fee5b3 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResult.cs @@ -10,26 +10,26 @@ namespace SampleTypeSpec { - /// The GetWidgetMetricsResponse. - public partial class GetWidgetMetricsResponse + /// The GetWidgetMetricsResult. + public partial class GetWidgetMetricsResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// - internal GetWidgetMetricsResponse(int numSold, float averagePrice) + internal GetWidgetMetricsResult(int numSold, float averagePrice) { NumSold = numSold; AveragePrice = averagePrice; } - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// /// Keeps track of any properties unknown to the library. - internal GetWidgetMetricsResponse(int numSold, float averagePrice, IDictionary additionalBinaryDataProperties) + internal GetWidgetMetricsResult(int numSold, float averagePrice, IDictionary additionalBinaryDataProperties) { NumSold = numSold; AveragePrice = averagePrice; diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResult.Serialization.cs similarity index 72% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResult.Serialization.cs index 62581e9ac00..c129339bb0a 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResult.Serialization.cs @@ -13,65 +13,65 @@ namespace SampleTypeSpec { - /// The ListWithContinuationTokenHeaderResponseResponse. - internal partial class ListWithContinuationTokenHeaderResponseResponse : IJsonModel + /// The ListWithContinuationTokenHeaderResponseResult. + internal partial class ListWithContinuationTokenHeaderResponseResult : IJsonModel { - /// Initializes a new instance of for deserialization. - internal ListWithContinuationTokenHeaderResponseResponse() + /// Initializes a new instance of for deserialization. + internal ListWithContinuationTokenHeaderResponseResult() { } /// The data to parse. /// The client options for reading and writing models. - protected virtual ListWithContinuationTokenHeaderResponseResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual ListWithContinuationTokenHeaderResponseResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeListWithContinuationTokenHeaderResponseResponse(document.RootElement, options); + return DeserializeListWithContinuationTokenHeaderResponseResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - ListWithContinuationTokenHeaderResponseResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + ListWithContinuationTokenHeaderResponseResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator ListWithContinuationTokenHeaderResponseResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator ListWithContinuationTokenHeaderResponseResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeListWithContinuationTokenHeaderResponseResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeListWithContinuationTokenHeaderResponseResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -82,10 +82,10 @@ void IJsonModel.Write(Utf8JsonW /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResult)} does not support writing '{format}' format."); } writer.WritePropertyName("things"u8); writer.WriteStartArray(); @@ -113,24 +113,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - ListWithContinuationTokenHeaderResponseResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + ListWithContinuationTokenHeaderResponseResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual ListWithContinuationTokenHeaderResponseResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual ListWithContinuationTokenHeaderResponseResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenHeaderResponseResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeListWithContinuationTokenHeaderResponseResponse(document.RootElement, options); + return DeserializeListWithContinuationTokenHeaderResponseResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static ListWithContinuationTokenHeaderResponseResponse DeserializeListWithContinuationTokenHeaderResponseResponse(JsonElement element, ModelReaderWriterOptions options) + internal static ListWithContinuationTokenHeaderResponseResult DeserializeListWithContinuationTokenHeaderResponseResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -155,7 +155,7 @@ internal static ListWithContinuationTokenHeaderResponseResponse DeserializeListW additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new ListWithContinuationTokenHeaderResponseResponse(things, additionalBinaryDataProperties); + return new ListWithContinuationTokenHeaderResponseResult(things, additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResult.cs similarity index 74% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResult.cs index dc281b42e3d..45745f85a95 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResult.cs @@ -11,23 +11,23 @@ namespace SampleTypeSpec { - /// The ListWithContinuationTokenHeaderResponseResponse. - internal partial class ListWithContinuationTokenHeaderResponseResponse + /// The ListWithContinuationTokenHeaderResponseResult. + internal partial class ListWithContinuationTokenHeaderResponseResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . + /// Initializes a new instance of . /// - internal ListWithContinuationTokenHeaderResponseResponse(IEnumerable things) + internal ListWithContinuationTokenHeaderResponseResult(IEnumerable things) { Things = things.ToList(); } - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// Keeps track of any properties unknown to the library. - internal ListWithContinuationTokenHeaderResponseResponse(IList things, IDictionary additionalBinaryDataProperties) + internal ListWithContinuationTokenHeaderResponseResult(IList things, IDictionary additionalBinaryDataProperties) { Things = things; _additionalBinaryDataProperties = additionalBinaryDataProperties; diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResult.Serialization.cs similarity index 69% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResult.Serialization.cs index 3f1f22f975f..9c60cc4d9c9 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResult.Serialization.cs @@ -13,65 +13,65 @@ namespace SampleTypeSpec { - /// The ListWithContinuationTokenResponse. - internal partial class ListWithContinuationTokenResponse : IJsonModel + /// The ListWithContinuationTokenResult. + internal partial class ListWithContinuationTokenResult : IJsonModel { - /// Initializes a new instance of for deserialization. - internal ListWithContinuationTokenResponse() + /// Initializes a new instance of for deserialization. + internal ListWithContinuationTokenResult() { } /// The data to parse. /// The client options for reading and writing models. - protected virtual ListWithContinuationTokenResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual ListWithContinuationTokenResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeListWithContinuationTokenResponse(document.RootElement, options); + return DeserializeListWithContinuationTokenResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ListWithContinuationTokenResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(ListWithContinuationTokenResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - ListWithContinuationTokenResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + ListWithContinuationTokenResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator ListWithContinuationTokenResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator ListWithContinuationTokenResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeListWithContinuationTokenResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeListWithContinuationTokenResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -82,10 +82,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithContinuationTokenResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenResult)} does not support writing '{format}' format."); } writer.WritePropertyName("things"u8); writer.WriteStartArray(); @@ -118,24 +118,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - ListWithContinuationTokenResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + ListWithContinuationTokenResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual ListWithContinuationTokenResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual ListWithContinuationTokenResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithContinuationTokenResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ListWithContinuationTokenResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeListWithContinuationTokenResponse(document.RootElement, options); + return DeserializeListWithContinuationTokenResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static ListWithContinuationTokenResponse DeserializeListWithContinuationTokenResponse(JsonElement element, ModelReaderWriterOptions options) + internal static ListWithContinuationTokenResult DeserializeListWithContinuationTokenResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -166,7 +166,7 @@ internal static ListWithContinuationTokenResponse DeserializeListWithContinuatio additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new ListWithContinuationTokenResponse(things, nextToken, additionalBinaryDataProperties); + return new ListWithContinuationTokenResult(things, nextToken, additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResult.cs similarity index 72% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResult.cs index e689ab9f9bd..38a72b954b3 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResult.cs @@ -11,24 +11,24 @@ namespace SampleTypeSpec { - /// The ListWithContinuationTokenResponse. - internal partial class ListWithContinuationTokenResponse + /// The ListWithContinuationTokenResult. + internal partial class ListWithContinuationTokenResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . + /// Initializes a new instance of . /// - internal ListWithContinuationTokenResponse(IEnumerable things) + internal ListWithContinuationTokenResult(IEnumerable things) { Things = things.ToList(); } - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// /// Keeps track of any properties unknown to the library. - internal ListWithContinuationTokenResponse(IList things, string nextToken, IDictionary additionalBinaryDataProperties) + internal ListWithContinuationTokenResult(IList things, string nextToken, IDictionary additionalBinaryDataProperties) { Things = things; NextToken = nextToken; diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResult.Serialization.cs similarity index 69% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResult.Serialization.cs index 4f831017597..aeaabbeb930 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResult.Serialization.cs @@ -13,65 +13,65 @@ namespace SampleTypeSpec { - /// The ListWithNextLinkResponse. - internal partial class ListWithNextLinkResponse : IJsonModel + /// The ListWithNextLinkResult. + internal partial class ListWithNextLinkResult : IJsonModel { - /// Initializes a new instance of for deserialization. - internal ListWithNextLinkResponse() + /// Initializes a new instance of for deserialization. + internal ListWithNextLinkResult() { } /// The data to parse. /// The client options for reading and writing models. - protected virtual ListWithNextLinkResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual ListWithNextLinkResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeListWithNextLinkResponse(document.RootElement, options); + return DeserializeListWithNextLinkResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ListWithNextLinkResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithNextLinkResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(ListWithNextLinkResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithNextLinkResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - ListWithNextLinkResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + ListWithNextLinkResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator ListWithNextLinkResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator ListWithNextLinkResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeListWithNextLinkResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeListWithNextLinkResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -82,10 +82,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, ModelRead /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithNextLinkResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ListWithNextLinkResult)} does not support writing '{format}' format."); } writer.WritePropertyName("things"u8); writer.WriteStartArray(); @@ -118,24 +118,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - ListWithNextLinkResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + ListWithNextLinkResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual ListWithNextLinkResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual ListWithNextLinkResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithNextLinkResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ListWithNextLinkResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeListWithNextLinkResponse(document.RootElement, options); + return DeserializeListWithNextLinkResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static ListWithNextLinkResponse DeserializeListWithNextLinkResponse(JsonElement element, ModelReaderWriterOptions options) + internal static ListWithNextLinkResult DeserializeListWithNextLinkResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -170,7 +170,7 @@ internal static ListWithNextLinkResponse DeserializeListWithNextLinkResponse(Jso additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new ListWithNextLinkResponse(things, next, additionalBinaryDataProperties); + return new ListWithNextLinkResult(things, next, additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResult.cs similarity index 74% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResult.cs index 96de907bd81..547603d5850 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResult.cs @@ -11,24 +11,24 @@ namespace SampleTypeSpec { - /// The ListWithNextLinkResponse. - internal partial class ListWithNextLinkResponse + /// The ListWithNextLinkResult. + internal partial class ListWithNextLinkResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . + /// Initializes a new instance of . /// - internal ListWithNextLinkResponse(IEnumerable things) + internal ListWithNextLinkResult(IEnumerable things) { Things = things.ToList(); } - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// /// Keeps track of any properties unknown to the library. - internal ListWithNextLinkResponse(IList things, Uri next, IDictionary additionalBinaryDataProperties) + internal ListWithNextLinkResult(IList things, Uri next, IDictionary additionalBinaryDataProperties) { Things = things; Next = next; diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResult.Serialization.cs similarity index 69% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResult.Serialization.cs index 15732d94656..0b346a622cd 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResult.Serialization.cs @@ -13,65 +13,65 @@ namespace SampleTypeSpec { - /// The ListWithStringNextLinkResponse. - internal partial class ListWithStringNextLinkResponse : IJsonModel + /// The ListWithStringNextLinkResult. + internal partial class ListWithStringNextLinkResult : IJsonModel { - /// Initializes a new instance of for deserialization. - internal ListWithStringNextLinkResponse() + /// Initializes a new instance of for deserialization. + internal ListWithStringNextLinkResult() { } /// The data to parse. /// The client options for reading and writing models. - protected virtual ListWithStringNextLinkResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual ListWithStringNextLinkResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeListWithStringNextLinkResponse(document.RootElement, options); + return DeserializeListWithStringNextLinkResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ListWithStringNextLinkResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithStringNextLinkResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(ListWithStringNextLinkResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ListWithStringNextLinkResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - ListWithStringNextLinkResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + ListWithStringNextLinkResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator ListWithStringNextLinkResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator ListWithStringNextLinkResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeListWithStringNextLinkResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeListWithStringNextLinkResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -82,10 +82,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mod /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithStringNextLinkResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ListWithStringNextLinkResult)} does not support writing '{format}' format."); } writer.WritePropertyName("things"u8); writer.WriteStartArray(); @@ -118,24 +118,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - ListWithStringNextLinkResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + ListWithStringNextLinkResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual ListWithStringNextLinkResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual ListWithStringNextLinkResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ListWithStringNextLinkResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ListWithStringNextLinkResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeListWithStringNextLinkResponse(document.RootElement, options); + return DeserializeListWithStringNextLinkResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static ListWithStringNextLinkResponse DeserializeListWithStringNextLinkResponse(JsonElement element, ModelReaderWriterOptions options) + internal static ListWithStringNextLinkResult DeserializeListWithStringNextLinkResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -166,7 +166,7 @@ internal static ListWithStringNextLinkResponse DeserializeListWithStringNextLink additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new ListWithStringNextLinkResponse(things, next, additionalBinaryDataProperties); + return new ListWithStringNextLinkResult(things, next, additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResult.cs similarity index 73% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResult.cs index 38c936b133d..f20096bb119 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResult.cs @@ -11,24 +11,24 @@ namespace SampleTypeSpec { - /// The ListWithStringNextLinkResponse. - internal partial class ListWithStringNextLinkResponse + /// The ListWithStringNextLinkResult. + internal partial class ListWithStringNextLinkResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . + /// Initializes a new instance of . /// - internal ListWithStringNextLinkResponse(IEnumerable things) + internal ListWithStringNextLinkResult(IEnumerable things) { Things = things.ToList(); } - /// Initializes a new instance of . + /// Initializes a new instance of . /// /// /// Keeps track of any properties unknown to the library. - internal ListWithStringNextLinkResponse(IList things, string next, IDictionary additionalBinaryDataProperties) + internal ListWithStringNextLinkResult(IList things, string next, IDictionary additionalBinaryDataProperties) { Things = things; Next = next; diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResult.Serialization.cs similarity index 65% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.Serialization.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResult.Serialization.cs index b3ec4a85bed..9d0371e973a 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.Serialization.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResult.Serialization.cs @@ -13,60 +13,60 @@ namespace SampleTypeSpec { - /// The ReturnsAnonymousModelResponse. - public partial class ReturnsAnonymousModelResponse : IJsonModel + /// The ReturnsAnonymousModelResult. + public partial class ReturnsAnonymousModelResult : IJsonModel { /// The data to parse. /// The client options for reading and writing models. - protected virtual ReturnsAnonymousModelResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) + protected virtual ReturnsAnonymousModelResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { - return DeserializeReturnsAnonymousModelResponse(document.RootElement, options); + return DeserializeReturnsAnonymousModelResult(document.RootElement, options); } default: - throw new FormatException($"The model {nameof(ReturnsAnonymousModelResponse)} does not support reading '{options.Format}' format."); + throw new FormatException($"The model {nameof(ReturnsAnonymousModelResult)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default); default: - throw new FormatException($"The model {nameof(ReturnsAnonymousModelResponse)} does not support writing '{options.Format}' format."); + throw new FormatException($"The model {nameof(ReturnsAnonymousModelResult)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. - ReturnsAnonymousModelResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); + ReturnsAnonymousModelResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; - /// The to deserialize the from. - public static explicit operator ReturnsAnonymousModelResponse(ClientResult result) + /// The to deserialize the from. + public static explicit operator ReturnsAnonymousModelResult(ClientResult result) { PipelineResponse response = result.GetRawResponse(); using JsonDocument document = JsonDocument.Parse(response.Content, ModelSerializationExtensions.JsonDocumentOptions); - return DeserializeReturnsAnonymousModelResponse(document.RootElement, ModelSerializationExtensions.WireOptions); + return DeserializeReturnsAnonymousModelResult(document.RootElement, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); @@ -77,10 +77,10 @@ void IJsonModel.Write(Utf8JsonWriter writer, Mode /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ReturnsAnonymousModelResponse)} does not support writing '{format}' format."); + throw new FormatException($"The model {nameof(ReturnsAnonymousModelResult)} does not support writing '{format}' format."); } if (options.Format != "W" && _additionalBinaryDataProperties != null) { @@ -101,24 +101,24 @@ protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWrit /// The JSON reader. /// The client options for reading and writing models. - ReturnsAnonymousModelResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); + ReturnsAnonymousModelResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. - protected virtual ReturnsAnonymousModelResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) + protected virtual ReturnsAnonymousModelResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { - string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; + string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { - throw new FormatException($"The model {nameof(ReturnsAnonymousModelResponse)} does not support reading '{format}' format."); + throw new FormatException($"The model {nameof(ReturnsAnonymousModelResult)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); - return DeserializeReturnsAnonymousModelResponse(document.RootElement, options); + return DeserializeReturnsAnonymousModelResult(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. - internal static ReturnsAnonymousModelResponse DeserializeReturnsAnonymousModelResponse(JsonElement element, ModelReaderWriterOptions options) + internal static ReturnsAnonymousModelResult DeserializeReturnsAnonymousModelResult(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { @@ -132,7 +132,7 @@ internal static ReturnsAnonymousModelResponse DeserializeReturnsAnonymousModelRe additionalBinaryDataProperties.Add(prop.Name, prop.Value.GetUtf8Bytes()); } } - return new ReturnsAnonymousModelResponse(additionalBinaryDataProperties); + return new ReturnsAnonymousModelResult(additionalBinaryDataProperties); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResult.cs similarity index 67% rename from packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResult.cs index 5e5d23873b1..f8697d817a0 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResult.cs @@ -10,20 +10,20 @@ namespace SampleTypeSpec { - /// The ReturnsAnonymousModelResponse. - public partial class ReturnsAnonymousModelResponse + /// The ReturnsAnonymousModelResult. + public partial class ReturnsAnonymousModelResult { /// Keeps track of any properties unknown to the library. private protected readonly IDictionary _additionalBinaryDataProperties; - /// Initializes a new instance of . - internal ReturnsAnonymousModelResponse() + /// Initializes a new instance of . + internal ReturnsAnonymousModelResult() { } - /// Initializes a new instance of . + /// Initializes a new instance of . /// Keeps track of any properties unknown to the library. - internal ReturnsAnonymousModelResponse(IDictionary additionalBinaryDataProperties) + internal ReturnsAnonymousModelResult(IDictionary additionalBinaryDataProperties) { _additionalBinaryDataProperties = additionalBinaryDataProperties; } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs index b58f7f1b7f7..7cf48210f0d 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/SampleTypeSpecContext.cs @@ -19,12 +19,12 @@ namespace SampleTypeSpec [ModelReaderWriterBuildable(typeof(Dog))] [ModelReaderWriterBuildable(typeof(DynamicModel))] [ModelReaderWriterBuildable(typeof(Friend))] - [ModelReaderWriterBuildable(typeof(GetNotebookResponse))] - [ModelReaderWriterBuildable(typeof(GetWidgetMetricsResponse))] - [ModelReaderWriterBuildable(typeof(ListWithContinuationTokenHeaderResponseResponse))] - [ModelReaderWriterBuildable(typeof(ListWithContinuationTokenResponse))] - [ModelReaderWriterBuildable(typeof(ListWithNextLinkResponse))] - [ModelReaderWriterBuildable(typeof(ListWithStringNextLinkResponse))] + [ModelReaderWriterBuildable(typeof(GetNotebookResult))] + [ModelReaderWriterBuildable(typeof(GetWidgetMetricsResult))] + [ModelReaderWriterBuildable(typeof(ListWithContinuationTokenHeaderResponseResult))] + [ModelReaderWriterBuildable(typeof(ListWithContinuationTokenResult))] + [ModelReaderWriterBuildable(typeof(ListWithNextLinkResult))] + [ModelReaderWriterBuildable(typeof(ListWithStringNextLinkResult))] [ModelReaderWriterBuildable(typeof(ModelWithEmbeddedNonBodyParameters))] [ModelReaderWriterBuildable(typeof(ModelWithRequiredNullableProperties))] [ModelReaderWriterBuildable(typeof(NullableDynamicModel))] @@ -32,7 +32,7 @@ namespace SampleTypeSpec [ModelReaderWriterBuildable(typeof(Pet))] [ModelReaderWriterBuildable(typeof(Plant))] [ModelReaderWriterBuildable(typeof(RenamedModelCustom))] - [ModelReaderWriterBuildable(typeof(ReturnsAnonymousModelResponse))] + [ModelReaderWriterBuildable(typeof(ReturnsAnonymousModelResult))] [ModelReaderWriterBuildable(typeof(RoundTripModel))] [ModelReaderWriterBuildable(typeof(StreamingItem))] [ModelReaderWriterBuildable(typeof(Thing))] diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Notebooks.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Notebooks.cs index 27cc5179a09..1fecec56e9e 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Notebooks.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Notebooks.cs @@ -161,19 +161,19 @@ public virtual async Task GetNotebookAsync(RequestOptions options) /// Get a notebook by name. /// The cancellation token that can be used to cancel the operation. /// Service returned a non-success status code. - public virtual ClientResult GetNotebook(CancellationToken cancellationToken = default) + public virtual ClientResult GetNotebook(CancellationToken cancellationToken = default) { ClientResult result = GetNotebook(cancellationToken.ToRequestOptions()); - return ClientResult.FromValue((GetNotebookResponse)result, result.GetRawResponse()); + return ClientResult.FromValue((GetNotebookResult)result, result.GetRawResponse()); } /// Get a notebook by name. /// The cancellation token that can be used to cancel the operation. /// Service returned a non-success status code. - public virtual async Task> GetNotebookAsync(CancellationToken cancellationToken = default) + public virtual async Task> GetNotebookAsync(CancellationToken cancellationToken = default) { ClientResult result = await GetNotebookAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return ClientResult.FromValue((GetNotebookResponse)result, result.GetRawResponse()); + return ClientResult.FromValue((GetNotebookResult)result, result.GetRawResponse()); } } } diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs index f9f6970f13a..b8aa6f0bd1c 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecClient.cs @@ -1031,19 +1031,19 @@ public virtual async Task ReturnsAnonymousModelAsync(RequestOption /// return anonymous model. /// The cancellation token that can be used to cancel the operation. /// Service returned a non-success status code. - public virtual ClientResult ReturnsAnonymousModel(CancellationToken cancellationToken = default) + public virtual ClientResult ReturnsAnonymousModel(CancellationToken cancellationToken = default) { ClientResult result = ReturnsAnonymousModel(cancellationToken.ToRequestOptions()); - return ClientResult.FromValue((ReturnsAnonymousModelResponse)result, result.GetRawResponse()); + return ClientResult.FromValue((ReturnsAnonymousModelResult)result, result.GetRawResponse()); } /// return anonymous model. /// The cancellation token that can be used to cancel the operation. /// Service returned a non-success status code. - public virtual async Task> ReturnsAnonymousModelAsync(CancellationToken cancellationToken = default) + public virtual async Task> ReturnsAnonymousModelAsync(CancellationToken cancellationToken = default) { ClientResult result = await ReturnsAnonymousModelAsync(cancellationToken.ToRequestOptions()).ConfigureAwait(false); - return ClientResult.FromValue((ReturnsAnonymousModelResponse)result, result.GetRawResponse()); + return ClientResult.FromValue((ReturnsAnonymousModelResult)result, result.GetRawResponse()); } /// diff --git a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecModelFactory.cs b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecModelFactory.cs index b51746632cb..9c7b48fd7d4 100644 --- a/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecModelFactory.cs +++ b/packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/SampleTypeSpecModelFactory.cs @@ -165,11 +165,11 @@ public static RenamedModelCustom RenamedModelCustom(string name = default, strin return new RenamedModelCustom(name, additionalBinaryDataProperties: null, otherName); } - /// The ReturnsAnonymousModelResponse. - /// A new instance for mocking. - public static ReturnsAnonymousModelResponse ReturnsAnonymousModelResponse() + /// The ReturnsAnonymousModelResult. + /// A new instance for mocking. + public static ReturnsAnonymousModelResult ReturnsAnonymousModelResult() { - return new ReturnsAnonymousModelResponse(additionalBinaryDataProperties: null); + return new ReturnsAnonymousModelResult(additionalBinaryDataProperties: null); } /// The ModelWithEmbeddedNonBodyParameters. @@ -492,22 +492,22 @@ public static Plant Plant(string species = default, string id = default, int hei return new UnknownPlant(species, id, height, additionalBinaryDataProperties: null); } - /// The GetWidgetMetricsResponse. + /// The GetWidgetMetricsResult. /// /// - /// A new instance for mocking. - public static GetWidgetMetricsResponse GetWidgetMetricsResponse(int numSold = default, float averagePrice = default) + /// A new instance for mocking. + public static GetWidgetMetricsResult GetWidgetMetricsResult(int numSold = default, float averagePrice = default) { - return new GetWidgetMetricsResponse(numSold, averagePrice, additionalBinaryDataProperties: null); + return new GetWidgetMetricsResult(numSold, averagePrice, additionalBinaryDataProperties: null); } - /// The GetNotebookResponse. + /// The GetNotebookResult. /// /// - /// A new instance for mocking. - public static GetNotebookResponse GetNotebookResponse(string name = default, string content = default) + /// A new instance for mocking. + public static GetNotebookResult GetNotebookResult(string name = default, string content = default) { - return new GetNotebookResponse(name, content, additionalBinaryDataProperties: null); + return new GetNotebookResult(name, content, additionalBinaryDataProperties: null); } /// The NullableDynamicModel. diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.Serialization.cs deleted file mode 100644 index 9d2744ca516..00000000000 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.Serialization.cs +++ /dev/null @@ -1,36 +0,0 @@ -// - -#nullable disable - -using System; -using System.ClientModel; -using System.ClientModel.Primitives; -using System.Text.Json; - -namespace _Type.Union -{ - public partial class GetResponse : IJsonModel - { - internal GetResponse() => throw null; - - protected virtual GetResponse PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) => throw null; - - protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) => throw null; - - BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => throw null; - - GetResponse IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => throw null; - - string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => throw null; - - public static explicit operator GetResponse(ClientResult result) => throw null; - - void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) => throw null; - - protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) => throw null; - - GetResponse IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => throw null; - - protected virtual GetResponse JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => throw null; - } -} diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.Serialization.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.Serialization.cs new file mode 100644 index 00000000000..53be5bbecec --- /dev/null +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.Serialization.cs @@ -0,0 +1,36 @@ +// + +#nullable disable + +using System; +using System.ClientModel; +using System.ClientModel.Primitives; +using System.Text.Json; + +namespace _Type.Union +{ + public partial class GetResult : IJsonModel + { + internal GetResult() => throw null; + + protected virtual GetResult PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) => throw null; + + protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) => throw null; + + BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => throw null; + + GetResult IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => throw null; + + string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => throw null; + + public static explicit operator GetResult(ClientResult result) => throw null; + + void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) => throw null; + + protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) => throw null; + + GetResult IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => throw null; + + protected virtual GetResult JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => throw null; + } +} diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.cs similarity index 77% rename from packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.cs rename to packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.cs index 74aff777d1c..5e9865629f0 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResponse.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/GetResult.cs @@ -4,7 +4,7 @@ namespace _Type.Union { - public partial class GetResponse + public partial class GetResult { public GetResponseProp Prop => throw null; } diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs index 60e51e84695..bdce6aa0f5d 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/Models/_TypeUnionContext.cs @@ -9,7 +9,6 @@ namespace _Type.Union [ModelReaderWriterBuildable(typeof(Cat))] [ModelReaderWriterBuildable(typeof(Dog))] [ModelReaderWriterBuildable(typeof(EnumsOnlyCases))] - [ModelReaderWriterBuildable(typeof(GetResponse))] [ModelReaderWriterBuildable(typeof(GetResponse1))] [ModelReaderWriterBuildable(typeof(GetResponse2))] [ModelReaderWriterBuildable(typeof(GetResponse3))] @@ -19,6 +18,7 @@ namespace _Type.Union [ModelReaderWriterBuildable(typeof(GetResponse7))] [ModelReaderWriterBuildable(typeof(GetResponse8))] [ModelReaderWriterBuildable(typeof(GetResponse9))] + [ModelReaderWriterBuildable(typeof(GetResult))] [ModelReaderWriterBuildable(typeof(MixedLiteralsCases))] [ModelReaderWriterBuildable(typeof(MixedTypesCases))] [ModelReaderWriterBuildable(typeof(StringAndArrayCases))] diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/StringsOnly.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/StringsOnly.cs index fb8ec122f24..317c4c7ca07 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/StringsOnly.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/StringsOnly.cs @@ -22,9 +22,9 @@ public partial class StringsOnly public virtual Task GetAsync(RequestOptions options) => throw null; - public virtual ClientResult Get(CancellationToken cancellationToken = default) => throw null; + public virtual ClientResult Get(CancellationToken cancellationToken = default) => throw null; - public virtual Task> GetAsync(CancellationToken cancellationToken = default) => throw null; + public virtual Task> GetAsync(CancellationToken cancellationToken = default) => throw null; public virtual ClientResult Send(BinaryContent content, RequestOptions options = null) => throw null; diff --git a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/TypeUnionModelFactory.cs b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/TypeUnionModelFactory.cs index 94c8fc67c26..95291f26185 100644 --- a/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/TypeUnionModelFactory.cs +++ b/packages/http-client-csharp/generator/TestProjects/Spector/http/type/union/src/Generated/TypeUnionModelFactory.cs @@ -9,7 +9,7 @@ namespace _Type.Union { public static partial class TypeUnionModelFactory { - public static GetResponse GetResponse(GetResponseProp prop = default) => throw null; + public static GetResult GetResult(GetResponseProp prop = default) => throw null; public static GetResponse1 GetResponse1(GetResponseProp1 prop = default) => throw null; From d9ed5f89b115c8badddca7732dd2eca2b126e1a5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 19:59:44 +0000 Subject: [PATCH 4/9] fix(csharp): account for Result-targeted customization aliases Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/TypeProvider.cs | 7 +++++++ .../ModelProviders/ModelProviderTests.cs | 16 ++++++++++++++++ .../WidgetResult.cs | 9 +++++++++ 3 files changed, 32 insertions(+) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsResultCustomizationAliasCollision/WidgetResult.cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs index 4bf30ab77b2..5b0857c3d5a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs @@ -836,6 +836,13 @@ bool HasConflictingName(InputType inputType, string inputTypeNamespace) if (sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) { otherName = normalizedOtherName; + if (customType is null && inputType is InputModelType && + otherName.EndsWith(responseSuffix, StringComparison.Ordinal) && + sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) + { + customType = sourceInputModel.FindForTypeInCurrentCompilation( + otherNamespace, $"{otherName[..^responseSuffix.Length]}Result"); + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs index 2bf5ec5402e..b8ce1f6ab7a 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs @@ -261,6 +261,22 @@ await MockHelpers.LoadMockGeneratorAsync( Assert.AreEqual("WidgetResult", CodeModelGenerator.Instance.TypeFactory.CreateModel(other)!.Name); } + [TestCase(false)] + [TestCase(true)] + public async Task TestBuildName_ResponseSuffixAvoidsResultCustomizationAliasCollision(bool reverseOrder) + { + var widget = InputFactory.Model("WidgetResponse"); + var gadget = InputFactory.Model("GadgetResponse"); + InputModelType[] models = reverseOrder ? [gadget, widget] : [widget, gadget]; + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: models, + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + var providers = models.Select(m => CodeModelGenerator.Instance.TypeFactory.CreateModel(m)!).ToArray(); + + CollectionAssert.AreEquivalent(new[] { "WidgetResponse", "WidgetResult" }, providers.Select(p => p.Name)); + } + [Test] public async Task TestBuildName_BackCompatTakesPrecedenceOverAcronymNormalization() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsResultCustomizationAliasCollision/WidgetResult.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsResultCustomizationAliasCollision/WidgetResult.cs new file mode 100644 index 00000000000..b67b88c2025 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAvoidsResultCustomizationAliasCollision/WidgetResult.cs @@ -0,0 +1,9 @@ +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + [CodeGenType("GadgetResult")] + public partial class WidgetResult + { + } +} From 8c8f5d2e61b3f4bf0315d7d63e5481b9923b1c50 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 20:20:36 +0000 Subject: [PATCH 5/9] refactor(csharp): scope response name fallbacks to ModelProvider Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ModelProvider.cs | 44 +++++++++++++++++++ .../src/Providers/TypeProvider.cs | 42 +++--------------- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs index 25b395718e4..5be9fae6bb4 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs @@ -317,6 +317,50 @@ protected override string BuildName() return NormalizeTypeNameForNewContract(_inputModel.Name.ToIdentifierName()); } + private protected override TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) + { + var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); + var typeName = generatedTypeName ?? BuildName(); + var customCodeView = base.BuildCustomCodeView(typeName, typeNamespace); + if (customCodeView is not null || _inputModel.IsExactName) + { + return customCodeView; + } + + var originalName = _inputModel.Name.ToIdentifierName(); + if (!originalName.EndsWith("Response", StringComparison.Ordinal) || + originalName == typeName || + typeName != NormalizeTypeName(originalName)) + { + return null; + } + + return base.BuildCustomCodeView(originalName, typeNamespace) ?? + base.BuildCustomCodeView(originalName.NormalizeCSharpAcronyms(), typeNamespace); + } + + private protected override TypeProvider? BuildLastContractView(string? generatedTypeName = null, string? generatedTypeNamespace = null) + { + var typeNamespace = generatedTypeNamespace ?? CustomCodeView?.Type.Namespace ?? BuildNamespace(); + var typeName = generatedTypeName ?? CustomCodeView?.Name ?? BuildName(); + var lastContractView = base.BuildLastContractView(typeName, typeNamespace); + if (lastContractView is not null || _inputModel.IsExactName) + { + return lastContractView; + } + + var originalName = _inputModel.Name.ToIdentifierName(); + if (!originalName.EndsWith("Response", StringComparison.Ordinal) || + originalName == typeName || + typeName != NormalizeTypeName(originalName)) + { + return null; + } + + return base.BuildLastContractView(originalName, typeNamespace) ?? + base.BuildLastContractView(originalName.NormalizeCSharpAcronyms(), typeNamespace); + } + protected override TypeSignatureModifiers BuildDeclarationModifiers() { var customCodeModifiers = CustomCodeView?.DeclarationModifiers ?? TypeSignatureModifiers.None; diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs index 5b0857c3d5a..5dd4bfade24 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs @@ -45,36 +45,10 @@ protected TypeProvider() : this(null) } private protected virtual TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) - { - var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); - var typeName = generatedTypeName ?? BuildName(); - var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; - var customCodeView = sourceInputModel.FindForTypeInCurrentCompilation( - typeNamespace, - typeName, + => CodeModelGenerator.Instance.SourceInputModel.FindForTypeInCurrentCompilation( + generatedTypeNamespace ?? BuildNamespace(), + generatedTypeName ?? BuildName(), _declaringTypeName.Value); - if (customCodeView is not null || this is not ModelProvider || _inputType is null || _inputType.IsExactName) - { - return customCodeView; - } - - var originalName = _inputType.Name.ToIdentifierName(); - if (!originalName.EndsWith("Response", StringComparison.Ordinal) || - originalName == typeName || - typeName != NormalizeTypeName(originalName)) - { - return null; - } - - return sourceInputModel.FindForTypeInCurrentCompilation( - typeNamespace, - originalName, - _declaringTypeName.Value) ?? - sourceInputModel.FindForTypeInCurrentCompilation( - typeNamespace, - originalName.NormalizeCSharpAcronyms(), - _declaringTypeName.Value); - } private protected virtual TypeProvider? BuildLastContractView(string? generatedTypeName = null, string? generatedTypeNamespace = null) { @@ -90,7 +64,7 @@ protected TypeProvider() : this(null) } var originalName = _inputType.Name.ToIdentifierName(); - var normalizedOriginalName = NormalizeTypeName(originalName); + var normalizedOriginalName = originalName.NormalizeCSharpAcronyms(); if (normalizedOriginalName == originalName || typeName != normalizedOriginalName) { return null; @@ -99,11 +73,7 @@ protected TypeProvider() : this(null) return CodeModelGenerator.Instance.SourceInputModel.FindForTypeInLastContract( typeNamespace, originalName, - _declaringTypeName.Value) ?? - CodeModelGenerator.Instance.SourceInputModel.FindForTypeInLastContract( - typeNamespace, - originalName.NormalizeCSharpAcronyms(), - _declaringTypeName.Value); + _declaringTypeName.Value); } private static string? GetDeclaringTypeName(TypeProvider? declaringTypeProvider) @@ -791,7 +761,7 @@ protected string NormalizeTypeNameForNewContract(string name) return lastContractType is null ? normalizedName : name; } - private string NormalizeTypeName(string name) + private protected string NormalizeTypeName(string name) { var normalizedName = name.NormalizeCSharpAcronyms(); const string responseSuffix = "Response"; From dbba17b1ec81a0437c3eb279217d17a89d444a96 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 20:33:20 +0000 Subject: [PATCH 6/9] refactor(csharp): keep response suffix normalization in ModelProvider Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ModelProvider.cs | 75 ++++++++++++++++++- .../src/Providers/TypeProvider.cs | 72 +----------------- 2 files changed, 75 insertions(+), 72 deletions(-) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs index 5be9fae6bb4..a3ade21f65b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs @@ -21,6 +21,7 @@ namespace Microsoft.TypeSpec.Generator.Providers public class ModelProvider : TypeProvider { private const string AdditionalBinaryDataPropsFieldDescription = "Keeps track of any properties unknown to the library."; + private const string ResponseSuffix = "Response"; private readonly InputModelType _inputModel; // Note the description cannot be built from the constructor as it would lead to a circular dependency between the base // and derived models resulting in a stack overflow. @@ -317,6 +318,76 @@ protected override string BuildName() return NormalizeTypeNameForNewContract(_inputModel.Name.ToIdentifierName()); } + private protected override string NormalizeTypeName(string name) + { + var normalizedName = base.NormalizeTypeName(name); + if (!normalizedName.EndsWith(ResponseSuffix, StringComparison.Ordinal)) + { + return normalizedName; + } + + var typeNamespace = BuildNamespace(); + var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + if (sourceInputModel.FindForTypeInCurrentCompilation(typeNamespace, normalizedName, DeclaringTypeName) is not null || + sourceInputModel.FindForTypeInLastContract(typeNamespace, normalizedName, DeclaringTypeName) is not null) + { + return normalizedName; + } + + var resultName = $"{normalizedName[..^ResponseSuffix.Length]}Result"; + var inputNamespace = CodeModelGenerator.Instance.InputLibrary.InputNamespace; + // Model and enum files share a flat output directory, even across namespaces. + return inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace)) || + inputNamespace.Enums.Any(@enum => HasConflictingName(@enum, @enum.Namespace)) || + inputNamespace.Clients.Any(HasConflictingClientName) + ? normalizedName + : resultName; + + bool HasConflictingName(InputType inputType, string inputTypeNamespace) + { + if (inputType == _inputModel) + { + return false; + } + + var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); + var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); + var customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, otherName); + if (customType is null && !inputType.IsExactName) + { + var normalizedOtherName = otherName.NormalizeCSharpAcronyms(); + customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, normalizedOtherName); + if (sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) + { + otherName = normalizedOtherName; + if (customType is null && inputType is InputModelType && + otherName.EndsWith(ResponseSuffix, StringComparison.Ordinal) && + sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) + { + customType = sourceInputModel.FindForTypeInCurrentCompilation( + otherNamespace, $"{otherName[..^ResponseSuffix.Length]}Result"); + } + } + } + + return string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase) || + string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase); + } + + bool HasConflictingClientName(InputClient client) + { + var clientNamespace = string.IsNullOrEmpty(client.Namespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(client.Namespace); + var clientName = client.IsExactName ? client.Name : client.Name.ToIdentifierName(); + var customType = sourceInputModel.FindForTypeInCurrentCompilation(clientNamespace, clientName); + return (customType?.Type.Namespace ?? clientNamespace) == typeNamespace && + (customType?.Name ?? clientName) == resultName; + } + } + private protected override TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) { var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); @@ -328,7 +399,7 @@ protected override string BuildName() } var originalName = _inputModel.Name.ToIdentifierName(); - if (!originalName.EndsWith("Response", StringComparison.Ordinal) || + if (!originalName.EndsWith(ResponseSuffix, StringComparison.Ordinal) || originalName == typeName || typeName != NormalizeTypeName(originalName)) { @@ -350,7 +421,7 @@ protected override string BuildName() } var originalName = _inputModel.Name.ToIdentifierName(); - if (!originalName.EndsWith("Response", StringComparison.Ordinal) || + if (!originalName.EndsWith(ResponseSuffix, StringComparison.Ordinal) || originalName == typeName || typeName != NormalizeTypeName(originalName)) { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs index 5dd4bfade24..52e2fb28618 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/TypeProvider.cs @@ -24,6 +24,7 @@ public abstract class TypeProvider private Lazy _canonicalView; private Lazy _specView; private Lazy _declaringTypeName; + private protected string? DeclaringTypeName => _declaringTypeName.Value; private readonly InputType? _inputType; private readonly Dictionary _generatedPropertiesBySpecName = new(StringComparer.Ordinal); @@ -761,76 +762,7 @@ protected string NormalizeTypeNameForNewContract(string name) return lastContractType is null ? normalizedName : name; } - private protected string NormalizeTypeName(string name) - { - var normalizedName = name.NormalizeCSharpAcronyms(); - const string responseSuffix = "Response"; - if (this is not ModelProvider || !normalizedName.EndsWith(responseSuffix, StringComparison.Ordinal)) - { - return normalizedName; - } - - var typeNamespace = BuildNamespace(); - var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; - if (sourceInputModel.FindForTypeInCurrentCompilation(typeNamespace, normalizedName, _declaringTypeName.Value) is not null || - sourceInputModel.FindForTypeInLastContract(typeNamespace, normalizedName, _declaringTypeName.Value) is not null) - { - return normalizedName; - } - - var resultName = $"{normalizedName[..^responseSuffix.Length]}Result"; - var inputNamespace = CodeModelGenerator.Instance.InputLibrary.InputNamespace; - // Model and enum files share a flat output directory, even across namespaces. - return inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace)) || - inputNamespace.Enums.Any(@enum => HasConflictingName(@enum, @enum.Namespace)) || - inputNamespace.Clients.Any(HasConflictingClientName) - ? normalizedName - : resultName; - - bool HasConflictingName(InputType inputType, string inputTypeNamespace) - { - if (inputType == _inputType) - { - return false; - } - - var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) - ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace - : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); - var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); - var customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, otherName); - if (customType is null && !inputType.IsExactName) - { - var normalizedOtherName = otherName.NormalizeCSharpAcronyms(); - customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, normalizedOtherName); - if (sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) - { - otherName = normalizedOtherName; - if (customType is null && inputType is InputModelType && - otherName.EndsWith(responseSuffix, StringComparison.Ordinal) && - sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) - { - customType = sourceInputModel.FindForTypeInCurrentCompilation( - otherNamespace, $"{otherName[..^responseSuffix.Length]}Result"); - } - } - } - - return string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase) || - string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase); - } - - bool HasConflictingClientName(InputClient client) - { - var clientNamespace = string.IsNullOrEmpty(client.Namespace) - ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace - : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(client.Namespace); - var clientName = client.IsExactName ? client.Name : client.Name.ToIdentifierName(); - var customType = sourceInputModel.FindForTypeInCurrentCompilation(clientNamespace, clientName); - return (customType?.Type.Namespace ?? clientNamespace) == typeNamespace && - (customType?.Name ?? clientName) == resultName; - } - } + private protected virtual string NormalizeTypeName(string name) => name.NormalizeCSharpAcronyms(); /// /// Resets only the cached methods so they are rebuilt on next access. From 2500c9a6305724ae90115fd401b484709a5c3338 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 20:55:34 +0000 Subject: [PATCH 7/9] refactor(csharp): reduce naming collision lookups and cover compatibility Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ModelProvider.cs | 97 +++++++++++-------- .../ModelProviders/ModelProviderTests.cs | 66 +++++++++++++ .../IPResponse.cs | 6 ++ .../WidgetResult.cs | 9 ++ 4 files changed, 139 insertions(+), 39 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel(LastContract)/IPResponse.cs create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel/WidgetResult.cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs index a3ade21f65b..0d175bc2b33 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs @@ -337,55 +337,74 @@ private protected override string NormalizeTypeName(string name) var resultName = $"{normalizedName[..^ResponseSuffix.Length]}Result"; var inputNamespace = CodeModelGenerator.Instance.InputLibrary.InputNamespace; // Model and enum files share a flat output directory, even across namespaces. - return inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace)) || - inputNamespace.Enums.Any(@enum => HasConflictingName(@enum, @enum.Namespace)) || - inputNamespace.Clients.Any(HasConflictingClientName) + return inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace, resultName)) || + inputNamespace.Enums.Any(@enum => HasConflictingName(@enum, @enum.Namespace, resultName)) || + inputNamespace.Clients.Any(client => HasConflictingName(client, typeNamespace, resultName)) ? normalizedName : resultName; + } - bool HasConflictingName(InputType inputType, string inputTypeNamespace) + private bool HasConflictingName(InputType inputType, string inputTypeNamespace, string resultName) + { + if (inputType == _inputModel) { - if (inputType == _inputModel) - { - return false; - } + return false; + } - var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) - ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace - : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); - var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); - var customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, otherName); - if (customType is null && !inputType.IsExactName) - { - var normalizedOtherName = otherName.NormalizeCSharpAcronyms(); - customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, normalizedOtherName); - if (sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) - { - otherName = normalizedOtherName; - if (customType is null && inputType is InputModelType && - otherName.EndsWith(ResponseSuffix, StringComparison.Ordinal) && - sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null) - { - customType = sourceInputModel.FindForTypeInCurrentCompilation( - otherNamespace, $"{otherName[..^ResponseSuffix.Length]}Result"); - } - } - } + var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); + // Acronym normalization only changes casing, so this also covers the normalized filename. + if (string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } - return string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase) || - string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase); + var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + if (sourceInputModel.Customization is null) + { + return false; + } + + var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); + var customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, otherName); + if (customType is not null || inputType.IsExactName) + { + return string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase); } - bool HasConflictingClientName(InputClient client) + var normalizedOtherName = otherName.NormalizeCSharpAcronyms(); + if (normalizedOtherName != otherName) + { + customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, normalizedOtherName); + } + if (customType is not null) { - var clientNamespace = string.IsNullOrEmpty(client.Namespace) - ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace - : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(client.Namespace); - var clientName = client.IsExactName ? client.Name : client.Name.ToIdentifierName(); - var customType = sourceInputModel.FindForTypeInCurrentCompilation(clientNamespace, clientName); - return (customType?.Type.Namespace ?? clientNamespace) == typeNamespace && - (customType?.Name ?? clientName) == resultName; + return string.Equals(customType.Name, resultName, StringComparison.OrdinalIgnoreCase); } + + if (inputType is not InputModelType || !normalizedOtherName.EndsWith(ResponseSuffix, StringComparison.Ordinal)) + { + return false; + } + + customType = sourceInputModel.FindForTypeInCurrentCompilation( + otherNamespace, $"{normalizedOtherName[..^ResponseSuffix.Length]}Result"); + return string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase) && + sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null && + (normalizedOtherName == otherName || + sourceInputModel.FindForTypeInLastContract(otherNamespace, normalizedOtherName) is null); + } + + private bool HasConflictingName(InputClient client, string typeNamespace, string resultName) + { + var clientNamespace = string.IsNullOrEmpty(client.Namespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(client.Namespace); + var clientName = client.IsExactName ? client.Name : client.Name.ToIdentifierName(); + var customType = CodeModelGenerator.Instance.SourceInputModel.FindForTypeInCurrentCompilation(clientNamespace, clientName); + return (customType?.Type.Namespace ?? clientNamespace) == typeNamespace && + (customType?.Name ?? clientName) == resultName; } private protected override TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs index b8ce1f6ab7a..de36800aef6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs @@ -154,6 +154,51 @@ public void TestBuildName_ResponseSuffix(string inputName, bool isExactName, str Assert.AreEqual("ServiceResponse", model.Properties[0].Name); } + [TestCase("WidgetResponse", false, "WidgetResult")] + [TestCase("WidgetResponse", true, "WidgetResponse")] + [TestCase("IpResponse", false, "IPResult")] + [TestCase("IpResponse", true, "IpResponse")] + [TestCase("widget_response", false, "WidgetResult")] + [TestCase("widget_response", true, "widget_response")] + public void TestBuildName_ResponseSuffixHonorsExactName(string inputName, bool isExactName, string expectedName) + { + var inputModel = InputFactory.Model(inputName, isExactName: isExactName); + MockHelpers.LoadMockGenerator(inputModelTypes: [inputModel]); + + var model = CodeModelGenerator.Instance.TypeFactory.CreateModel(inputModel)!; + + Assert.AreEqual(expectedName, model.Name); + Assert.AreEqual($"{expectedName}.cs", Path.GetFileName(model.RelativeFilePath)); + model.Reset(); + Assert.AreEqual(expectedName, model.Name); + } + + [TestCase("WidgetResponse", false, "WidgetResult")] + [TestCase("WidgetResponse", true, "WidgetResponse")] + [TestCase("IpResponse", false, "IPResult")] + [TestCase("IpResponse", true, "IPResponse")] + [TestCase("DbResponse", false, "DBResult")] + [TestCase("DbResponse", true, "DbResponse")] + public async Task TestBuildName_ResponseSuffixHonorsLastContract( + string inputName, bool hasLastContract, string expectedName) + { + var inputModel = InputFactory.Model(inputName); + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [inputModel], + lastContractCompilation: hasLastContract + ? async () => await Helpers.GetCompilationFromDirectoryAsync( + method: nameof(TestBuildName_ResponseSuffixPreservesExistingName)) + : null); + + var model = CodeModelGenerator.Instance.TypeFactory.CreateModel(inputModel)!; + + Assert.AreEqual(expectedName, model.Name); + Assert.AreEqual(hasLastContract, model.LastContractView is not null); + Assert.IsNull(model.CustomCodeView); + model.Reset(); + Assert.AreEqual(expectedName, model.Name); + } + [TestCase("WidgetResponse", "WidgetResponse", false, false)] [TestCase("WidgetResponse", "WidgetResponse", true, false)] [TestCase("WidgetResponse", "WidgetResponse", false, true)] @@ -277,6 +322,27 @@ await MockHelpers.LoadMockGeneratorAsync( CollectionAssert.AreEquivalent(new[] { "WidgetResponse", "WidgetResult" }, providers.Select(p => p.Name)); } + [TestCase("IpResponse", false)] + [TestCase("IpResponse", true)] + [TestCase("IPResponse", false)] + [TestCase("IPResponse", true)] + public async Task TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel( + string inputName, bool reverseOrder) + { + var widget = InputFactory.Model("WidgetResponse"); + var shipped = InputFactory.Model(inputName); + InputModelType[] models = reverseOrder ? [shipped, widget] : [widget, shipped]; + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: models, + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync(), + lastContractCompilation: async () => await Helpers.GetCompilationFromDirectoryAsync( + parameters: "LastContract")); + + var providers = models.Select(m => CodeModelGenerator.Instance.TypeFactory.CreateModel(m)!).ToArray(); + + CollectionAssert.AreEquivalent(new[] { "WidgetResult", "IPResponse" }, providers.Select(p => p.Name)); + } + [Test] public async Task TestBuildName_BackCompatTakesPrecedenceOverAcronymNormalization() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel(LastContract)/IPResponse.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel(LastContract)/IPResponse.cs new file mode 100644 index 00000000000..367741363b9 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel(LastContract)/IPResponse.cs @@ -0,0 +1,6 @@ +namespace Sample.Models +{ + public partial class IPResponse + { + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel/WidgetResult.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel/WidgetResult.cs new file mode 100644 index 00000000000..9fb6204f4f4 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixIgnoresResultAliasForShippedModel/WidgetResult.cs @@ -0,0 +1,9 @@ +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + [CodeGenType("IPResult")] + public partial class WidgetResult + { + } +} From 9d543b68f083e167cef03fdde1560585e4fe0057 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 21:37:33 +0000 Subject: [PATCH 8/9] refactor(csharp): consolidate response naming lookup helpers Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ModelProvider.cs | 133 +++++++++++------- .../ModelProviders/ModelProviderTests.cs | 17 ++- .../FooModel.cs | 9 ++ 3 files changed, 107 insertions(+), 52 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomResponseRenameWithoutLastContract/FooModel.cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs index 0d175bc2b33..5f15cb691bf 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs @@ -336,13 +336,16 @@ private protected override string NormalizeTypeName(string name) var resultName = $"{normalizedName[..^ResponseSuffix.Length]}Result"; var inputNamespace = CodeModelGenerator.Instance.InputLibrary.InputNamespace; + return HasConflictingResultName(inputNamespace, typeNamespace, resultName) + ? normalizedName + : resultName; + } + + private bool HasConflictingResultName(InputNamespace inputNamespace, string typeNamespace, string resultName) // Model and enum files share a flat output directory, even across namespaces. - return inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace, resultName)) || + => inputNamespace.Models.Any(model => HasConflictingName(model, model.Namespace, resultName)) || inputNamespace.Enums.Any(@enum => HasConflictingName(@enum, @enum.Namespace, resultName)) || - inputNamespace.Clients.Any(client => HasConflictingName(client, typeNamespace, resultName)) - ? normalizedName - : resultName; - } + inputNamespace.Clients.Any(client => HasConflictingName(client, typeNamespace, resultName)); private bool HasConflictingName(InputType inputType, string inputTypeNamespace, string resultName) { @@ -367,33 +370,10 @@ private bool HasConflictingName(InputType inputType, string inputTypeNamespace, var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); - var customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, otherName); - if (customType is not null || inputType.IsExactName) - { - return string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase); - } - - var normalizedOtherName = otherName.NormalizeCSharpAcronyms(); - if (normalizedOtherName != otherName) - { - customType = sourceInputModel.FindForTypeInCurrentCompilation(otherNamespace, normalizedOtherName); - } - if (customType is not null) - { - return string.Equals(customType.Name, resultName, StringComparison.OrdinalIgnoreCase); - } - - if (inputType is not InputModelType || !normalizedOtherName.EndsWith(ResponseSuffix, StringComparison.Ordinal)) - { - return false; - } - - customType = sourceInputModel.FindForTypeInCurrentCompilation( - otherNamespace, $"{normalizedOtherName[..^ResponseSuffix.Length]}Result"); - return string.Equals(customType?.Name, resultName, StringComparison.OrdinalIgnoreCase) && - sourceInputModel.FindForTypeInLastContract(otherNamespace, otherName) is null && - (normalizedOtherName == otherName || - sourceInputModel.FindForTypeInLastContract(otherNamespace, normalizedOtherName) is null); + var customType = FindCustomizationType(otherNamespace, GetCustomizationLookupNames(inputType, otherName)); + return customType is { } && + string.Equals(customType.Value.Type.Name, resultName, StringComparison.OrdinalIgnoreCase) && + (!customType.Value.IsResultAlias || !HasLastContractName(otherNamespace, otherName)); } private bool HasConflictingName(InputClient client, string typeNamespace, string resultName) @@ -407,26 +387,65 @@ private bool HasConflictingName(InputClient client, string typeNamespace, string (customType?.Name ?? clientName) == resultName; } - private protected override TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) + private (TypeProvider Type, bool IsResultAlias)? FindCustomizationType( + string typeNamespace, + IEnumerable<(string Name, bool IsResultAlias)> lookupNames) { - var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); - var typeName = generatedTypeName ?? BuildName(); - var customCodeView = base.BuildCustomCodeView(typeName, typeNamespace); - if (customCodeView is not null || _inputModel.IsExactName) + var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + foreach (var lookupName in lookupNames) { - return customCodeView; + var customType = sourceInputModel.FindForTypeInCurrentCompilation(typeNamespace, lookupName.Name); + if (customType is not null) + { + return (customType, lookupName.IsResultAlias); + } } - var originalName = _inputModel.Name.ToIdentifierName(); - if (!originalName.EndsWith(ResponseSuffix, StringComparison.Ordinal) || - originalName == typeName || - typeName != NormalizeTypeName(originalName)) + return null; + } + + private static IEnumerable<(string Name, bool IsResultAlias)> GetCustomizationLookupNames(InputType inputType, string name) + { + yield return (name, false); + if (inputType.IsExactName) { - return null; + yield break; } - return base.BuildCustomCodeView(originalName, typeNamespace) ?? - base.BuildCustomCodeView(originalName.NormalizeCSharpAcronyms(), typeNamespace); + var normalizedName = name.NormalizeCSharpAcronyms(); + if (normalizedName != name) + { + yield return (normalizedName, false); + } + + if (inputType is InputModelType && normalizedName.EndsWith(ResponseSuffix, StringComparison.Ordinal)) + { + yield return ($"{normalizedName[..^ResponseSuffix.Length]}Result", true); + } + } + + private bool HasLastContractName(string typeNamespace, string name) + { + var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + if (sourceInputModel.FindForTypeInLastContract(typeNamespace, name) is not null) + { + return true; + } + + var normalizedName = name.NormalizeCSharpAcronyms(); + return normalizedName != name && + sourceInputModel.FindForTypeInLastContract(typeNamespace, normalizedName) is not null; + } + + private protected override TypeProvider? BuildCustomCodeView(string? generatedTypeName = null, string? generatedTypeNamespace = null) + { + var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); + var typeName = generatedTypeName ?? BuildName(); + var customCodeView = base.BuildCustomCodeView(typeName, typeNamespace); + return customCodeView ?? BuildResponseSuffixFallbackView( + typeName, + typeNamespace, + (name, ns) => base.BuildCustomCodeView(name, ns)); } private protected override TypeProvider? BuildLastContractView(string? generatedTypeName = null, string? generatedTypeNamespace = null) @@ -434,21 +453,33 @@ private bool HasConflictingName(InputClient client, string typeNamespace, string var typeNamespace = generatedTypeNamespace ?? CustomCodeView?.Type.Namespace ?? BuildNamespace(); var typeName = generatedTypeName ?? CustomCodeView?.Name ?? BuildName(); var lastContractView = base.BuildLastContractView(typeName, typeNamespace); - if (lastContractView is not null || _inputModel.IsExactName) + return lastContractView ?? BuildResponseSuffixFallbackView( + typeName, + typeNamespace, + (name, ns) => base.BuildLastContractView(name, ns)); + } + + private TypeProvider? BuildResponseSuffixFallbackView( + string typeName, + string typeNamespace, + Func buildView) + { + if (_inputModel.IsExactName) { - return lastContractView; + return null; } var originalName = _inputModel.Name.ToIdentifierName(); - if (!originalName.EndsWith(ResponseSuffix, StringComparison.Ordinal) || + var normalizedOriginalName = originalName.NormalizeCSharpAcronyms(); + if (!normalizedOriginalName.EndsWith(ResponseSuffix, StringComparison.Ordinal) || originalName == typeName || - typeName != NormalizeTypeName(originalName)) + typeName != $"{normalizedOriginalName[..^ResponseSuffix.Length]}Result") { return null; } - return base.BuildLastContractView(originalName, typeNamespace) ?? - base.BuildLastContractView(originalName.NormalizeCSharpAcronyms(), typeNamespace); + return buildView(originalName, typeNamespace) ?? + (normalizedOriginalName == originalName ? null : buildView(normalizedOriginalName, typeNamespace)); } protected override TypeSignatureModifiers BuildDeclarationModifiers() diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs index de36800aef6..baa32bcb710 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs @@ -249,6 +249,21 @@ await MockHelpers.LoadMockGeneratorAsync( Assert.IsNotNull(model.CustomCodeView); } + [Test] + public async Task TestBuildName_ResponseSuffixPreservesCustomResponseRenameWithoutLastContract() + { + var inputModel = InputFactory.Model("FooResponse"); + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [inputModel], + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + var model = CodeModelGenerator.Instance.TypeFactory.CreateModel(inputModel)!; + + Assert.AreEqual("FooModel", model.Name); + Assert.IsNotNull(model.CustomCodeView); + Assert.IsNull(model.LastContractView); + } + [TestCase(false, false, "WidgetResult", false)] [TestCase(false, true, "WidgetResult", false)] [TestCase(true, false, "WidgetResult", false)] @@ -3767,7 +3782,7 @@ public void TestBuildRawDataField_BasedOnUsage(InputModelTypeUsage usage, bool s [TearDown] public void CleanUp() { - if(_projectDir != null && Directory.Exists(_projectDir)) + if (_projectDir != null && Directory.Exists(_projectDir)) { Directory.Delete(_projectDir, true); } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomResponseRenameWithoutLastContract/FooModel.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomResponseRenameWithoutLastContract/FooModel.cs new file mode 100644 index 00000000000..919cf266b9f --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixPreservesCustomResponseRenameWithoutLastContract/FooModel.cs @@ -0,0 +1,9 @@ +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + [CodeGenType("FooResponse")] + public partial class FooModel + { + } +} From 6584968190663377690849dac8e34099ca6e99ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 18 Sep 2026 21:46:31 +0000 Subject: [PATCH 9/9] fix(csharp): honor customized result model names Co-authored-by: jorgerangel-msft <102122018+jorgerangel-msft@users.noreply.github.com> --- .../src/Providers/ModelProvider.cs | 55 +++++++++++++++---- .../ModelProviders/ModelProviderTests.cs | 13 +++++ .../CustomWidgetResult.cs | 9 +++ 3 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAllowsCustomizedModelResultName/CustomWidgetResult.cs diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs index 5f15cb691bf..1c00d3d1c40 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/Providers/ModelProvider.cs @@ -355,24 +355,24 @@ private bool HasConflictingName(InputType inputType, string inputTypeNamespace, } var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); - // Acronym normalization only changes casing, so this also covers the normalized filename. - if (string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - var sourceInputModel = CodeModelGenerator.Instance.SourceInputModel; + // Acronym normalization only changes casing, so this also covers the normalized filename. + var hasMatchingInputName = string.Equals(otherName, resultName, StringComparison.OrdinalIgnoreCase); if (sourceInputModel.Customization is null) { - return false; + return hasMatchingInputName; } var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); var customType = FindCustomizationType(otherNamespace, GetCustomizationLookupNames(inputType, otherName)); - return customType is { } && - string.Equals(customType.Value.Type.Name, resultName, StringComparison.OrdinalIgnoreCase) && + if (customType is null) + { + return hasMatchingInputName; + } + + return string.Equals(customType.Value.Type.Name, resultName, StringComparison.OrdinalIgnoreCase) && (!customType.Value.IsResultAlias || !HasLastContractName(otherNamespace, otherName)); } @@ -441,13 +441,48 @@ private bool HasLastContractName(string typeNamespace, string name) { var typeNamespace = generatedTypeNamespace ?? BuildNamespace(); var typeName = generatedTypeName ?? BuildName(); - var customCodeView = base.BuildCustomCodeView(typeName, typeNamespace); + var customCodeView = HasCustomizedSiblingInputName(typeName) + ? null + : base.BuildCustomCodeView(typeName, typeNamespace); return customCodeView ?? BuildResponseSuffixFallbackView( typeName, typeNamespace, (name, ns) => base.BuildCustomCodeView(name, ns)); } + private bool HasCustomizedSiblingInputName(string typeName) + { + if (CodeModelGenerator.Instance.SourceInputModel.Customization is null) + { + return false; + } + + var inputNamespace = CodeModelGenerator.Instance.InputLibrary.InputNamespace; + return inputNamespace.Models.Any(model => HasCustomizedSiblingInputName(model, model.Namespace, typeName)) || + inputNamespace.Enums.Any(@enum => HasCustomizedSiblingInputName(@enum, @enum.Namespace, typeName)); + } + + private bool HasCustomizedSiblingInputName(InputType inputType, string inputTypeNamespace, string typeName) + { + if (inputType == _inputModel) + { + return false; + } + + var otherName = inputType.IsExactName ? inputType.Name : inputType.Name.ToIdentifierName(); + if (!string.Equals(otherName, typeName, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + var otherNamespace = string.IsNullOrEmpty(inputTypeNamespace) + ? CodeModelGenerator.Instance.TypeFactory.PrimaryNamespace + : CodeModelGenerator.Instance.TypeFactory.GetCleanNameSpace(inputTypeNamespace); + var customType = FindCustomizationType(otherNamespace, GetCustomizationLookupNames(inputType, otherName)); + return customType is not null && + !string.Equals(customType.Value.Type.Name, typeName, StringComparison.OrdinalIgnoreCase); + } + private protected override TypeProvider? BuildLastContractView(string? generatedTypeName = null, string? generatedTypeNamespace = null) { var typeNamespace = generatedTypeNamespace ?? CustomCodeView?.Type.Namespace ?? BuildNamespace(); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs index baa32bcb710..98490dc7204 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/ModelProviderTests.cs @@ -321,6 +321,19 @@ await MockHelpers.LoadMockGeneratorAsync( Assert.AreEqual("WidgetResult", CodeModelGenerator.Instance.TypeFactory.CreateModel(other)!.Name); } + [Test] + public async Task TestBuildName_ResponseSuffixAllowsCustomizedModelResultName() + { + var response = InputFactory.Model("WidgetResponse"); + var result = InputFactory.Model("WidgetResult"); + await MockHelpers.LoadMockGeneratorAsync( + inputModelTypes: [response, result], + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync()); + + Assert.AreEqual("WidgetResult", CodeModelGenerator.Instance.TypeFactory.CreateModel(response)!.Name); + Assert.AreEqual("CustomWidgetResult", CodeModelGenerator.Instance.TypeFactory.CreateModel(result)!.Name); + } + [TestCase(false)] [TestCase(true)] public async Task TestBuildName_ResponseSuffixAvoidsResultCustomizationAliasCollision(bool reverseOrder) diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAllowsCustomizedModelResultName/CustomWidgetResult.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAllowsCustomizedModelResultName/CustomWidgetResult.cs new file mode 100644 index 00000000000..df1a4cdeee7 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/Providers/ModelProviders/TestData/ModelProviderTests/TestBuildName_ResponseSuffixAllowsCustomizedModelResultName/CustomWidgetResult.cs @@ -0,0 +1,9 @@ +using Microsoft.TypeSpec.Generator.Customizations; + +namespace Sample.Models +{ + [CodeGenType("WidgetResult")] + public partial class CustomWidgetResult + { + } +}