Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
update
  • Loading branch information
josefpihrt committed Sep 13, 2024
commit 97ef53edc685cf0dadf0f5f7b8827f6f52d80d32
82 changes: 23 additions & 59 deletions src/Formatting.Analyzers/CSharp/FixFormattingOfListAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,15 +184,14 @@ private static void Analyze<TNode>(

if (TriviaBlock.FromTrailing(nodeOrToken).IsWrapped)
{
if (i == 0
&& nodes.Count == 1
if (nodes.Count == 1
&& first.IsKind(SyntaxKind.Argument))
{
BracesBlock bracesBlock = GetBracesBlock(first, lines ??= first.SyntaxTree.GetText().Lines);
BracesBlock block = GetBracesBlock(first, lines ??= first.SyntaxTree.GetText().Lines);

if (bracesBlock.Token.IsKind(SyntaxKind.CloseBracketToken))
if (block.Token.IsKind(SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken))
{
AnalyzeBlock(indentationAnalysis, bracesBlock);
AnalyzeBlock(block, indentationAnalysis);
return;
}
}
Expand All @@ -215,11 +214,11 @@ private static void Analyze<TNode>(
if (nodes.Count == 1
&& first.IsKind(SyntaxKind.Argument))
{
BracesBlock bracesBlock = GetBracesBlock(first, lines ??= first.SyntaxTree.GetText().Lines);
BracesBlock block = GetBracesBlock(first, lines ??= first.SyntaxTree.GetText().Lines);

if (bracesBlock.Token.IsKind(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken))
if (block.Token.IsKind(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken))
{
AnalyzeBlock(indentationAnalysis, bracesBlock);
AnalyzeBlock(block, indentationAnalysis);
return;
}
}
Expand Down Expand Up @@ -337,23 +336,23 @@ string GetTitle()
}
}

void AnalyzeBlock(IndentationAnalysis indentationAnalysis, BracesBlock bracesBlock)
void AnalyzeBlock(BracesBlock block, IndentationAnalysis indentationAnalysis)
{
SyntaxToken token = bracesBlock.Token;
SyntaxToken token = block.Token;
SyntaxTriviaList leading = token.LeadingTrivia;

if (leading.Any())
{
SyntaxTrivia trivia = leading.Last();

if (trivia.IsWhitespaceTrivia()
&& trivia.SpanStart == bracesBlock.LineStartIndex
&& trivia.SpanStart == block.LineStartIndex
&& trivia.Span.Length != indentationAnalysis.IndentationLength)
{
ReportDiagnostic();
}
}
else if (bracesBlock.LineStartIndex == token.SpanStart)
else if (block.LineStartIndex == token.SpanStart)
{
ReportDiagnostic();
}
Expand All @@ -370,45 +369,45 @@ internal static BracesBlock GetBracesBlock(SyntaxNode node, TextLineCollection l
return default;

SyntaxToken openToken = node.FindToken(startIndex);
SyntaxNode enclosedNode = null;
SyntaxNode block = null;
var isOpenBraceAtEndOfLine = false;

if (IsOpenToken(openToken))
if (AnalyzeToken(openToken, isOpen: true))
{
SyntaxTriviaList trailing = openToken.TrailingTrivia;

if (trailing.Any()
&& trailing.Span.Contains(startIndex))
{
enclosedNode = openToken.Parent;
block = openToken.Parent;
isOpenBraceAtEndOfLine = true;
}
}

if (enclosedNode is null)
if (block is null)
{
startIndex = line.EndIncludingLineBreak;
openToken = node.FindToken(startIndex);

if (IsOpenToken(openToken))
if (AnalyzeToken(openToken, isOpen: true))
{
SyntaxTriviaList leading = openToken.LeadingTrivia;

if ((leading.Any() && leading.Span.Contains(startIndex))
|| (!leading.Any() && openToken.SpanStart == startIndex))
{
enclosedNode = openToken.Parent;
block = openToken.Parent;
}
}
}

if (enclosedNode is not null)
if (block is not null)
{
int endIndex = lines.GetLineFromPosition(node.Span.End).Start;
SyntaxToken closeToken = node.FindToken(endIndex);

if (IsCloseToken(closeToken)
&& object.ReferenceEquals(enclosedNode, closeToken.Parent))
if (AnalyzeToken(closeToken, isOpen: false)
&& object.ReferenceEquals(block, closeToken.Parent))
{
SyntaxTriviaList leading = closeToken.LeadingTrivia;

Expand All @@ -424,44 +423,9 @@ internal static BracesBlock GetBracesBlock(SyntaxNode node, TextLineCollection l

return default;

static bool IsOpenToken(SyntaxToken token)
{
if (token.IsKind(SyntaxKind.OpenBraceToken))
{
if (token.IsParentKind(SyntaxKind.Block)
&& (CSharpFacts.IsAnonymousFunctionExpression(token.Parent.Parent.Kind())))
{
return true;
}

if (token.IsParentKind(SyntaxKind.ObjectInitializerExpression)
&& token.Parent.Parent.IsKind(
SyntaxKind.ObjectCreationExpression,
SyntaxKind.AnonymousObjectCreationExpression,
SyntaxKind.ImplicitObjectCreationExpression))
{
return true;
}

if (token.IsParentKind(SyntaxKind.ArrayInitializerExpression)
&& token.Parent.Parent.IsKind(
SyntaxKind.ArrayCreationExpression,
SyntaxKind.ImplicitArrayCreationExpression))
{
return true;
}
}
#if ROSLYN_4_7
return token.IsKind(SyntaxKind.OpenBracketToken)
&& token.IsParentKind(SyntaxKind.CollectionExpression);
#else
return false;
#endif
}

static bool IsCloseToken(SyntaxToken token)
static bool AnalyzeToken(SyntaxToken token, bool isOpen)
{
if (token.IsKind(SyntaxKind.CloseBraceToken))
if (token.IsKind((isOpen) ? SyntaxKind.OpenBraceToken : SyntaxKind.CloseBraceToken))
{
if (token.IsParentKind(SyntaxKind.Block)
&& (CSharpFacts.IsAnonymousFunctionExpression(token.Parent.Parent.Kind())))
Expand All @@ -487,7 +451,7 @@ static bool IsCloseToken(SyntaxToken token)
}
}
#if ROSLYN_4_7
return token.IsKind(SyntaxKind.CloseBracketToken)
return token.IsKind((isOpen) ? SyntaxKind.OpenBracketToken : SyntaxKind.CloseBracketToken)
&& token.IsParentKind(SyntaxKind.CollectionExpression);
#else
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1307,13 +1307,13 @@ public C() { }

public C(C value) { }

public string P1 { get; set; }
public string P { get; set; }

C M()
{
return new C(new C
{
P1 = "a"
P = ""
});
}
}
Expand All @@ -1323,28 +1323,42 @@ C M()
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.FixFormattingOfList)]
public async Task TestNoDiagnostic_Multiline_CollectionExpression()
{
await VerifyNoDiagnosticAsync(@"
await VerifyNoDiagnosticAsync("""

class C
{
public C P { get; set; }

public string M(string[] values)
{
return null;
}

public void M2()
public string M1(string[] values)
{
object x =
string x =
P
.M(
.M1(
[
// some comment
// x
null,
])
.ToString();

return x;
}

public string M2(string value, string[] values)
{
string x =
P
.M2(
"",
[
// x
null,
])
.ToString();

return x;
}
}
");

""");
}
}