Skip to content

Commit

Permalink
Update SA1513 codefix to use the existing newline character sequence
Browse files Browse the repository at this point in the history
  • Loading branch information
bjornhellander committed Feb 25, 2023
1 parent 50610bc commit 7d4dc17
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ private static async Task<SyntaxNode> GetTransformedDocumentAsync(Document docum
diagnostics.Select(diagnostic => root.FindToken(diagnostic.Location.SourceSpan.End)),
(originalToken, rewrittenToken) =>
{
var newTrivia = rewrittenToken.LeadingTrivia.Insert(0, SyntaxFactory.CarriageReturnLineFeed);
var endOfLineTrivia = rewrittenToken.GetPrecedingEndOfLineTrivia();
var newTrivia = rewrittenToken.LeadingTrivia.Insert(0, endOfLineTrivia);
return rewrittenToken.WithLeadingTrivia(newTrivia);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1013,5 +1013,29 @@ public void TestMethod(string extraSupport)

await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
}

[Fact]
[WorkItem(3360, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3360")]
public async Task TestLineFeedEndOfLinesAsync()
{
var testCode =
"public class TestClass\n" +
"{\n" +
"}\n" +
"// Hello";

var fixedCode =
"public class TestClass\n" +
"{\n" +
"}\n" +
"\n" +
"// Hello";

DiagnosticResult[] expected =
{
Diagnostic().WithLocation(3, 2),
};
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
}
}
}
30 changes: 30 additions & 0 deletions StyleCop.Analyzers/StyleCop.Analyzers/Helpers/TokenHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -175,5 +175,35 @@ internal static bool IsFollowedByWhitespace(this SyntaxToken token)
triviaList = token.GetNextToken().LeadingTrivia;
return triviaList.Count > 0 && triviaList.First().IsKind(SyntaxKind.WhitespaceTrivia);
}

/// <summary>
/// Returns the closest end of line trivia preceding the <paramref name="token"/>.
/// This currently only looks immediately before the specified token.
/// </summary>
/// <param name="token">The token to process.</param>
/// <returns>The closest preceding end of line trivia, or <see cref="SyntaxFactory.CarriageReturnLineFeed"/> if none is found.</returns>
internal static SyntaxTrivia GetPrecedingEndOfLineTrivia(this SyntaxToken token)
{
var leadingTrivia = token.LeadingTrivia;
for (var i = leadingTrivia.Count - 1; i >= 0; i--)
{
if (leadingTrivia[i].IsKind(SyntaxKind.EndOfLineTrivia))
{
return leadingTrivia[i];
}
}

var prevToken = token.GetPreviousToken();
var prevTrailingTrivia = prevToken.TrailingTrivia;
for (var i = prevTrailingTrivia.Count - 1; i >= 0; i--)
{
if (prevTrailingTrivia[i].IsKind(SyntaxKind.EndOfLineTrivia))
{
return prevTrailingTrivia[i];
}
}

return SyntaxFactory.CarriageReturnLineFeed;
}
}
}

0 comments on commit 7d4dc17

Please sign in to comment.