@@ -193,11 +193,12 @@ protected IReadOnlyList<MemberDeclarationSyntax> CreateMutableProperties()
193193 foreach ( var field in this . generator . applyToMetaType . LocalFields )
194194 {
195195 var thisField = Syntax . ThisDot ( field . NameAsField ) ;
196+ var optionalFieldNotYetDefined = SyntaxFactory . PrefixUnaryExpression ( SyntaxKind . LogicalNotExpression , Syntax . OptionalIsDefined ( thisField ) ) ;
196197 var getterBlock = field . IsGeneratedImmutableType
197198 ? SyntaxFactory . Block (
198199 // if (!this.fieldName.IsDefined) {
199200 SyntaxFactory . IfStatement (
200- SyntaxFactory . PrefixUnaryExpression ( SyntaxKind . LogicalNotExpression , Syntax . OptionalIsDefined ( thisField ) ) ,
201+ optionalFieldNotYetDefined ,
201202 SyntaxFactory . Block (
202203 // this.fieldName = this.immutable.fieldName?.ToBuilder();
203204 SyntaxFactory . ExpressionStatement ( SyntaxFactory . AssignmentExpression (
@@ -213,17 +214,32 @@ protected IReadOnlyList<MemberDeclarationSyntax> CreateMutableProperties()
213214 SyntaxFactory . ArgumentList ( ) ) ) ) ) ) ) ,
214215 SyntaxFactory . ReturnStatement ( Syntax . OptionalValue ( thisField ) ) )
215216 : SyntaxFactory . Block ( SyntaxFactory . ReturnStatement ( thisField ) ) ;
216- var setterBlock = SyntaxFactory . Block (
217- SyntaxFactory . ExpressionStatement ( SyntaxFactory . AssignmentExpression (
218- SyntaxKind . SimpleAssignmentExpression ,
217+ var setterCondition = field . IsGeneratedImmutableType
218+ ? SyntaxFactory . BinaryExpression (
219+ SyntaxKind . LogicalOrExpression ,
220+ optionalFieldNotYetDefined ,
221+ SyntaxFactory . BinaryExpression (
222+ SyntaxKind . NotEqualsExpression ,
223+ Syntax . OptionalValue ( thisField ) ,
224+ SyntaxFactory . IdentifierName ( "value" ) ) )
225+ : SyntaxFactory . BinaryExpression (
226+ SyntaxKind . NotEqualsExpression ,
219227 thisField ,
220- SyntaxFactory . IdentifierName ( "value" ) ) ) ,
221- SyntaxFactory . ExpressionStatement (
222- SyntaxFactory . InvocationExpression (
223- SyntaxFactory . MemberAccessExpression (
224- SyntaxKind . SimpleMemberAccessExpression ,
225- SyntaxFactory . ThisExpression ( ) ,
226- OnPropertyChangedMethodName ) ) ) ) ;
228+ SyntaxFactory . IdentifierName ( "value" ) ) ;
229+ var setterBlock = SyntaxFactory . Block (
230+ SyntaxFactory . IfStatement (
231+ setterCondition ,
232+ SyntaxFactory . Block (
233+ SyntaxFactory . ExpressionStatement ( SyntaxFactory . AssignmentExpression (
234+ SyntaxKind . SimpleAssignmentExpression ,
235+ thisField ,
236+ SyntaxFactory . IdentifierName ( "value" ) ) ) ,
237+ SyntaxFactory . ExpressionStatement (
238+ SyntaxFactory . InvocationExpression (
239+ SyntaxFactory . MemberAccessExpression (
240+ SyntaxKind . SimpleMemberAccessExpression ,
241+ SyntaxFactory . ThisExpression ( ) ,
242+ OnPropertyChangedMethodName ) ) ) ) ) ) ;
227243
228244 var property = SyntaxFactory . PropertyDeclaration (
229245 this . GetPropertyTypeForBuilder ( field ) ,
0 commit comments