Skip to content

Commit 051d4b8

Browse files
fix(http-client-csharp): use name comparison in HasSettingsParameter (#10269)
CSharpType.Equals fails when comparing generated types against Roslyn-based types from CustomCodeView. Use name comparison since HasSettingsParameter is only called for custom code constructors. Update tests to use async compilations with a custom constructor that takes the settings type, so CustomCodeView is exercised. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 7aa1f34 commit 051d4b8

4 files changed

Lines changed: 41 additions & 20 deletions

File tree

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ClientSettingsProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ internal static bool IsStandardParameterType(CSharpType type)
555555
/// </summary>
556556
internal bool HasSettingsParameter(ConstructorProvider ctor)
557557
{
558-
return ctor.Signature.Parameters.Any(p => p.Type.Equals(Type));
558+
return ctor.Signature.Parameters.Any(p => p.Type.Name == Type.Name);
559559
}
560560
}
561561
}

packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/ClientSettingsProviderTests.cs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,10 +1009,6 @@ private static bool IsSettingsConstructor(ConstructorProvider c) =>
10091009
[Test]
10101010
public async Task TestProperties_IncludesCustomConstructorParameters()
10111011
{
1012-
var singletonField = typeof(ClientOptionsProvider).GetField("_singletonInstance",
1013-
System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
1014-
singletonField?.SetValue(null, null);
1015-
10161012
await MockHelpers.LoadMockGeneratorAsync(
10171013
compilation: async () => await Helpers.GetCompilationFromDirectoryAsync());
10181014

@@ -1034,10 +1030,6 @@ await MockHelpers.LoadMockGeneratorAsync(
10341030
[Test]
10351031
public async Task TestBindCoreMethod_BindsCustomConstructorParameters()
10361032
{
1037-
var singletonField = typeof(ClientOptionsProvider).GetField("_singletonInstance",
1038-
System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
1039-
singletonField?.SetValue(null, null);
1040-
10411033
await MockHelpers.LoadMockGeneratorAsync(
10421034
compilation: async () => await Helpers.GetCompilationFromDirectoryAsync());
10431035

@@ -1058,29 +1050,34 @@ await MockHelpers.LoadMockGeneratorAsync(
10581050
}
10591051

10601052
[Test]
1061-
public void TestSettingsType_DoesNotContainSelfReferentialSettingsProperty()
1053+
public async Task TestSettingsType_DoesNotContainSelfReferentialSettingsProperty()
10621054
{
1063-
var client = InputFactory.Client("TestClient");
1064-
var clientProvider = new ClientProvider(client);
1065-
var settingsProvider = clientProvider.ClientSettings;
1055+
await MockHelpers.LoadMockGeneratorAsync(
1056+
compilation: async () => await Helpers.GetCompilationFromDirectoryAsync());
1057+
1058+
var client = InputFactory.Client("TestClient", clientNamespace: "SampleNamespace");
1059+
var clientProvider = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(client);
1060+
Assert.IsNotNull(clientProvider);
10661061

1062+
var settingsProvider = clientProvider!.ClientSettings;
10671063
Assert.IsNotNull(settingsProvider);
10681064

1069-
// The settings type should not have a property named "Settings" that references itself.
1070-
// This would happen if the generated settings constructor (which takes the settings type
1071-
// as a parameter) is incorrectly treated as a custom constructor.
10721065
var settingsProperty = settingsProvider!.Properties.FirstOrDefault(p => p.Name == "Settings");
10731066
Assert.IsNull(settingsProperty,
10741067
"Settings type should not contain a self-referential 'Settings' property");
10751068
}
10761069

10771070
[Test]
1078-
public void TestBindCoreMethod_DoesNotBindSettingsParameter()
1071+
public async Task TestBindCoreMethod_DoesNotBindSettingsParameter()
10791072
{
1080-
var client = InputFactory.Client("TestClient");
1081-
var clientProvider = new ClientProvider(client);
1082-
var settingsProvider = clientProvider.ClientSettings;
1073+
await MockHelpers.LoadMockGeneratorAsync(
1074+
compilation: async () => await Helpers.GetCompilationFromDirectoryAsync());
1075+
1076+
var client = InputFactory.Client("TestClient", clientNamespace: "SampleNamespace");
1077+
var clientProvider = ScmCodeModelGenerator.Instance.TypeFactory.CreateClient(client);
1078+
Assert.IsNotNull(clientProvider);
10831079

1080+
var settingsProvider = clientProvider!.ClientSettings;
10841081
Assert.IsNotNull(settingsProvider);
10851082

10861083
var bindCoreMethod = settingsProvider!.Methods.FirstOrDefault(m => m.Signature.Name == "BindCore");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#nullable disable
2+
3+
using System.Diagnostics.CodeAnalysis;
4+
5+
namespace SampleNamespace
6+
{
7+
public partial class TestClient
8+
{
9+
[Experimental("SCME0002")]
10+
public TestClient(TestClientSettings settings) { }
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#nullable disable
2+
3+
using System.Diagnostics.CodeAnalysis;
4+
5+
namespace SampleNamespace
6+
{
7+
public partial class TestClient
8+
{
9+
[Experimental("SCME0002")]
10+
public TestClient(TestClientSettings settings) { }
11+
}
12+
}

0 commit comments

Comments
 (0)