Skip to content

Commit 2876b84

Browse files
committed
Fixing multiline constructor argument formatting
1 parent 4c65817 commit 2876b84

File tree

5 files changed

+71
-21
lines changed

5 files changed

+71
-21
lines changed

ReadableExpressions.UnitTests/WhenTranslatingObjectCreations.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Linq.Expressions;
77
using System.Text;
88
using Microsoft.VisualStudio.TestTools.UnitTesting;
9+
using NetStandardPolyfills;
910

1011
[TestClass]
1112
public class WhenTranslatingObjectCreations
@@ -268,6 +269,47 @@ public void ShouldTranslateAParameterConstructorParameter()
268269
Assert.AreEqual("new StringBuilder(str)", translated);
269270
}
270271

272+
[TestMethod]
273+
public void ShouldTranslateMultilineConstructorParameters()
274+
{
275+
Expression<Func<int>> consoleRead = () => Console.Read();
276+
277+
var catchAll = Expression.Catch(typeof(Exception), Expression.Default(typeof(int)));
278+
var tryReadInt = Expression.TryCatch(consoleRead.Body, catchAll);
279+
280+
var createStringBuilder = Expression.New(
281+
typeof(StringBuilder).GetPublicInstanceConstructor(typeof(int), typeof(int)),
282+
tryReadInt,
283+
tryReadInt);
284+
285+
const string EXPECTED = @"
286+
new StringBuilder(
287+
{
288+
try
289+
{
290+
return Console.Read();
291+
}
292+
catch
293+
{
294+
return default(int);
295+
}
296+
},
297+
{
298+
try
299+
{
300+
return Console.Read();
301+
}
302+
catch
303+
{
304+
return default(int);
305+
}
306+
})";
307+
308+
var translated = createStringBuilder.ToReadableString();
309+
310+
Assert.AreEqual(EXPECTED.TrimStart(), translated);
311+
}
312+
271313
[TestMethod]
272314
public void ShouldTranslateAnAnonymousTypeCreation()
273315
{

ReadableExpressions/StringExtensions.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace AgileObjects.ReadableExpressions
55
using System.Linq;
66
using System.Linq.Expressions;
77
using Extensions;
8+
using static System.Environment;
89

910
internal static class StringExtensions
1011
{
@@ -17,7 +18,7 @@ public static bool IsTerminated(this string codeLine)
1718
return codeLine.EndsWithAny(_terminatingCharacters) || codeLine.IsComment();
1819
}
1920

20-
var lastNewLine = codeLine.LastIndexOf(Environment.NewLine, StringComparison.Ordinal);
21+
var lastNewLine = codeLine.LastIndexOf(NewLine, StringComparison.Ordinal);
2122

2223
if (lastNewLine == -1)
2324
{
@@ -66,7 +67,7 @@ public static string Unterminated(this string codeLine)
6667
: codeLine;
6768
}
6869

69-
private static readonly string[] _newLines = { Environment.NewLine };
70+
private static readonly string[] _newLines = { NewLine };
7071

7172
public static string[] SplitToLines(this string line, StringSplitOptions splitOptions = StringSplitOptions.None)
7273
{
@@ -90,15 +91,15 @@ public static string Indented(this string line)
9091
if (line.IsMultiLine())
9192
{
9293
return string.Join(
93-
Environment.NewLine,
94+
NewLine,
9495
line.SplitToLines().Select(l => l.Indented()));
9596
}
9697

9798
return IndentSpaces + line;
9899
}
99100

100101
public static bool IsMultiLine(this string value)
101-
=> (value != Environment.NewLine) && value.Contains(Environment.NewLine);
102+
=> (value != NewLine) && value.Contains(NewLine);
102103

103104
private const string UnindentPlaceholder = "*unindent*";
104105

@@ -184,7 +185,7 @@ private static bool KeepSurroundingParentheses(Expression expression)
184185

185186
public static bool StartsWithNewLine(this string value)
186187
{
187-
return value.StartsWith(Environment.NewLine, StringComparison.Ordinal);
188+
return value.StartsWith(NewLine, StringComparison.Ordinal);
188189
}
189190

190191
public static bool StartsWith(this string value, char character)
@@ -213,7 +214,7 @@ public static string AsComment(this string text)
213214
{
214215
return CommentString + text
215216
.Trim()
216-
.Replace(Environment.NewLine, Environment.NewLine + CommentString);
217+
.Replace(NewLine, NewLine + CommentString);
217218
}
218219

219220
public static bool IsComment(this string codeLine)

ReadableExpressions/Translators/Formatting/FormattedCondition.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public FormattedCondition(
2020

2121
if (test.IsMultiLine())
2222
{
23-
if (test.StartsWith(Environment.NewLine + '{'))
23+
if (test.StartsWith(Environment.NewLine + '{', StringComparison.Ordinal))
2424
{
2525
test = test.Indented();
2626
}
@@ -33,19 +33,15 @@ public FormattedCondition(
3333
MultipleLineTranslationFactory = GetMultipleLineTranslation;
3434
}
3535

36-
private bool CheckExistingParentheses()
37-
{
38-
// ReSharper disable once UnusedVariable
39-
return IsNotRelevantBinary(_condition, out BinaryExpression binary);
40-
}
36+
private bool CheckExistingParentheses() => IsNotRelevantBinary(_condition, out var _);
4137

4238
protected override Func<string> SingleLineTranslationFactory => () => _singleLineTest;
4339

4440
protected override Func<string> MultipleLineTranslationFactory { get; }
4541

4642
private string GetMultipleLineTranslation()
4743
{
48-
if (IsNotRelevantBinary(_condition, out BinaryExpression conditionBinary))
44+
if (IsNotRelevantBinary(_condition, out var conditionBinary))
4945
{
5046
return _singleLineTest;
5147
}

ReadableExpressions/Translators/Formatting/ParameterSet.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Reflection;
88
using Extensions;
99
using NetStandardPolyfills;
10+
using static System.Environment;
1011

1112
internal class ParameterSet : FormattableExpressionBase
1213
{
@@ -81,7 +82,7 @@ private static string FormatParamsArray(string array)
8182
.SplitToLines(StringSplitOptions.RemoveEmptyEntries)
8283
.Select(line => line.Trim(' '));
8384

84-
var arrayValuesString = string.Join(Environment.NewLine, arrayValues);
85+
var arrayValuesString = string.Join(NewLine, arrayValues);
8586

8687
return arrayValuesString;
8788
}
@@ -241,12 +242,22 @@ protected override Func<string> MultipleLineTranslationFactory
241242
(_arguments[0].NodeType == ExpressionType.Quote);
242243

243244
var parameters = FormatParameters(
244-
"," + Environment.NewLine,
245+
"," + NewLine,
245246
a =>
246247
{
247248
hasSingleBlockArgument = hasSingleBlockArgument && a.IsMultiLine();
248249

249-
return hasSingleBlockArgument || compensateForQuotedLambda ? a : a.Indented();
250+
if (hasSingleBlockArgument || compensateForQuotedLambda)
251+
{
252+
return a;
253+
}
254+
255+
if (a.StartsWithNewLine())
256+
{
257+
a = a.Substring(NewLine.Length);
258+
}
259+
260+
return a.Indented();
250261
});
251262

252263
if (hasSingleBlockArgument)
@@ -258,15 +269,15 @@ protected override Func<string> MultipleLineTranslationFactory
258269
{
259270
if (compensateForQuotedLambda)
260271
{
261-
return Environment.NewLine + parameters
262-
.Substring(Environment.NewLine.Length)
263-
.Substring(parameters.IndexOf(Environment.NewLine, StringComparison.Ordinal));
272+
return NewLine + parameters
273+
.Substring(NewLine.Length)
274+
.Substring(parameters.IndexOf(NewLine, StringComparison.Ordinal));
264275
}
265276

266277
return parameters.TrimStart();
267278
}
268279

269-
return Environment.NewLine + parameters;
280+
return NewLine + parameters;
270281
};
271282
}
272283
}

ReadableExpressions/Translators/NewExpressionTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public override string Translate(Expression expression, TranslationContext conte
2626

2727
return "new " + typeName + parameters;
2828
}
29-
private string GetAnonymousTypeCreation(NewExpression newExpression, TranslationContext context)
29+
private static string GetAnonymousTypeCreation(NewExpression newExpression, TranslationContext context)
3030
{
3131
var constructorParameters = newExpression.Constructor.GetParameters();
3232

0 commit comments

Comments
 (0)