From 63abbb051defea5485aa38b98fa47b0b663bfbcf Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Fri, 31 Dec 2021 18:06:42 +0100 Subject: [PATCH] Fix generated members accessibility for sealed types --- .../TransitiveMembersGenerator.Execute.cs | 7 ++++ .../Test_ObservableRecipientAttribute.cs | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.Execute.cs b/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.Execute.cs index 30a9cc37..6429a9f4 100644 --- a/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.Execute.cs +++ b/CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/TransitiveMembersGenerator.Execute.cs @@ -86,6 +86,13 @@ partial class TransitiveMembersGenerator // If the target class is sealed, make protected members private and remove the virtual modifier sealedMemberDeclarations = annotatedMemberDeclarations.Select(static member => { + // Constructors become public for sealed types + if (member is ConstructorDeclarationSyntax) + { + return member.ReplaceModifier(SyntaxKind.ProtectedKeyword, SyntaxKind.PublicKeyword); + } + + // Other members become private return member .ReplaceModifier(SyntaxKind.ProtectedKeyword, SyntaxKind.PrivateKeyword) diff --git a/tests/CommunityToolkit.Mvvm.UnitTests/Test_ObservableRecipientAttribute.cs b/tests/CommunityToolkit.Mvvm.UnitTests/Test_ObservableRecipientAttribute.cs index b6e47e90..222061c8 100644 --- a/tests/CommunityToolkit.Mvvm.UnitTests/Test_ObservableRecipientAttribute.cs +++ b/tests/CommunityToolkit.Mvvm.UnitTests/Test_ObservableRecipientAttribute.cs @@ -228,4 +228,36 @@ public partial class Test_ObservableRecipientAttribute OnDeactivatedResult = true; } } + + [TestMethod] + public void Test_ObservableRecipientAttribute_SealedPersonWithCustomOnActivatedAndOnDeactivated() + { + SealedPersonWithCustomOnActivatedAndOnDeactivated model = new(); + + model.IsActive = true; + + Assert.IsTrue(model.OnActivatedResult); + + model.IsActive = false; + + Assert.IsTrue(model.OnDeactivatedResult); + } + + [ObservableRecipient] + public sealed partial class SealedPersonWithCustomOnActivatedAndOnDeactivated : ObservableObject + { + public bool OnActivatedResult { get; private set; } + + public bool OnDeactivatedResult { get; private set; } + + private partial void OnActivated() + { + OnActivatedResult = true; + } + + private partial void OnDeactivated() + { + OnDeactivatedResult = true; + } + } }