diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientSettingsProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientSettingsProvider.cs index 0a9d01ecea5..af0741751ea 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientSettingsProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientSettingsProvider.cs @@ -70,7 +70,7 @@ internal ClientSettingsProvider(InputClient inputClient, ClientProvider clientPr internal IReadOnlyList OtherRequiredParams { get; } protected override FormattableString BuildDescription() - => $"Represents the settings used to configure a that can be loaded from an ."; + => $"Represents the settings used to configure a {_clientProvider.Type:C} that can be loaded from an {IConfigurationSectionType:C}."; protected override string BuildRelativeFilePath() => Path.Combine("src", "Generated", $"{Name}.cs"); diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientSettingsProviderTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientSettingsProviderTests.cs index 11e6552c047..4cf2db505d6 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientSettingsProviderTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientSettingsProviderTests.cs @@ -1140,5 +1140,42 @@ await MockHelpers.LoadMockGeneratorAsync( Assert.IsTrue(bodyString.Contains("TenantId"), "BindCore should bind the non-credential parameter 'TenantId'"); } + + [Test] + public async Task TestGeneratedSettings_WithCustomizedBindCore() + { + await MockHelpers.LoadMockGeneratorAsync( + compilation: async () => await Helpers.GetCompilationFromDirectoryAsync(), + configuration: "{\"disable-xml-docs\": false, \"package-name\": \"Sample.Namespace\"}"); + + var inputParameters = new[] + { + InputFactory.EndpointParameter( + "endpoint", + InputPrimitiveType.Url, + scope: InputParameterScope.Client, + isEndpoint: true) + }; + var client = InputFactory.Client("TestClient", clientNamespace: "SampleNamespace", parameters: inputParameters); + var clientProvider = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(client); + Assert.IsNotNull(clientProvider); + + var settingsProvider = clientProvider!.ClientSettings; + Assert.IsNotNull(settingsProvider); + + // BindCore is overridden in custom code, so it should not be generated. + var bindCoreMethod = settingsProvider!.Methods.FirstOrDefault(m => m.Signature.Name == "BindCore"); + Assert.IsNull(bindCoreMethod, "BindCore should not be generated when it is overridden in custom code"); + + var writer = new TypeProviderWriter(settingsProvider); + var file = writer.Write(); + + // Validate the full generated output. Even though BindCore (the only other + // reference to IConfigurationSection) is removed via custom code, the type + // description still references IConfigurationSection, so the + // Microsoft.Extensions.Configuration using must still be emitted. + Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content); + StringAssert.Contains("using Microsoft.Extensions.Configuration;", file.Content); + } } } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientSettingsProviderTests/TestGeneratedSettings_WithCustomizedBindCore.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientSettingsProviderTests/TestGeneratedSettings_WithCustomizedBindCore.cs new file mode 100644 index 00000000000..82379785a61 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientSettingsProviderTests/TestGeneratedSettings_WithCustomizedBindCore.cs @@ -0,0 +1,22 @@ +// + +#nullable disable + +using System; +using System.ClientModel.Primitives; +using System.Diagnostics.CodeAnalysis; +using Microsoft.Extensions.Configuration; + +namespace SampleNamespace +{ + /// Represents the settings used to configure a that can be loaded from an . + [global::System.Diagnostics.CodeAnalysis.ExperimentalAttribute("SCME0002")] + public partial class TestClientSettings : global::System.ClientModel.Primitives.ClientSettings + { + /// Gets or sets the Endpoint. + public global::System.Uri Endpoint { get; set; } + + /// Gets or sets the Options. + public global::SampleNamespace.TestClientOptions Options { get; set; } + } +} diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientSettingsProviderTests/TestGeneratedSettings_WithCustomizedBindCore/TestClientSettings.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientSettingsProviderTests/TestGeneratedSettings_WithCustomizedBindCore/TestClientSettings.cs new file mode 100644 index 00000000000..4840d2028f9 --- /dev/null +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ClientSettingsProviderTests/TestGeneratedSettings_WithCustomizedBindCore/TestClientSettings.cs @@ -0,0 +1,11 @@ +#nullable disable + +using Microsoft.Extensions.Configuration; + +namespace SampleNamespace +{ + public partial class TestClientSettings + { + protected override void BindCore(IConfigurationSection section) { } + } +}