Skip to content

Commit 9c17d3d

Browse files
NikolayPianikovNikolayPianikov
authored andcommitted
Simplify checks for default values
1 parent 9c7f0fd commit 9c17d3d

File tree

2 files changed

+20
-45
lines changed

2 files changed

+20
-45
lines changed

Immutype.Tests/Integration/Tests.cs

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ public readonly struct Rec
366366
}
367367

368368
[Fact]
369-
public void ShouldCreateStructWithSingleValueWhenCS71()
369+
public void ShouldCreateStructWithSingleValueWhenCs71()
370370
{
371371
// Given
372372
const string statements = "System.Console.WriteLine(new Rec(33).WithVal(99));";
@@ -388,27 +388,7 @@ public struct Rec
388388
// Then
389389
output.ShouldBe(new [] { "Sample.Rec" }, generatedCode);
390390
}
391-
392-
[Fact]
393-
public void ShouldCreateRecordStructWithSingleValue()
394-
{
395-
// Given
396-
const string statements = "System.Console.WriteLine(new Rec(33).WithVal(99));";
397391

398-
// When
399-
var output = @"
400-
namespace Sample
401-
{
402-
using System;
403-
404-
[Immutype.TargetAttribute()]
405-
public record struct Rec(int Val);
406-
}".Run(out var generatedCode, new RunOptions { Statements = statements });
407-
408-
// Then
409-
output.ShouldBe(new [] { "Rec { Val = 99 }" }, generatedCode);
410-
}
411-
412392
[Fact]
413393
public void ShouldCreateClassWithSingleValue()
414394
{

Immutype/Core/MethodAddRemoveFactory.cs

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
namespace Immutype.Core
22
{
3-
using System;
43
using System.Collections.Generic;
54
using System.Linq;
65
using Microsoft.CodeAnalysis.CSharp;
@@ -68,12 +67,15 @@ private IEnumerable<ArgumentSyntax> CreateArguments(string enumerableMethod, Typ
6867
{
6968
if (parameter == currentParameter)
7069
{
71-
yield return SyntaxFactory.Argument(
72-
CreateExpression(
73-
enumerableMethod,
74-
_syntaxNodeFactory.CreateTransientArgumentExpression(owner, thisParameter, currentParameter),
75-
currentParameter.Type,
76-
arrayParameter));
70+
var thisArg = _syntaxNodeFactory.CreateTransientArgumentExpression(owner, thisParameter, currentParameter);
71+
72+
var expression = CreateExpression(
73+
enumerableMethod,
74+
thisArg,
75+
currentParameter.Type,
76+
arrayParameter);
77+
78+
yield return SyntaxFactory.Argument(expression);
7779
}
7880
else
7981
{
@@ -82,16 +84,19 @@ private IEnumerable<ArgumentSyntax> CreateArguments(string enumerableMethod, Typ
8284
}
8385
}
8486

85-
private ExpressionSyntax CreateExpression(string enumerableMethod, ExpressionSyntax? thisExpression, TypeSyntax? currentParameterType, ParameterSyntax arrayParameter)
87+
private ExpressionSyntax CreateExpression(string enumerableMethod, ExpressionSyntax? thisExpression, TypeSyntax? currentParameterType, ParameterSyntax arrayParameter, bool addCheck = true)
8688
{
8789
ExpressionSyntax? result = default;
8890
if (thisExpression != default)
8991
{
90-
var defaultExpression = CreateExpression(enumerableMethod, default, currentParameterType, arrayParameter);
91-
thisExpression = SyntaxFactory.ParenthesizedExpression(SyntaxFactory.ConditionalExpression(
92-
SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, thisExpression, SyntaxFactory.DefaultExpression(currentParameterType!)),
93-
defaultExpression,
94-
thisExpression));
92+
if (addCheck)
93+
{
94+
var defaultExpression = CreateExpression(enumerableMethod, default, currentParameterType, arrayParameter);
95+
thisExpression = SyntaxFactory.ParenthesizedExpression(SyntaxFactory.ConditionalExpression(
96+
SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, thisExpression, SyntaxFactory.DefaultExpression(currentParameterType!)),
97+
defaultExpression,
98+
thisExpression));
99+
}
95100

96101
result = SyntaxFactory.InvocationExpression(
97102
SyntaxFactory.MemberAccessExpression(
@@ -104,18 +109,8 @@ private ExpressionSyntax CreateExpression(string enumerableMethod, ExpressionSyn
104109
switch (_syntaxNodeFactory.GetUnqualified(currentParameterType))
105110
{
106111
case NullableTypeSyntax nullableTypeSyntax:
107-
var defaultExpression = CreateExpression(enumerableMethod, default, nullableTypeSyntax.ElementType, arrayParameter);
108-
if (thisExpression != default)
109-
{
110-
thisExpression = SyntaxFactory.ParenthesizedExpression(SyntaxFactory.BinaryExpression(SyntaxKind.CoalesceExpression, thisExpression!, defaultExpression));
111-
}
112-
else
113-
{
114-
thisExpression = SyntaxFactory.DefaultExpression(nullableTypeSyntax.ElementType);
115-
}
116-
117112
// ReSharper disable once TailRecursiveCall
118-
return CreateExpression(enumerableMethod, thisExpression, nullableTypeSyntax.ElementType, arrayParameter);
113+
return CreateExpression(enumerableMethod, thisExpression, nullableTypeSyntax.ElementType, arrayParameter, false);
119114

120115
case GenericNameSyntax genericNameSyntax:
121116
if (_dataContainerFactory.TryCreate(genericNameSyntax, ref result, ref arrayParameter))

0 commit comments

Comments
 (0)