Skip to content

Commit 6808f6b

Browse files
committed
Fixed spacing issue for SA1139 code fix
1 parent cbec141 commit 6808f6b

2 files changed

Lines changed: 53 additions & 3 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/ReadabilityRules/SA1139CodeFixProvider.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
4747
private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken)
4848
{
4949
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
50-
var oldSemanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
5150

5251
if (!(syntaxRoot.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true) is CastExpressionSyntax node))
5352
{
@@ -68,9 +67,18 @@ private static SyntaxNode GenerateReplacementNode(CastExpressionSyntax node)
6867
(LiteralExpressionSyntax)plusMinusSyntax.Operand.WalkDownParentheses();
6968
var typeToken = node.Type.GetFirstToken();
7069
var replacementLiteral = literalExpressionSyntax.WithLiteralSuffix(typeToken.Kind());
70+
71+
var newLeadingTrivia = SyntaxFactory.TriviaList(node.GetLeadingTrivia().Concat(node.CloseParenToken.TrailingTrivia).Concat(node.Expression.GetLeadingTrivia()))
72+
.WithoutLeadingWhitespace()
73+
.WithoutTrailingWhitespace();
74+
75+
if (newLeadingTrivia.Count != 0)
76+
{
77+
newLeadingTrivia = newLeadingTrivia.Add(SyntaxFactory.Space);
78+
}
79+
7180
var replacementNode = node.Expression.ReplaceNode(literalExpressionSyntax, replacementLiteral)
72-
.WithLeadingTrivia(node.GetLeadingTrivia().Concat(node.CloseParenToken.TrailingTrivia).Concat(node.Expression.GetLeadingTrivia()))
73-
.WithTrailingTrivia(node.Expression.GetTrailingTrivia().Concat(node.GetTrailingTrivia()));
81+
.WithLeadingTrivia(newLeadingTrivia);
7482

7583
return replacementNode;
7684
}

StyleCop.Analyzers/StyleCop.Analyzers.Test/ReadabilityRules/SA1139UnitTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,5 +266,47 @@ public void Method()
266266

267267
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
268268
}
269+
270+
/// <summary>
271+
/// Verifies that the codefix will not insert extraneous spaces.
272+
/// </summary>
273+
/// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns>
274+
[Fact]
275+
[WorkItem(2901, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2901")]
276+
public async Task TestCodeFixDoesNotAddExtraneousSpacesAsync()
277+
{
278+
var testCode = @"
279+
public class TestClass
280+
{
281+
public void TestMethod()
282+
{
283+
var x = (long)64 * 1024;
284+
var y = (double)64 /* test */ * 1024;
285+
var z = (long) /* test */ 64 * 1024;
286+
}
287+
}
288+
";
289+
290+
var fixedCode = @"
291+
public class TestClass
292+
{
293+
public void TestMethod()
294+
{
295+
var x = 64L * 1024;
296+
var y = 64D /* test */ * 1024;
297+
var z = /* test */ 64L * 1024;
298+
}
299+
}
300+
";
301+
302+
DiagnosticResult[] expectedDiagnosticResult =
303+
{
304+
Diagnostic().WithLocation(6, 17),
305+
Diagnostic().WithLocation(7, 17),
306+
Diagnostic().WithLocation(8, 17),
307+
};
308+
309+
await VerifyCSharpFixAsync(testCode, expectedDiagnosticResult, fixedCode, CancellationToken.None).ConfigureAwait(false);
310+
}
269311
}
270312
}

0 commit comments

Comments
 (0)