From 72bbe03e77ecfcf2fa4889ffae522c1cd47bef5e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 20 May 2024 12:38:45 +0000 Subject: [PATCH 1/9] Update .NET SDK Update .NET SDK to version 9.0.100-preview.5.24269.5. --- updated-dependencies: - dependency-name: Microsoft.NET.Sdk dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: github-actions[bot] --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 0b590b354097..53cb5a1fb8ab 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "9.0.100-preview.5.24262.2" + "version": "9.0.100-preview.5.24269.5" }, "tools": { - "dotnet": "9.0.100-preview.5.24262.2", + "dotnet": "9.0.100-preview.5.24269.5", "runtimes": { "dotnet/x86": [ "$(MicrosoftNETCoreBrowserDebugHostTransportVersion)" From 527b090994ff2492bd969e7ed7ccaf1cb8abe6ad Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Fri, 24 May 2024 08:42:05 +0200 Subject: [PATCH 2/9] changing the condition to check for SimpleNameSyntax, which is a base class for both GenericNameSyntax and IdentifierNameSyntax --- .../src/HubClientProxyGenerator.Parser.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs index 1dd1655dd864..f9d15a47b984 100644 --- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs +++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs @@ -136,11 +136,9 @@ private static bool IsExtensionClassSignatureValid(ClassDeclarationSyntax syntax internal static bool IsSyntaxTargetForGeneration(SyntaxNode node) => node is MemberAccessExpressionSyntax { - Name: GenericNameSyntax - { - Arity: 1 - } - }; + Name: SimpleNameSyntax + } + internal static MemberAccessExpressionSyntax? GetSemanticTargetForGeneration(GeneratorSyntaxContext context) { From f34fdbe1240b5eb95ff352d8de0432adece8b97d Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Fri, 24 May 2024 08:43:30 +0200 Subject: [PATCH 3/9] By explicitly checking for SimpleNameSyntax, we ensure that both generic and inferred cases are handled. --- .../src/HubClientProxyGenerator.Parser.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs index f9d15a47b984..b1c76367a686 100644 --- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs +++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs @@ -249,10 +249,11 @@ internal SourceGenerationSpec Parse(ImmutableArray meth var argModel = _compilation.GetSemanticModel(argType.SyntaxTree); symbol = (ITypeSymbol)argModel.GetSymbolInfo(argType).Symbol; } - else if (memberAccess.Name is not GenericNameSyntax - && memberAccess.Parent.ChildNodes().FirstOrDefault(x => x is ArgumentListSyntax) is - ArgumentListSyntax - { Arguments: { Count: 1 } } als) + else if (memberAccess.Name is SimpleNameSyntax + && memberAccess.Parent.ChildNodes().FirstOrDefault(x => x is ArgumentListSyntax) is + ArgumentListSyntax + { Arguments: { Count: 1 } } als) + { // Method isn't using generic syntax so inspect first expression in arguments to deduce the type var argModel = _compilation.GetSemanticModel(als.Arguments[0].Expression.SyntaxTree); From 2d6a58fa55606bb389d8636aefb0a3eb72dee784 Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Fri, 24 May 2024 10:11:01 +0200 Subject: [PATCH 4/9] Removing extra line --- .../Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs index b1c76367a686..86904dd7a1b8 100644 --- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs +++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs @@ -139,7 +139,6 @@ internal static bool IsSyntaxTargetForGeneration(SyntaxNode node) => node is Mem Name: SimpleNameSyntax } - internal static MemberAccessExpressionSyntax? GetSemanticTargetForGeneration(GeneratorSyntaxContext context) { var memberAccessExpressionSyntax = (MemberAccessExpressionSyntax)context.Node; From d95abf8ef8762043632674df71a381b8b5cc7e6d Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Fri, 24 May 2024 10:24:46 +0200 Subject: [PATCH 5/9] Fixing IsSyntaxTargetForGeneration signature --- .../src/HubClientProxyGenerator.Parser.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs index 86904dd7a1b8..b17988dbd331 100644 --- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs +++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs @@ -134,10 +134,7 @@ private static bool IsExtensionClassSignatureValid(ClassDeclarationSyntax syntax return true; } - internal static bool IsSyntaxTargetForGeneration(SyntaxNode node) => node is MemberAccessExpressionSyntax - { - Name: SimpleNameSyntax - } + internal static bool IsSyntaxTargetForGeneration(SyntaxNode node) => node is MemberAccessExpressionSyntax{ Name: SimpleNameSyntax }; internal static MemberAccessExpressionSyntax? GetSemanticTargetForGeneration(GeneratorSyntaxContext context) { From 316d2088235d682438e42ccd472e9f19daa54235 Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Thu, 30 May 2024 17:31:06 +0200 Subject: [PATCH 6/9] Removing extra line --- .../Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs index b17988dbd331..6ed0b35de46d 100644 --- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs +++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs @@ -249,7 +249,6 @@ internal SourceGenerationSpec Parse(ImmutableArray meth && memberAccess.Parent.ChildNodes().FirstOrDefault(x => x is ArgumentListSyntax) is ArgumentListSyntax { Arguments: { Count: 1 } } als) - { // Method isn't using generic syntax so inspect first expression in arguments to deduce the type var argModel = _compilation.GetSemanticModel(als.Arguments[0].Expression.SyntaxTree); From 5bdfc3417f1dbcfc43f8da2fda283d484fe7ad99 Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Thu, 30 May 2024 18:02:22 +0200 Subject: [PATCH 7/9] Add tests for HubClientProxyGenerator to validate handling of inferred and explicit generic type arguments. --- .../UnitTests/HubClientProxyGeneratorTests.cs | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs index a252a46a5ecf..0be266139380 100644 --- a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs +++ b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs @@ -259,4 +259,53 @@ public async Task CallbacksGetTriggered() await returnTaskFunc(Array.Empty(), returnTaskState); Assert.Equal(1, myClient.CallsOfReturnTask); } + + [Fact] + public void RegistersCallbackProviderWithExplicitGeneric() + { + // Arrange + var mockConn = MockHubConnection.Get(); + var noArgReg = new Disposable(); + mockConn + .Setup(x => x.On( + "NoArg", + Array.Empty(), + It.IsAny>(), + It.IsAny())) + .Returns(noArgReg); + var conn = mockConn.Object; + var myClient = new MyClient(); + + // Act + var registration = conn.SetHubClient(myClient); + + // Assert + mockConn.VerifyAll(); + Assert.False(noArgReg.IsDisposed); + } + + [Fact] + public void RegistersCallbackProviderWithInferredGeneric() + { + // Arrange + var mockConn = MockHubConnection.Get(); + var noArgReg = new Disposable(); + mockConn + .Setup(x => x.On( + "NoArg", + Array.Empty(), + It.IsAny>(), + It.IsAny())) + .Returns(noArgReg); + var conn = mockConn.Object; + var myClient = new MyClient(); + + // Act + var registration = conn.SetHubClient(myClient); // Inferred generic type + + // Assert + mockConn.VerifyAll(); + Assert.False(noArgReg.IsDisposed); + } + } From fe4889d531d70d35e3141f184014d46d15115f17 Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Tue, 4 Jun 2024 09:18:03 +0200 Subject: [PATCH 8/9] Making MyClient internal --- .../Client/test/UnitTests/HubClientProxyGeneratorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs index 0be266139380..c1bf81f98c99 100644 --- a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs +++ b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs @@ -31,7 +31,7 @@ public interface IMyClient Task ReturnTask(); } - private class MyClient : IMyClient + internal class MyClient : IMyClient { public int CallsOfNoArg; public void NoArg() From d3e0a0a18e5001d793bdf04e2afc11bd5b39f349 Mon Sep 17 00:00:00 2001 From: MattyLeslie Date: Fri, 5 Jul 2024 09:43:20 +0200 Subject: [PATCH 9/9] Fixing indentations --- .../csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs index c1bf81f98c99..df96bc893740 100644 --- a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs +++ b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs @@ -307,5 +307,4 @@ public void RegistersCallbackProviderWithInferredGeneric() mockConn.VerifyAll(); Assert.False(noArgReg.IsDisposed); } - }