@@ -29,6 +29,8 @@ public string GetTranslation(Expression expression)
2929 return _globalTranslator . Invoke ( expression , this ) ;
3030 }
3131
32+ public bool IsAssignedValue ( Expression expression ) => _analyzer . AssignedValues . Contains ( expression ) ;
33+
3234 public bool IsNotJoinedAssignment ( Expression expression )
3335 {
3436 return ( expression . NodeType != ExpressionType . Assign ) ||
@@ -49,6 +51,7 @@ private class ExpressionAnalysisVisitor : ExpressionVisitor
4951 {
5052 private readonly List < ParameterExpression > _accessedVariables ;
5153 private readonly List < ParameterExpression > _assignedVariables ;
54+ private readonly List < Expression > _assignedValues ;
5255 private readonly List < Expression > _assignedAssignments ;
5356 private readonly List < BinaryExpression > _joinedAssignments ;
5457 private readonly List < LabelTarget > _namedLabelTargets ;
@@ -59,6 +62,7 @@ private ExpressionAnalysisVisitor()
5962 {
6063 _accessedVariables = new List < ParameterExpression > ( ) ;
6164 _assignedVariables = new List < ParameterExpression > ( ) ;
65+ _assignedValues = new List < Expression > ( ) ;
6266 _assignedAssignments = new List < Expression > ( ) ;
6367 _joinedAssignments = new List < BinaryExpression > ( ) ;
6468 _namedLabelTargets = new List < LabelTarget > ( ) ;
@@ -114,6 +118,8 @@ private static Expression GetCoreExpression(Expression expression)
114118
115119 public IEnumerable < ParameterExpression > AssignedVariables => _assignedVariables ;
116120
121+ public IEnumerable < Expression > AssignedValues => _assignedValues ;
122+
117123 public IEnumerable < BinaryExpression > JoinedAssignments => _joinedAssignments ;
118124
119125 public IEnumerable < LabelTarget > NamedLabelTargets => _namedLabelTargets ;
@@ -139,22 +145,26 @@ protected override Expression VisitParameter(ParameterExpression variable)
139145
140146 protected override Expression VisitBinary ( BinaryExpression binaryExpression )
141147 {
142- if ( ( binaryExpression . NodeType == ExpressionType . Assign ) &&
143- ( binaryExpression . Left . NodeType == ExpressionType . Parameter ) &&
144- ( ( _currentBlock == null ) || _currentBlock . Expressions . Contains ( binaryExpression ) ) &&
145- ! _assignedVariables . Contains ( binaryExpression . Left ) &&
146- ! _assignedAssignments . Contains ( binaryExpression ) )
148+ if ( binaryExpression . NodeType == ExpressionType . Assign )
147149 {
148- var variable = ( ParameterExpression ) binaryExpression . Left ;
150+ _assignedValues . Add ( binaryExpression . Right ) ;
149151
150- if ( VariableHasNotYetBeenAccessed ( variable ) )
152+ if ( ( binaryExpression . Left . NodeType == ExpressionType . Parameter ) &&
153+ ( ( _currentBlock == null ) || _currentBlock . Expressions . Contains ( binaryExpression ) ) &&
154+ ! _assignedVariables . Contains ( binaryExpression . Left ) &&
155+ ! _assignedAssignments . Contains ( binaryExpression ) )
151156 {
152- _joinedAssignments . Add ( binaryExpression ) ;
153- _accessedVariables . Add ( variable ) ;
154- _assignedVariables . Add ( variable ) ;
155- }
157+ var variable = ( ParameterExpression ) binaryExpression . Left ;
156158
157- AddAssignmentIfAppropriate ( binaryExpression . Right ) ;
159+ if ( VariableHasNotYetBeenAccessed ( variable ) )
160+ {
161+ _joinedAssignments . Add ( binaryExpression ) ;
162+ _accessedVariables . Add ( variable ) ;
163+ _assignedVariables . Add ( variable ) ;
164+ }
165+
166+ AddAssignmentIfAppropriate ( binaryExpression . Right ) ;
167+ }
158168 }
159169
160170 return base . VisitBinary ( binaryExpression ) ;
0 commit comments