Skip to content

Commit 9dbdc5d

Browse files
committed
Translating assigned blocks into code blocks with curly braces
1 parent d9035e8 commit 9dbdc5d

File tree

3 files changed

+48
-44
lines changed

3 files changed

+48
-44
lines changed

ReadableExpressions.UnitTests/WhenTranslatingAssignments.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public void ShouldTranslateAnAssignmentResultAssignment()
222222

223223
var translated = setVariableOneToAssignmentResult.ToReadableString();
224224

225-
Assert.AreEqual("i = (j = 1)", translated);
225+
Assert.AreEqual("i = j = 1", translated);
226226
}
227227

228228
[TestMethod]
@@ -263,13 +263,16 @@ public void ShouldAssignTheResultOfATryCatch()
263263
var translated = assignReadOrDefault.ToReadableString();
264264

265265
const string EXPECTED = @"
266-
i = try
266+
i =
267267
{
268-
Console.Read();
269-
}
270-
catch (IOException)
271-
{
272-
default(int);
268+
try
269+
{
270+
Console.Read();
271+
}
272+
catch (IOException)
273+
{
274+
default(int);
275+
}
273276
}";
274277

275278
Assert.AreEqual(EXPECTED.TrimStart(), translated);

ReadableExpressions/TranslationContext.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

ReadableExpressions/Translators/AssignmentExpressionTranslator.cs

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -49,38 +49,29 @@ internal string GetAssignment(
4949
TranslationContext context)
5050
{
5151
var symbol = _symbolsByNodeType[assignmentType];
52-
var valueString = GetValueTranslation(value, context);
5352

54-
switch (value.NodeType)
55-
{
56-
case ExpressionType.Assign:
57-
case ExpressionType.Block:
58-
if (valueString.EndsWith(';'))
59-
{
60-
valueString = valueString.Substring(0, valueString.Length - 1);
61-
}
62-
63-
if (!valueString.HasSurroundingParentheses())
64-
{
65-
valueString = valueString.WithSurroundingParentheses();
66-
}
67-
68-
break;
69-
70-
default:
71-
valueString = valueString.WithoutSurroundingParentheses(value);
72-
break;
73-
74-
}
53+
var valueString = (value.NodeType == ExpressionType.Default)
54+
? _defaultTranslator.Translate((DefaultExpression)value)
55+
: GetValueTranslation(value, context);
7556

7657
return $"{target} {symbol} {valueString}";
7758
}
7859

7960
private string GetValueTranslation(Expression value, TranslationContext context)
8061
{
81-
return (value.NodeType != ExpressionType.Default)
82-
? context.GetTranslation(value)
83-
: _defaultTranslator.Translate((DefaultExpression)value);
62+
var valueBlock = GetTranslatedExpressionBody(value, context);
63+
64+
if (valueBlock.IsASingleStatement)
65+
{
66+
return valueBlock.WithoutParentheses().Unterminated();
67+
}
68+
69+
if (value.NodeType == ExpressionType.Lambda)
70+
{
71+
return valueBlock.WithoutParentheses();
72+
}
73+
74+
return valueBlock.WithReturn().WithParentheses();
8475
}
8576
}
8677
}

0 commit comments

Comments
 (0)