Skip to content

Commit 59d9299

Browse files
committed
Fix build error with generic IRecipient<T> types
This just uses the compiled LINQ expression fallback
1 parent 83d4ee2 commit 59d9299

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

CommunityToolkit.Mvvm.SourceGenerators/Messaging/IMessengerRegisterAllGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
3131
.CreateSyntaxProvider(
3232
static (node, _) => node is ClassDeclarationSyntax,
3333
static (context, _) => (context.Node, Symbol: (INamedTypeSymbol)context.SemanticModel.GetDeclaredSymbol(context.Node)!))
34-
.Where(static item => !item.Symbol.IsAbstract && item.Node.IsFirstSyntaxDeclarationForSymbol(item.Symbol))
34+
.Where(static item => item.Symbol is { IsAbstract: false, IsGenericType: false } && item.Node.IsFirstSyntaxDeclarationForSymbol(item.Symbol))
3535
.Select(static (item, _) => item.Symbol);
3636

3737
// Get the target IRecipient<TMessage> interfaces and filter out other types

tests/CommunityToolkit.Mvvm.UnitTests/Test_Messenger.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Collections.Generic;
67
using System.Linq;
78
using System.Reflection;
89
using System.Threading;
910
using System.Threading.Tasks;
1011
using CommunityToolkit.Mvvm.Messaging;
12+
using CommunityToolkit.Mvvm.Messaging.Messages;
1113
using Microsoft.VisualStudio.TestTools.UnitTesting;
1214

1315
namespace CommunityToolkit.Mvvm.UnitTests;
@@ -372,6 +374,40 @@ public void Test_Messenger_IRecipient_SomeMessages_NoToken(Type type)
372374
Assert.IsFalse(messenger.IsRegistered<MessageB>(recipient));
373375
}
374376

377+
// See https://github.com/CommunityToolkit/dotnet/issues/198
378+
[TestMethod]
379+
[DataRow(typeof(StrongReferenceMessenger))]
380+
[DataRow(typeof(WeakReferenceMessenger))]
381+
public void Test_Messenger_IRecipient_SomeMessages_WithGenericTypeParameters(Type type)
382+
{
383+
IMessenger? messenger = (IMessenger)Activator.CreateInstance(type)!;
384+
GenericRecipient<string> recipient = new();
385+
386+
messenger.RegisterAll(recipient);
387+
388+
Assert.IsTrue(messenger.IsRegistered<GenericRecipient<string>.Message>(recipient));
389+
Assert.IsTrue(messenger.IsRegistered<ValueChangedMessage<string>>(recipient));
390+
Assert.IsTrue(messenger.IsRegistered<MessageA>(recipient));
391+
392+
Assert.IsNull(recipient.ReceivedMessage1);
393+
Assert.IsNull(recipient.ReceivedMessage2);
394+
Assert.IsNull(recipient.ReceivedMessage3);
395+
396+
GenericRecipient<string>.Message message1 = messenger.Send(new GenericRecipient<string>.Message(new List<string> { "Hello world!" }));
397+
ValueChangedMessage<string> message2 = messenger.Send(new ValueChangedMessage<string>("Hello"));
398+
MessageA message3 = messenger.Send<MessageA>();
399+
400+
Assert.AreSame(recipient.ReceivedMessage1, message1);
401+
Assert.AreSame(recipient.ReceivedMessage2, message2);
402+
Assert.AreSame(recipient.ReceivedMessage3, message3);
403+
404+
messenger.UnregisterAll(recipient);
405+
406+
Assert.IsFalse(messenger.IsRegistered<GenericRecipient<string>.Message>(recipient));
407+
Assert.IsFalse(messenger.IsRegistered<ValueChangedMessage<string>>(recipient));
408+
Assert.IsFalse(messenger.IsRegistered<MessageA>(recipient));
409+
}
410+
375411
[TestMethod]
376412
[DataRow(typeof(StrongReferenceMessenger))]
377413
[DataRow(typeof(WeakReferenceMessenger))]
@@ -1059,4 +1095,36 @@ public sealed class MessageA
10591095
public sealed class MessageB
10601096
{
10611097
}
1098+
1099+
public partial class GenericRecipient<T> : IRecipient<GenericRecipient<T>.Message>, IRecipient<ValueChangedMessage<T>>, IRecipient<MessageA>
1100+
{
1101+
public Message? ReceivedMessage1 { get; private set; }
1102+
1103+
public ValueChangedMessage<T>? ReceivedMessage2 { get; private set; }
1104+
1105+
public MessageA? ReceivedMessage3 { get; private set; }
1106+
1107+
public void Receive(Message message)
1108+
{
1109+
ReceivedMessage1 = message;
1110+
}
1111+
1112+
public void Receive(ValueChangedMessage<T> message)
1113+
{
1114+
ReceivedMessage2 = message;
1115+
}
1116+
1117+
public void Receive(MessageA message)
1118+
{
1119+
ReceivedMessage3 = message;
1120+
}
1121+
1122+
public sealed class Message : ValueChangedMessage<List<T>>
1123+
{
1124+
public Message(List<T> list)
1125+
: base(list)
1126+
{
1127+
}
1128+
}
1129+
}
10621130
}

0 commit comments

Comments
 (0)