Skip to content

Commit 12b4110

Browse files
committed
Leaving blank lines before if and switch statements
1 parent 2f960ae commit 12b4110

File tree

3 files changed

+94
-47
lines changed

3 files changed

+94
-47
lines changed

ReadableExpressions.UnitTests/WhenFormattingCode.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ public void ShouldVarAssignAVariableUsedInNestedConstructs()
406406
try
407407
{
408408
var memoryStream = stream as MemoryStream;
409+
409410
if (memoryStream != null)
410411
{
411412
return
@@ -423,6 +424,7 @@ public void ShouldVarAssignAVariableUsedInNestedConstructs()
423424
}
424425
425426
var fileStream = stream as FileStream;
427+
426428
if (fileStream != null)
427429
{
428430
return
@@ -775,6 +777,29 @@ public void ShouldLeaveABlankLineAfterAMultipleLineExpression()
775777
Assert.AreEqual(EXPECTED.TrimStart(), translated);
776778
}
777779

780+
[TestMethod]
781+
public void ShouldLeaveABlankLineBeforeAnIfStatement()
782+
{
783+
var intVariable = Expression.Variable(typeof(int), "i");
784+
var zero = Expression.Constant(0);
785+
var intVariableEqualsZero = Expression.Equal(intVariable, zero);
786+
var doNothing = Expression.Default(typeof(void));
787+
var ifIntEqualsZeroDoNothing = Expression.IfThen(intVariableEqualsZero, doNothing);
788+
789+
var block = Expression.Block(new[] { intVariable }, ifIntEqualsZeroDoNothing);
790+
791+
const string EXPECTED = @"
792+
int i;
793+
794+
if (i == 0)
795+
{
796+
}";
797+
798+
var translated = block.ToReadableString();
799+
800+
Assert.AreEqual(EXPECTED.TrimStart(), translated);
801+
}
802+
778803
[TestMethod]
779804
public void ShouldTranslateMultilineBlockSingleMethodArguments()
780805
{

ReadableExpressions.UnitTests/WhenTranslatingBlocks.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ public void ShouldTranslateAVariableAssignmentWithinACondition()
217217
const string EXPECTED = @"() =>
218218
{
219219
int count;
220+
220221
if ((count = 5) < 10)
221222
{
222223
}
@@ -300,6 +301,7 @@ public void ShouldTranslateASwitchWithMultipleVariableAssignments()
300301

301302
const string EXPECTED = @"
302303
int count;
304+
303305
switch (i)
304306
{
305307
case 1:

ReadableExpressions/Translators/BlockExpressionTranslator.cs

Lines changed: 67 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,15 @@ public override string Translate(Expression expression, TranslationContext conte
2222
var block = (BlockExpression)expression;
2323

2424
var variables = GetVariableDeclarations(block, context);
25-
var lines = GetBlockLines(block, context);
26-
27-
lines = ProcessBlockContents(lines.ToArray(), block);
25+
var statements = GetBlockStatements(block, context).ToArray();
26+
var separator = GetStatementsSeparator(variables, statements);
2827

29-
var blockContents = variables.Concat(lines);
28+
var blockContents = variables.Concat(separator).Concat(statements);
3029

3130
return string.Join(Environment.NewLine, blockContents);
3231
}
3332

34-
private IEnumerable<string> GetVariableDeclarations(
33+
private IList<string> GetVariableDeclarations(
3534
BlockExpression block,
3635
TranslationContext context)
3736
{
@@ -44,10 +43,66 @@ private IEnumerable<string> GetVariableDeclarations(
4443
TypeName = vGrp.Key.GetFriendlyName(),
4544
VariableNames = vGrp.Select(varName => _variableNameTranslator.Translate(varName))
4645
})
47-
.Select(varData => $"{varData.TypeName} {string.Join(", ", varData.VariableNames)};");
46+
.Select(varData => $"{varData.TypeName} {string.Join(", ", varData.VariableNames)};")
47+
.ToArray();
4848
}
4949

50-
private static IEnumerable<string> GetBlockLines(BlockExpression block, TranslationContext context)
50+
private static IEnumerable<string> GetStatementsSeparator(
51+
ICollection<string> variables,
52+
IList<string> statements)
53+
{
54+
if ((variables.Count > 0) && LeaveBlankLineBefore(statements[0]))
55+
{
56+
yield return string.Empty;
57+
}
58+
}
59+
60+
private static IEnumerable<string> GetBlockStatements(
61+
BlockExpression block,
62+
TranslationContext context)
63+
{
64+
var lines = GetBlockLines(block, context);
65+
66+
var finalLineIndex = lines.Count - 1;
67+
68+
for (var i = 0; i < lines.Count; i++)
69+
{
70+
var line = lines[i];
71+
72+
if ((i > 0) && LeaveBlankLineBefore(line))
73+
{
74+
yield return string.Empty;
75+
}
76+
77+
if (i != finalLineIndex)
78+
{
79+
yield return line;
80+
81+
if (LeaveBlankLineAfter(line, lines[i + 1]))
82+
{
83+
yield return string.Empty;
84+
}
85+
86+
continue;
87+
}
88+
89+
if (DoNotAddReturnStatement(block, lines))
90+
{
91+
yield return line;
92+
yield break;
93+
}
94+
95+
if (CodeBlock.IsSingleStatement(line.SplitToLines()))
96+
{
97+
yield return "return " + line;
98+
yield break;
99+
}
100+
101+
yield return CodeBlock.InsertReturnKeyword(line);
102+
}
103+
}
104+
105+
private static IList<string> GetBlockLines(BlockExpression block, TranslationContext context)
51106
{
52107
return block
53108
.Expressions
@@ -58,7 +113,8 @@ private static IEnumerable<string> GetBlockLines(BlockExpression block, Translat
58113
Translation = GetTerminatedStatementOrNull(exp, context)
59114
})
60115
.Where(d => d.Translation != null)
61-
.Select(d => d.Translation);
116+
.Select(d => d.Translation)
117+
.ToArray();
62118
}
63119

64120
private static bool Include(Expression expression)
@@ -135,40 +191,9 @@ private static bool UseFullTypeName(BinaryExpression assignment)
135191
return conditional.IfTrue.Type != conditional.IfFalse.Type;
136192
}
137193

138-
private static IEnumerable<string> ProcessBlockContents(IList<string> lines, BlockExpression block)
194+
private static bool LeaveBlankLineBefore(string line)
139195
{
140-
var finalLineIndex = lines.Count - 1;
141-
142-
for (var i = 0; i < lines.Count; i++)
143-
{
144-
var line = lines[i];
145-
146-
if (i != finalLineIndex)
147-
{
148-
yield return line;
149-
150-
if (LeaveBlankLineAfter(line, lines[i + 1]))
151-
{
152-
yield return string.Empty;
153-
}
154-
155-
continue;
156-
}
157-
158-
if (DoNotAddReturnStatement(block, lines))
159-
{
160-
yield return line;
161-
yield break;
162-
}
163-
164-
if (CodeBlock.IsSingleStatement(line.SplitToLines()))
165-
{
166-
yield return "return " + line;
167-
yield break;
168-
}
169-
170-
yield return CodeBlock.InsertReturnKeyword(line);
171-
}
196+
return line.StartsWith("if (") || line.StartsWith("switch ");
172197
}
173198

174199
private static bool LeaveBlankLineAfter(string line, string nextLine)
@@ -179,12 +204,7 @@ private static bool LeaveBlankLineAfter(string line, string nextLine)
179204

180205
private static bool IsMultiLineStatement(string line)
181206
{
182-
if (!line.Contains(Environment.NewLine))
183-
{
184-
return false;
185-
}
186-
187-
return line
207+
return line.IsMultiLine() && line
188208
.SplitToLines(StringSplitOptions.RemoveEmptyEntries)
189209
.Any(l => !l.IsTerminated());
190210
}

0 commit comments

Comments
 (0)