11namespace 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