Skip to content

Commit 04ce002

Browse files
Fixing issue with trailing commas that have a trailing comment (#1301)
closes #1300 --------- Co-authored-by: Lasath Fernando <devel@lasath.org>
1 parent 29f9db4 commit 04ce002

File tree

8 files changed

+74
-24
lines changed

8 files changed

+74
-24
lines changed

Src/CSharpier.Tests/FormattingTests/TestFiles/cs/InitializerExpressions.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ class ClassName
22
{
33
int[] array = { 1, 2 };
44

5+
int[] array =
6+
[
7+
1, // some comment
8+
];
9+
510
int[] array =
611
{
712
"someLongValue_____________________________________",
@@ -58,6 +63,10 @@ class ClassName
5863

5964
var x = new OneProperty { One = true };
6065
var x = new TwoProperties { One = true, Two = true };
66+
var x = new TwoProperties
67+
{
68+
One = true, // comment
69+
};
6170
var x = new ThreeProperties
6271
{
6372
One = true,

Src/CSharpier/SyntaxPrinter/SeparatedSyntaxList.cs

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,35 @@ public static Doc Print<T>(
77
Func<T, FormattingContext, Doc> printFunc,
88
Doc afterSeparator,
99
FormattingContext context,
10-
int startingIndex = 0,
11-
Doc? trailingSeparator = null
10+
int startingIndex = 0
11+
)
12+
where T : SyntaxNode
13+
{
14+
return Print(list, printFunc, afterSeparator, context, startingIndex, null);
15+
}
16+
17+
public static Doc PrintWithTrailingComma<T>(
18+
SeparatedSyntaxList<T> list,
19+
Func<T, FormattingContext, Doc> printFunc,
20+
Doc afterSeparator,
21+
FormattingContext context,
22+
SyntaxToken? closingToken = null
23+
)
24+
where T : SyntaxNode
25+
{
26+
return Print(list, printFunc, afterSeparator, context, 0, closingToken);
27+
}
28+
29+
// the names above aren't totally accurate
30+
// sometimes there are trailing commas with calls to Print (some patterns do that)
31+
// and if you pass null to PrintWithTrailingComma it won't add a trailing comma if there isn't one
32+
private static Doc Print<T>(
33+
SeparatedSyntaxList<T> list,
34+
Func<T, FormattingContext, Doc> printFunc,
35+
Doc afterSeparator,
36+
FormattingContext context,
37+
int startingIndex,
38+
SyntaxToken? closingToken
1239
)
1340
where T : SyntaxNode
1441
{
@@ -17,21 +44,35 @@ public static Doc Print<T>(
1744
{
1845
docs.Add(printFunc(list[x], context));
1946

20-
var isTrailingSeparator = x == list.Count - 1;
21-
47+
// if the syntax tree doesn't have a trailing comma but we want want, then add it
2248
if (x >= list.SeparatorCount)
2349
{
24-
if (isTrailingSeparator && trailingSeparator != null)
50+
if (closingToken != null)
2551
{
26-
docs.Add(trailingSeparator);
52+
docs.Add(TrailingComma.Print(closingToken.Value, context));
2753
}
2854

2955
continue;
3056
}
3157

58+
var isTrailingSeparator = x == list.Count - 1;
59+
3260
if (isTrailingSeparator)
3361
{
34-
docs.Add(Doc.IfBreak(Token.Print(list.GetSeparator(x), context), Doc.Null));
62+
var trailingSeparatorToken = list.GetSeparator(x);
63+
// when the trailing separator has trailing comments, we have to print it normally to prevent it from collapsing
64+
if (trailingSeparatorToken.TrailingTrivia.Any(o => o.IsComment()))
65+
{
66+
docs.Add(Token.Print(trailingSeparatorToken, context));
67+
}
68+
else if (closingToken != null)
69+
{
70+
docs.Add(TrailingComma.Print(closingToken.Value, context));
71+
}
72+
else
73+
{
74+
docs.Add(Doc.IfBreak(Token.Print(list.GetSeparator(x), context), Doc.Null));
75+
}
3576
}
3677
else
3778
{

Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/AnonymousObjectCreationExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ public static Doc Print(AnonymousObjectCreationExpressionSyntax node, Formatting
1212
node.Initializers.Any()
1313
? Doc.Indent(
1414
alwaysBreak ? Doc.HardLine : Doc.Line,
15-
SeparatedSyntaxList.Print(
15+
SeparatedSyntaxList.PrintWithTrailingComma(
1616
node.Initializers,
1717
AnonymousObjectMemberDeclarator.Print,
1818
Doc.Line,
1919
context,
20-
trailingSeparator: TrailingComma.Print(node.CloseBraceToken, context)
20+
node.CloseBraceToken
2121
)
2222
)
2323
: Doc.Null,

Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/CollectionExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ or ExpressionStatementSyntax
3232
node.Elements.Any()
3333
? Doc.Indent(
3434
alwaysBreak ? Doc.HardLine : Doc.IfBreak(Doc.Line, Doc.Null),
35-
SeparatedSyntaxList.Print(
35+
SeparatedSyntaxList.PrintWithTrailingComma(
3636
node.Elements,
3737
Node.Print,
3838
alwaysBreak ? Doc.HardLine : Doc.Line,
3939
context,
40-
trailingSeparator: TrailingComma.Print(node.CloseBracketToken, context)
40+
node.CloseBracketToken
4141
)
4242
)
4343
: Doc.Null,

Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/InitializerExpression.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ is SyntaxKind.ArrayInitializerExpression
3434
: Doc.Concat(
3535
Doc.Indent(
3636
alwaysBreak ? Doc.HardLine : Doc.Line,
37-
SeparatedSyntaxList.Print(
37+
SeparatedSyntaxList.PrintWithTrailingComma(
3838
node.Expressions,
3939
Node.Print,
4040
alwaysBreak ? Doc.HardLine : Doc.Line,
4141
context,
42-
trailingSeparator: node.Kind()
42+
closingToken: node.Kind()
4343
is not SyntaxKind.ComplexElementInitializerExpression
44-
? TrailingComma.Print(node.CloseBraceToken, context)
45-
: Doc.Null
44+
? node.CloseBraceToken
45+
: null
4646
)
4747
),
4848
alwaysBreak ? Doc.HardLine : Doc.Line

Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/ListPattern.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ public static Doc Print(ListPatternSyntax node, FormattingContext context)
88
Token.Print(node.OpenBracketToken, context),
99
Doc.Indent(
1010
Doc.SoftLine,
11-
SeparatedSyntaxList.Print(
11+
SeparatedSyntaxList.PrintWithTrailingComma(
1212
node.Patterns,
1313
Node.Print,
1414
Doc.Line,
1515
context,
16-
trailingSeparator: TrailingComma.Print(node.CloseBracketToken, context)
16+
node.CloseBracketToken
1717
)
1818
),
1919
Doc.SoftLine,

Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/SwitchExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public static Doc Print(SwitchExpressionSyntax node, FormattingContext context)
77
var sections = Doc.Group(
88
Doc.Indent(
99
Doc.HardLine,
10-
SeparatedSyntaxList.Print(
10+
SeparatedSyntaxList.PrintWithTrailingComma(
1111
node.Arms,
1212
(o, _) =>
1313
Doc.Concat(
@@ -34,7 +34,7 @@ public static Doc Print(SwitchExpressionSyntax node, FormattingContext context)
3434
),
3535
Doc.HardLine,
3636
context,
37-
trailingSeparator: TrailingComma.Print(node.CloseBraceToken, context)
37+
node.CloseBraceToken
3838
)
3939
),
4040
Doc.HardLine

Src/CSharpier/SyntaxPrinter/TrailingComma.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ namespace CSharpier.SyntaxPrinter;
22

33
internal static class TrailingComma
44
{
5-
public static Doc Print(SyntaxToken nextSyntaxToken, FormattingContext context)
5+
public static Doc Print(SyntaxToken closingToken, FormattingContext context)
66
{
7-
return !nextSyntaxToken.LeadingTrivia.Any(o => o.IsDirective)
8-
? Doc.IfBreak(
7+
return closingToken.LeadingTrivia.Any(o => o.IsDirective)
8+
? Doc.Null
9+
: Doc.IfBreak(
910
Token.Print(SyntaxFactory.Token(SyntaxKind.CommaToken), context),
1011
Doc.Null
11-
)
12-
: Doc.Null;
12+
);
1313
}
1414
}

0 commit comments

Comments
 (0)