Skip to content

Commit 94f8baf

Browse files
committed
Enabled property args caching for non dependent names
1 parent 7c439e1 commit 94f8baf

File tree

1 file changed

+26
-42
lines changed

1 file changed

+26
-42
lines changed

Microsoft.Toolkit.Mvvm.SourceGenerators/ComponentModel/ObservablePropertyGenerator.cs

Lines changed: 26 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ private static void OnExecuteForProperties(
115115
item.LeadingTrivia,
116116
item.FieldSymbol,
117117
isNotifyPropertyChanging,
118-
isObservableObject,
119118
isObservableValidator,
120119
propertyChangedNames,
121120
propertyChangingNames)).ToArray());
@@ -160,7 +159,6 @@ private static void OnExecuteForProperties(
160159
/// <param name="leadingTrivia">The leading trivia for the field to process.</param>
161160
/// <param name="fieldSymbol">The input <see cref="IFieldSymbol"/> instance to process.</param>
162161
/// <param name="isNotifyPropertyChanging">Indicates whether or not <see cref="INotifyPropertyChanging"/> is also implemented.</param>
163-
/// <param name="isObservableObject">Indicates whether or not the containing type inherits from <c>ObservableObject</c>.</param>
164162
/// <param name="isObservableValidator">Indicates whether or not the containing type inherits from <c>ObservableValidator</c>.</param>
165163
/// <param name="propertyChangedNames">The collection of discovered property changed names.</param>
166164
/// <param name="propertyChangingNames">The collection of discovered property changing names.</param>
@@ -171,7 +169,6 @@ private static PropertyDeclarationSyntax CreatePropertyDeclaration(
171169
SyntaxTriviaList leadingTrivia,
172170
IFieldSymbol fieldSymbol,
173171
bool isNotifyPropertyChanging,
174-
bool isObservableObject,
175172
bool isObservableValidator,
176173
ICollection<string> propertyChangedNames,
177174
ICollection<string> propertyChangingNames)
@@ -269,10 +266,10 @@ private static PropertyDeclarationSyntax CreatePropertyDeclaration(
269266
//
270267
// if (SetProperty(ref <FIELD_NAME>, value, true))
271268
// {
272-
// OnPropertyChanged("Property1"); // Optional
273-
// OnPropertyChanged("Property2");
269+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.Property1PropertyChangedEventArgs); // Optional
270+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.Property2PropertyChangedEventArgs);
274271
// ...
275-
// OnPropertyChanged("PropertyN");
272+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.PropertyNPropertyChangedEventArgs);
276273
// }
277274
InvocationExpressionSyntax setPropertyExpression =
278275
InvocationExpression(IdentifierName("SetProperty"))
@@ -287,54 +284,41 @@ private static PropertyDeclarationSyntax CreatePropertyDeclaration(
287284
_ => Block(IfStatement(setPropertyExpression, Block(dependentPropertyNotificationStatements)))
288285
};
289286
}
290-
else if (isObservableObject)
291-
{
292-
// Generate the inner setter block as follows:
293-
//
294-
// SetProperty(ref <FIELD_NAME>, value);
295-
//
296-
// Or in case there is at least one dependent property:
297-
//
298-
// if (SetProperty(ref <FIELD_NAME>, value))
299-
// {
300-
// OnPropertyChanged("Property1"); // Optional
301-
// OnPropertyChanged("Property2");
302-
// ...
303-
// OnPropertyChanged("PropertyN");
304-
// }
305-
InvocationExpressionSyntax setPropertyExpression =
306-
InvocationExpression(IdentifierName("SetProperty"))
307-
.AddArgumentListArguments(
308-
Argument(IdentifierName(fieldSymbol.Name)).WithRefOrOutKeyword(Token(SyntaxKind.RefKeyword)),
309-
Argument(IdentifierName("value")));
310-
311-
setterBlock = dependentPropertyNotificationStatements.Count switch
312-
{
313-
0 => Block(ExpressionStatement(setPropertyExpression)),
314-
_ => Block(IfStatement(setPropertyExpression, Block(dependentPropertyNotificationStatements)))
315-
};
316-
}
317287
else
318288
{
319289
BlockSyntax updateAndNotificationBlock = Block();
320290

321-
// Add the OnPropertyChanging() call if necessary
291+
// Add OnPropertyChanging(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.PropertyNamePropertyChangingEventArgs) if necessary
322292
if (isNotifyPropertyChanging)
323293
{
324-
updateAndNotificationBlock = updateAndNotificationBlock.AddStatements(ExpressionStatement(InvocationExpression(IdentifierName("OnPropertyChanging"))));
294+
propertyChangingNames.Add(propertyName);
295+
296+
updateAndNotificationBlock = updateAndNotificationBlock.AddStatements(ExpressionStatement(
297+
InvocationExpression(IdentifierName("OnPropertyChanging"))
298+
.AddArgumentListArguments(Argument(MemberAccessExpression(
299+
SyntaxKind.SimpleMemberAccessExpression,
300+
AliasQualifiedName(IdentifierName(Token(SyntaxKind.GlobalKeyword)), IdentifierName("Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs")),
301+
IdentifierName($"{propertyName}{nameof(PropertyChangingEventArgs)}"))))));
325302
}
326303

304+
propertyChangedNames.Add(propertyName);
305+
327306
// Add the following statements:
328307
//
329308
// <FIELD_NAME> = value;
330-
// OnPropertyChanged();
309+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.PropertyNamePropertyChangedEventArgs);
331310
updateAndNotificationBlock = updateAndNotificationBlock.AddStatements(
332311
ExpressionStatement(
333312
AssignmentExpression(
334313
SyntaxKind.SimpleAssignmentExpression,
335314
IdentifierName(fieldSymbol.Name),
336315
IdentifierName("value"))),
337-
ExpressionStatement(InvocationExpression(IdentifierName("OnPropertyChanged"))));
316+
ExpressionStatement(
317+
InvocationExpression(IdentifierName("OnPropertyChanged"))
318+
.AddArgumentListArguments(Argument(MemberAccessExpression(
319+
SyntaxKind.SimpleMemberAccessExpression,
320+
AliasQualifiedName(IdentifierName(Token(SyntaxKind.GlobalKeyword)), IdentifierName("Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs")),
321+
IdentifierName($"{propertyName}{nameof(PropertyChangedEventArgs)}"))))));
338322

339323
// Add the dependent property notifications at the end
340324
updateAndNotificationBlock = updateAndNotificationBlock.AddStatements(dependentPropertyNotificationStatements.ToArray());
@@ -343,13 +327,13 @@ private static PropertyDeclarationSyntax CreatePropertyDeclaration(
343327
//
344328
// if (!global::System.Collections.Generic.EqualityComparer<<FIELD_TYPE>>.Default.Equals(<FIELD_NAME>, value))
345329
// {
346-
// OnPropertyChanging(); // Optional
330+
// OnPropertyChanging(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.PropertyNamePropertyChangingEventArgs); // Optional
347331
// <FIELD_NAME> = value;
348-
// OnPropertyChanged();
349-
// OnPropertyChanged("Property1"); // Optional
350-
// OnPropertyChanged("Property2");
332+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.PropertyNamePropertyChangedEventArgs);
333+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.Property1PropertyChangedEventArgs); // Optional
334+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.Property2PropertyChangedEventArgs);
351335
// ...
352-
// OnPropertyChanged("PropertyN");
336+
// OnPropertyChanged(global::Microsoft.Toolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedOrChangingArgs.PropertyNPropertyChangedEventArgs);
353337
// }
354338
setterBlock = Block(
355339
IfStatement(

0 commit comments

Comments
 (0)