Skip to content

Commit 2b47469

Browse files
committed
Remove extra projection and comparer from ObservablePropertyGenerator
1 parent 969fcb4 commit 2b47469

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

CommunityToolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,14 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
5353
context.ReportDiagnostics(propertyInfoWithErrors.Select(static (item, _) => item.Info.Errors));
5454

5555
// Get the filtered sequence to enable caching
56-
IncrementalValuesProvider<(HierarchyInfo Hierarchy, PropertyInfo Info)> propertyInfo =
56+
IncrementalValuesProvider<(HierarchyInfo Hierarchy, Result<PropertyInfo> Info)> propertyInfo =
5757
propertyInfoWithErrors
58-
.Select(static (item, _) => (item.Hierarchy, Info: item.Info.Value))
59-
.Where(static item => item.Info is not null)!
60-
.WithComparers(HierarchyInfo.Comparer.Default, PropertyInfo.Comparer.Default);
58+
.Where(static item => item.Info.Value is not null)!;
6159

6260
// Split and group by containing type
6361
IncrementalValuesProvider<(HierarchyInfo Hierarchy, ImmutableArray<PropertyInfo> Properties)> groupedPropertyInfo =
6462
propertyInfo
65-
.GroupBy(HierarchyInfo.Comparer.Default)
63+
.GroupBy(HierarchyInfo.Comparer.Default, static item => item.Value)
6664
.WithComparers(HierarchyInfo.Comparer.Default, PropertyInfo.Comparer.Default.ForImmutableArray());
6765

6866
// Generate the requested properties and methods
@@ -84,7 +82,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
8482
// Gather all property changing names
8583
IncrementalValueProvider<ImmutableArray<string>> propertyChangingNames =
8684
propertyInfo
87-
.SelectMany(static (item, _) => item.Info.PropertyChangingNames)
85+
.SelectMany(static (item, _) => item.Info.Value.PropertyChangingNames)
8886
.Collect()
8987
.Select(static (item, _) => item.Distinct().ToImmutableArray())
9088
.WithComparer(EqualityComparer<string>.Default.ForImmutableArray());
@@ -103,7 +101,7 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
103101
// Gather all property changed names
104102
IncrementalValueProvider<ImmutableArray<string>> propertyChangedNames =
105103
propertyInfo
106-
.SelectMany(static (item, _) => item.Info.PropertyChangedNames)
104+
.SelectMany(static (item, _) => item.Info.Value.PropertyChangedNames)
107105
.Collect()
108106
.Select(static (item, _) => item.Distinct().ToImmutableArray())
109107
.WithComparer(EqualityComparer<string>.Default.ForImmutableArray());

CommunityToolkit.Mvvm.SourceGenerators/Extensions/IncrementalValuesProviderExtensions.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,33 +22,36 @@ internal static class IncrementalValuesProviderExtensions
2222
/// </summary>
2323
/// <typeparam name="TLeft">The type of left items in each tuple.</typeparam>
2424
/// <typeparam name="TRight">The type of right items in each tuple.</typeparam>
25+
/// <typeparam name="TElement">The type of resulting projected elements.</typeparam>
2526
/// <param name="source">The input <see cref="IncrementalValuesProvider{TValues}"/> instance.</param>
2627
/// <param name="comparer">A <typeparamref name="TLeft"/> comparer.</param>
28+
/// <param name="projection">A projection function to convert gathered elements.</param>
2729
/// <returns>An <see cref="IncrementalValuesProvider{TValues}"/> with the grouped results.</returns>
28-
public static IncrementalValuesProvider<(TLeft Left, ImmutableArray<TRight> Right)> GroupBy<TLeft, TRight>(
30+
public static IncrementalValuesProvider<(TLeft Left, ImmutableArray<TElement> Right)> GroupBy<TLeft, TRight, TElement>(
2931
this IncrementalValuesProvider<(TLeft Left, TRight Right)> source,
30-
IEqualityComparer<TLeft> comparer)
32+
IEqualityComparer<TLeft> comparer,
33+
Func<TRight, TElement> projection)
3134
{
3235
return source.Collect().SelectMany((item, _) =>
3336
{
34-
Dictionary<TLeft, ImmutableArray<TRight>.Builder> map = new(comparer);
37+
Dictionary<TLeft, ImmutableArray<TElement>.Builder> map = new(comparer);
3538

3639
foreach ((TLeft hierarchy, TRight info) in item)
3740
{
38-
if (!map.TryGetValue(hierarchy, out ImmutableArray<TRight>.Builder builder))
41+
if (!map.TryGetValue(hierarchy, out ImmutableArray<TElement>.Builder builder))
3942
{
40-
builder = ImmutableArray.CreateBuilder<TRight>();
43+
builder = ImmutableArray.CreateBuilder<TElement>();
4144

4245
map.Add(hierarchy, builder);
4346
}
4447

45-
builder.Add(info);
48+
builder.Add(projection(info));
4649
}
4750

48-
ImmutableArray<(TLeft Hierarchy, ImmutableArray<TRight> Properties)>.Builder result =
49-
ImmutableArray.CreateBuilder<(TLeft, ImmutableArray<TRight>)>();
51+
ImmutableArray<(TLeft Hierarchy, ImmutableArray<TElement> Elements)>.Builder result =
52+
ImmutableArray.CreateBuilder<(TLeft, ImmutableArray<TElement>)>();
5053

51-
foreach (KeyValuePair<TLeft, ImmutableArray<TRight>.Builder> entry in map)
54+
foreach (KeyValuePair<TLeft, ImmutableArray<TElement>.Builder> entry in map)
5255
{
5356
result.Add((entry.Key, entry.Value.ToImmutable()));
5457
}

0 commit comments

Comments
 (0)