Skip to content

Commit f9cfef7

Browse files
committed
Fix SA1132 assumption that files match default end-of-line settings
1 parent fb992b7 commit f9cfef7

File tree

2 files changed

+28
-19
lines changed

2 files changed

+28
-19
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1132CodeFixProvider.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ namespace StyleCop.Analyzers.ReadabilityRules
1717
using Microsoft.CodeAnalysis.CSharp;
1818
using Microsoft.CodeAnalysis.CSharp.Syntax;
1919
using Microsoft.CodeAnalysis.Editing;
20+
using Microsoft.CodeAnalysis.Options;
21+
using Microsoft.CodeAnalysis.Text;
2022
using StyleCop.Analyzers.Helpers;
2123

2224
/// <summary>
@@ -58,8 +60,10 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
5860
private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken)
5961
{
6062
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
63+
var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
64+
var options = document.Project.Solution.Workspace.Options;
6165
var baseFieldDeclaration = (BaseFieldDeclarationSyntax)syntaxRoot.FindNode(diagnostic.Location.SourceSpan);
62-
List<BaseFieldDeclarationSyntax> newFieldDeclarations = SplitDeclaration(document, baseFieldDeclaration);
66+
List<BaseFieldDeclarationSyntax> newFieldDeclarations = SplitDeclaration(sourceText, options, baseFieldDeclaration);
6367

6468
if (newFieldDeclarations != null)
6569
{
@@ -72,12 +76,13 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
7276
return document;
7377
}
7478

75-
private static List<BaseFieldDeclarationSyntax> SplitDeclaration(Document document, BaseFieldDeclarationSyntax baseFieldDeclaration)
79+
private static List<BaseFieldDeclarationSyntax> SplitDeclaration(SourceText sourceText, OptionSet options, BaseFieldDeclarationSyntax baseFieldDeclaration)
7680
{
7781
if (baseFieldDeclaration is FieldDeclarationSyntax fieldDeclaration)
7882
{
7983
return DeclarationSplitter(
80-
document,
84+
sourceText,
85+
options,
8186
fieldDeclaration.Declaration,
8287
fieldDeclaration.WithDeclaration,
8388
fieldDeclaration.SemicolonToken.TrailingTrivia);
@@ -86,7 +91,8 @@ private static List<BaseFieldDeclarationSyntax> SplitDeclaration(Document docume
8691
if (baseFieldDeclaration is EventFieldDeclarationSyntax eventFieldDeclaration)
8792
{
8893
return DeclarationSplitter(
89-
document,
94+
sourceText,
95+
options,
9096
eventFieldDeclaration.Declaration,
9197
eventFieldDeclaration.WithDeclaration,
9298
eventFieldDeclaration.SemicolonToken.TrailingTrivia);
@@ -96,7 +102,8 @@ private static List<BaseFieldDeclarationSyntax> SplitDeclaration(Document docume
96102
}
97103

98104
private static List<BaseFieldDeclarationSyntax> DeclarationSplitter(
99-
Document document,
105+
SourceText sourceText,
106+
OptionSet options,
100107
VariableDeclarationSyntax declaration,
101108
Func<VariableDeclarationSyntax, BaseFieldDeclarationSyntax> declarationFactory,
102109
SyntaxTriviaList declarationTrailingTrivia)
@@ -145,17 +152,18 @@ private static List<BaseFieldDeclarationSyntax> DeclarationSplitter(
145152
else
146153
{
147154
SyntaxToken commaToken = nodeOrToken.AsToken();
155+
SyntaxTrivia endOfLineTrivia = FormattingHelper.GetEndOfLineForCodeFix(commaToken, sourceText, options);
148156
SyntaxTriviaList trailingTrivia = commaToken.TrailingTrivia;
149157
if (trailingTrivia.Any())
150158
{
151159
if (!trailingTrivia.Last().IsKind(SyntaxKind.EndOfLineTrivia))
152160
{
153-
trailingTrivia = trailingTrivia.WithoutTrailingWhitespace().Add(FormattingHelper.GetNewLineTrivia(document));
161+
trailingTrivia = trailingTrivia.WithoutTrailingWhitespace().Add(endOfLineTrivia);
154162
}
155163
}
156164
else
157165
{
158-
trailingTrivia = SyntaxTriviaList.Create(FormattingHelper.GetNewLineTrivia(document));
166+
trailingTrivia = SyntaxTriviaList.Create(endOfLineTrivia);
159167
}
160168

161169
newFieldDeclarations.Add(previous.WithTrailingTrivia(trailingTrivia));

StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1132UnitTests.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.
22
// Licensed under the MIT License. See LICENSE in the project root for license information.
33

4-
#nullable disable
5-
64
namespace StyleCop.Analyzers.Test.ReadabilityRules
75
{
86
using System.Threading;
97
using System.Threading.Tasks;
108
using Microsoft.CodeAnalysis.Testing;
9+
using StyleCop.Analyzers.Test.Helpers;
1110
using Xunit;
1211
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
1312
StyleCop.Analyzers.ReadabilityRules.SA1132DoNotCombineFields,
@@ -29,16 +28,18 @@ class Foo
2928
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
3029
}
3130

32-
[Fact]
33-
public async Task TestInvalidDeclarationAsync()
31+
[Theory]
32+
[InlineData("\n")]
33+
[InlineData("\r\n")]
34+
public async Task TestInvalidDeclarationAsync(string lineEnding)
3435
{
35-
const string testCode = @"
36+
string testCode = @"
3637
class Foo
3738
{
38-
private int a, b,/*foo*/c,d;
39-
public event System.Action aa, bb;
40-
}";
41-
const string fixedCode = @"
39+
{|#0:private int a, b,/*foo*/c,d;|}
40+
{|#1:public event System.Action aa, bb;|}
41+
}".ReplaceLineEndings(lineEnding);
42+
string fixedCode = @"
4243
class Foo
4344
{
4445
private int a;
@@ -47,12 +48,12 @@ class Foo
4748
private int d;
4849
public event System.Action aa;
4950
public event System.Action bb;
50-
}";
51+
}".ReplaceLineEndings(lineEnding);
5152

5253
DiagnosticResult[] expected =
5354
{
54-
Diagnostic().WithLocation(4, 5),
55-
Diagnostic().WithLocation(5, 5),
55+
Diagnostic().WithLocation(0),
56+
Diagnostic().WithLocation(1),
5657
};
5758

5859
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);

0 commit comments

Comments
 (0)