Skip to content

Commit 1f97e4a

Browse files
authored
Add AccessModifier support to ReactiveCommand (#342)
* Add AccessModifier support to ReactiveCommand Introduces the AccessModifier property to the ReactiveCommand attribute, allowing generated command properties to specify their access level. Updates documentation, attribute definitions, generator logic, and test usage to support internal, protected, private, and other modifiers. * Add PropertyAccessModifier enum and expose in ReactiveCommandAttribute Introduces the PropertyAccessModifier enum to specify property access levels and adds an AccessModifier property to the ReactiveCommandAttribute. This enhances control over generated property access in source generator tests. * Add test for ReactiveCommand with access modifier Introduces a new unit test to verify that the ReactiveCommand source generator correctly handles the AccessModifier property. Also updates generated test assets and clarifies a comment in the generator implementation. * Remove redundant received files for ReactiveCommandAttribute Deleted .received.cs files for DotNet8_0, DotNet9_0, and DotNet10_0 test targets as their content is now covered by the verified file. This streamlines the test assets and reduces duplication. * Add GetNamedArgument extension and refactor usage Introduced a generic GetNamedArgument<T> extension method for AttributeData to simplify retrieval of named arguments. Refactored ReactiveCommandGenerator.Execute.cs to use the new method for accessing the AccessModifier argument.
1 parent f283e27 commit 1f97e4a

File tree

23 files changed

+306
-4
lines changed

23 files changed

+306
-4
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,16 @@ ReactiveUI Source Generators automatically generate ReactiveUI objects to stream
3737
- `[ReactiveCommand(OutputScheduler = "RxApp.MainThreadScheduler")]` using a ReactiveUI Scheduler
3838
- `[ReactiveCommand(OutputScheduler = nameof(_isheduler))]` using a Scheduler defined in the class
3939
- `[ReactiveCommand][property: AttributeToAddToCommand]` with Attribute passthrough
40+
- `[ReactiveCommand(AccessModifier = PropertyAccessModifier.Internal)]` sets the access modifier of the generated command property
4041
- `[IViewFor(nameof(ViewModelName))]`
4142
- `[IViewFor<YourViewModelType>]`
4243
- `[IViewFor("YourNameSpace.YourGenericViewModel<int>")]` Generic
4344
- `[IViewFor<YourViewModelType>(RegistrationType = SplatRegistrationType.PerRequest)]` with Splat Registration Type for IViewFor registration.
4445
- `[IViewFor<YourViewModelType>(RegistrationType = SplatRegistrationType.LazySingleton)]` Generic with Splat Registration Type for IViewFor registration.
4546
- `[IViewFor<YourViewModelType>(RegistrationType = SplatRegistrationType.Constant)]` Generic with Splat Registration Type for IViewFor registration.
47+
- `[IViewFor<YourViewModelType>(ViewModelRegistrationType = SplatRegistrationType.PerRequest)]` Generic with Splat Registration Type for ViewModel registration.
48+
- `[IViewFor<YourViewModelType>(ViewModelRegistrationType = SplatRegistrationType.LazySingleton)]` Generic with Splat Registration Type for ViewModel registration.
49+
- `[IViewFor<YourViewModelType>(ViewModelRegistrationType = SplatRegistrationType.Constant)]` Generic with Splat Registration Type for ViewModel registration.
4650
- `[RoutedControlHost("YourNameSpace.CustomControl")]`
4751
- `[ViewModelControlHost("YourNameSpace.CustomControl")]`
4852
- `[BindableDerivedList]` Generates a derived list from a ReadOnlyObservableCollection backing field
@@ -544,6 +548,17 @@ public partial class MyReactiveClass
544548
}
545549
```
546550

551+
### Usage ReactiveCommand with AccessModifier
552+
```csharp
553+
using ReactiveUI.SourceGenerators;
554+
555+
public partial class MyReactiveClass
556+
{
557+
[ReactiveCommand(AccessModifier = PropertyAccessModifier.Internal)]
558+
private void Execute() { }
559+
}
560+
```
561+
547562
## Usage IViewFor `[IViewFor(nameof(ViewModelName))]`
548563

549564
### IViewFor usage

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePartialProperties#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactiveProperiesWithAttributes#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactiveProperties#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePropertiesCalledValue#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePropertiesWithAccess#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePropertiesWithAttributesAccessAndInheritance#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePropertiesWithIdenticalClass#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePropertiesWithInit#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

src/ReactiveUI.SourceGenerator.Tests/REACTIVE/ReactiveGeneratorTests.FromReactivePropertiesWithNestedClass#ReactiveUI.SourceGenerators.AccessModifier.g.verified.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@ internal enum AccessModifier
2323
Init,
2424
}
2525

26+
/// <summary>
27+
/// Property Access Modifier.
28+
/// </summary>
29+
internal enum PropertyAccessModifier
30+
{
31+
Public,
32+
Protected,
33+
Internal,
34+
Private,
35+
InternalProtected,
36+
PrivateProtected,
37+
}
38+
2639
/// <summary>
2740
/// InheritanceModifier.
2841
/// </summary>

0 commit comments

Comments
 (0)