Skip to content

Commit c9c70d5

Browse files
committed
Fix SA1106 handling of semicolon at end of line
1 parent 19b9704 commit c9c70d5

File tree

1 file changed

+44
-14
lines changed

1 file changed

+44
-14
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1106CodeFixProvider.cs

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,50 @@ private static async Task<Document> RemoveEmptyStatementAsync(Document document,
8585
var options = document.Project.Solution.Workspace.Options;
8686
var endOfLine = FormattingHelper.GetEndOfLineForCodeFix(node.SemicolonToken, text, options);
8787
var settings = SettingsHelper.GetStyleCopSettingsInCodeFix(document.Project.AnalyzerOptions, root.SyntaxTree, cancellationToken);
88-
var indentSteps = IndentationHelper.GetIndentationSteps(settings.Indentation, node.Parent.GetFirstOnLineAncestorOrSelf());
89-
var indentTrivia = IndentationHelper.GenerateWhitespaceTrivia(settings.Indentation, indentSteps);
90-
var block = SyntaxFactory.Block(
91-
SyntaxFactory.Token(
92-
node.GetLeadingTrivia().WithoutTrailingWhitespace().Add(indentTrivia),
93-
SyntaxKind.OpenBraceToken,
94-
SyntaxFactory.TriviaList(endOfLine)),
95-
SyntaxFactory.List<StatementSyntax>(),
96-
SyntaxFactory.Token(
97-
SyntaxFactory.TriviaList(indentTrivia),
98-
SyntaxKind.CloseBraceToken,
99-
node.GetTrailingTrivia()));
100-
newRoot = root.ReplaceNode(node, block);
101-
return document.WithSyntaxRoot(newRoot);
88+
89+
if (node.SemicolonToken.IsFirstInLine())
90+
{
91+
var indentSteps = IndentationHelper.GetIndentationSteps(settings.Indentation, node.Parent.GetFirstOnLineAncestorOrSelf());
92+
var indentTrivia = IndentationHelper.GenerateWhitespaceTrivia(settings.Indentation, indentSteps);
93+
var block = SyntaxFactory.Block(
94+
SyntaxFactory.Token(
95+
node.GetLeadingTrivia().WithoutTrailingWhitespace().Add(indentTrivia),
96+
SyntaxKind.OpenBraceToken,
97+
SyntaxFactory.TriviaList(endOfLine)),
98+
SyntaxFactory.List<StatementSyntax>(),
99+
SyntaxFactory.Token(
100+
SyntaxFactory.TriviaList(indentTrivia),
101+
SyntaxKind.CloseBraceToken,
102+
node.GetTrailingTrivia()));
103+
newRoot = root.ReplaceNode(node, block);
104+
return document.WithSyntaxRoot(newRoot);
105+
}
106+
else
107+
{
108+
var firstTokenOnLine = IndentationHelper.GetFirstTokenOnTextLine(node.SemicolonToken);
109+
var previousToken = node.SemicolonToken.GetPreviousToken(includeZeroWidth: true);
110+
var replacementPreviousToken = previousToken.WithTrailingTrivia(previousToken.TrailingTrivia.WithoutTrailingWhitespace().Add(endOfLine));
111+
var indentSteps = IndentationHelper.GetIndentationSteps(settings.Indentation, firstTokenOnLine);
112+
var indentTrivia = IndentationHelper.GenerateWhitespaceTrivia(settings.Indentation, indentSteps);
113+
var block = SyntaxFactory.Block(
114+
SyntaxFactory.Token(
115+
node.GetLeadingTrivia().WithoutTrailingWhitespace().Add(indentTrivia),
116+
SyntaxKind.OpenBraceToken,
117+
SyntaxFactory.TriviaList(endOfLine)),
118+
SyntaxFactory.List<StatementSyntax>(),
119+
SyntaxFactory.Token(
120+
SyntaxFactory.TriviaList(indentTrivia),
121+
SyntaxKind.CloseBraceToken,
122+
node.GetTrailingTrivia()));
123+
newRoot = root.ReplaceSyntax(
124+
new[] { node },
125+
(originalNode, rewrittenNode) => block,
126+
new[] { previousToken },
127+
(originalToken, rewrittenToken) => replacementPreviousToken,
128+
new SyntaxTrivia[0],
129+
(originalToken, rewrittenToken) => rewrittenToken);
130+
return document.WithSyntaxRoot(newRoot);
131+
}
102132

103133
case SyntaxKind.LabeledStatement:
104134
// handle this case as a text manipulation for simplicity

0 commit comments

Comments
 (0)