Skip to content

Commit 5ab8374

Browse files
committed
Builders' mutable property setters do equivalence checks based on whether structs define == operator
1 parent 09a8241 commit 5ab8374

2 files changed

Lines changed: 27 additions & 21 deletions

File tree

src/ImmutableObjectGraph.Generation.Tests/TestSources/ImmutableWithComplexStructField.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
using System;
44

5-
[GenerateImmutable]
5+
[GenerateImmutable(GenerateBuilder = true)]
66
partial class ImmutableWithComplexStructField
77
{
88
readonly SomeStructWithMultipleFields someStructField;

src/ImmutableObjectGraph.Generation/CodeGen+BuilderGen.cs

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -214,32 +214,38 @@ protected IReadOnlyList<MemberDeclarationSyntax> CreateMutableProperties()
214214
SyntaxFactory.ArgumentList())))))),
215215
SyntaxFactory.ReturnStatement(Syntax.OptionalValue(thisField)))
216216
: SyntaxFactory.Block(SyntaxFactory.ReturnStatement(thisField));
217-
var setterCondition = field.IsGeneratedImmutableType
218-
? SyntaxFactory.BinaryExpression(
217+
var setterValueArg = SyntaxFactory.IdentifierName("value");
218+
var setterCondition = field.IsGeneratedImmutableType ?
219+
SyntaxFactory.BinaryExpression(
219220
SyntaxKind.LogicalOrExpression,
220221
optionalFieldNotYetDefined,
221222
SyntaxFactory.BinaryExpression(
222223
SyntaxKind.NotEqualsExpression,
223224
Syntax.OptionalValue(thisField),
224-
SyntaxFactory.IdentifierName("value")))
225-
: SyntaxFactory.BinaryExpression(
226-
SyntaxKind.NotEqualsExpression,
225+
setterValueArg)) :
226+
HasEqualityOperators(field.Symbol.Type) ?
227+
SyntaxFactory.BinaryExpression(
228+
SyntaxKind.NotEqualsExpression,
229+
thisField,
230+
setterValueArg) :
231+
null;
232+
var setterSignificantBlock = SyntaxFactory.Block(
233+
SyntaxFactory.ExpressionStatement(SyntaxFactory.AssignmentExpression(
234+
SyntaxKind.SimpleAssignmentExpression,
227235
thisField,
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))))));
236+
setterValueArg)),
237+
SyntaxFactory.ExpressionStatement(
238+
SyntaxFactory.InvocationExpression(
239+
SyntaxFactory.MemberAccessExpression(
240+
SyntaxKind.SimpleMemberAccessExpression,
241+
SyntaxFactory.ThisExpression(),
242+
OnPropertyChangedMethodName))));
243+
var setterBlock = setterCondition != null ?
244+
SyntaxFactory.Block(
245+
SyntaxFactory.IfStatement(
246+
setterCondition,
247+
setterSignificantBlock)) :
248+
setterSignificantBlock;
243249

244250
var property = SyntaxFactory.PropertyDeclaration(
245251
this.GetPropertyTypeForBuilder(field),

0 commit comments

Comments
 (0)