Skip to content

Commit b5b91d7

Browse files
authored
Merge pull request #3409 from bjornhellander/feature/Issue3386CastInRange
Update SA1003 and SA1008 to not require space before a cast inside a range expression
2 parents ca7ccd2 + d2a3d2b commit b5b91d7

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp8/SpacingRules/SA1003CSharp8UnitTests.cs

+58
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,67 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp8.SpacingRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.CSharp;
9+
using Microsoft.CodeAnalysis.Testing;
610
using StyleCop.Analyzers.Test.CSharp7.SpacingRules;
11+
using Xunit;
12+
13+
using static StyleCop.Analyzers.SpacingRules.SA1003SymbolsMustBeSpacedCorrectly;
14+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
15+
StyleCop.Analyzers.SpacingRules.SA1003SymbolsMustBeSpacedCorrectly,
16+
StyleCop.Analyzers.SpacingRules.SA1003CodeFixProvider>;
717

818
public class SA1003CSharp8UnitTests : SA1003CSharp7UnitTests
919
{
20+
/// <summary>
21+
/// Verifies that spacing around a range expression double dots isn't required.
22+
/// </summary>
23+
/// <remarks>
24+
/// <para>Double dots of range expressions already provide enough spacing for readability so there is no
25+
/// need to surround the range expression with spaces.</para>
26+
/// </remarks>
27+
/// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns>
28+
[Fact]
29+
[WorkItem(3386, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3386")]
30+
public async Task TestRangeExpressionAsync()
31+
{
32+
var testCode = @"
33+
namespace TestNamespace
34+
{
35+
using System;
36+
public class TestClass
37+
{
38+
public void TestMethod()
39+
{
40+
var test1 = .. {|#0:(|}int)1;
41+
}
42+
}
43+
}
44+
";
45+
46+
var fixedCode = @"
47+
namespace TestNamespace
48+
{
49+
using System;
50+
public class TestClass
51+
{
52+
public void TestMethod()
53+
{
54+
var test1 = ..(int)1;
55+
}
56+
}
57+
}
58+
";
59+
60+
await new CSharpTest(LanguageVersion.CSharp8)
61+
{
62+
ReferenceAssemblies = ReferenceAssemblies.NetCore.NetCoreApp31,
63+
TestCode = testCode,
64+
ExpectedDiagnostics = { Diagnostic(DescriptorNotPrecededByWhitespace).WithLocation(0).WithArguments("(int)") },
65+
FixedCode = fixedCode,
66+
}.RunAsync(CancellationToken.None).ConfigureAwait(false);
67+
}
1068
}
1169
}

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp8/SpacingRules/SA1008CSharp8UnitTests.cs

+12-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ namespace StyleCop.Analyzers.Test.CSharp8.SpacingRules
88
using Microsoft.CodeAnalysis.CSharp;
99
using Microsoft.CodeAnalysis.Testing;
1010
using StyleCop.Analyzers.Test.CSharp7.SpacingRules;
11-
using StyleCop.Analyzers.Test.Verifiers;
1211
using Xunit;
1312

1413
using static StyleCop.Analyzers.SpacingRules.SA1008OpeningParenthesisMustBeSpacedCorrectly;
@@ -28,6 +27,7 @@ public class SA1008CSharp8UnitTests : SA1008CSharp7UnitTests
2827
/// </remarks>
2928
/// <returns>A <see cref="Task"/> representing the asynchronous unit test.</returns>
3029
[Fact]
30+
[WorkItem(3386, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3386")]
3131
public async Task TestAfterRangeExpressionAsync()
3232
{
3333
var testCode = @"
@@ -36,11 +36,12 @@ namespace TestNamespace
3636
using System;
3737
public class TestClass
3838
{
39-
public string TestMethod()
39+
public void TestMethod()
4040
{
4141
string str = ""test"";
4242
int finalLen = 4;
43-
return str[.. {|#0:(|}finalLen - 1)];
43+
var test1 = str[.. {|#0:(|}finalLen - 1)];
44+
var test2 = .. {|#1:(|}int)finalLen;
4445
}
4546
}
4647
}
@@ -52,11 +53,12 @@ namespace TestNamespace
5253
using System;
5354
public class TestClass
5455
{
55-
public string TestMethod()
56+
public void TestMethod()
5657
{
5758
string str = ""test"";
5859
int finalLen = 4;
59-
return str[..(finalLen - 1)];
60+
var test1 = str[..(finalLen - 1)];
61+
var test2 = ..(int)finalLen;
6062
}
6163
}
6264
}
@@ -66,7 +68,11 @@ public string TestMethod()
6668
{
6769
ReferenceAssemblies = ReferenceAssemblies.NetCore.NetCoreApp31,
6870
TestCode = testCode,
69-
ExpectedDiagnostics = { Diagnostic(DescriptorNotPreceded).WithLocation(0) },
71+
ExpectedDiagnostics =
72+
{
73+
Diagnostic(DescriptorNotPreceded).WithLocation(0),
74+
Diagnostic(DescriptorNotPreceded).WithLocation(1),
75+
},
7076
FixedCode = fixedCode,
7177
}.RunAsync(CancellationToken.None).ConfigureAwait(false);
7278
}

StyleCop.Analyzers/StyleCop.Analyzers/SpacingRules/SA1003SymbolsMustBeSpacedCorrectly.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace StyleCop.Analyzers.SpacingRules
1010
using Microsoft.CodeAnalysis.CSharp.Syntax;
1111
using Microsoft.CodeAnalysis.Diagnostics;
1212
using StyleCop.Analyzers.Helpers;
13+
using StyleCop.Analyzers.Lightup;
1314

1415
/// <summary>
1516
/// The spacing around an operator symbol is incorrect, within a C# code file.
@@ -344,7 +345,8 @@ private static void HandleCastExpression(SyntaxNodeAnalysisContext context)
344345
&& !(castExpression.Parent is CastExpressionSyntax)
345346
&& !precedingToken.IsKind(SyntaxKind.OpenParenToken)
346347
&& !precedingToken.IsKind(SyntaxKind.OpenBracketToken)
347-
&& !(precedingToken.IsKind(SyntaxKind.OpenBraceToken) && (precedingToken.Parent is InterpolationSyntax));
348+
&& !(precedingToken.IsKind(SyntaxKind.OpenBraceToken) && (precedingToken.Parent is InterpolationSyntax))
349+
&& !precedingToken.IsKind(SyntaxKindEx.DotDotToken);
348350

349351
var tokenString = castExpression.OpenParenToken.ToString() + castExpression.Type.ToString() + castExpression.CloseParenToken.ToString();
350352
CheckToken(context, castExpression.OpenParenToken, mustHaveLeadingWhitespace, false, false, tokenString);

StyleCop.Analyzers/StyleCop.Analyzers/SpacingRules/SA1008OpeningParenthesisMustBeSpacedCorrectly.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,9 @@ private static void HandleOpenParenToken(SyntaxTreeAnalysisContext context, Synt
231231
startOfIndexer = prevToken.IsKind(SyntaxKind.OpenBracketToken);
232232
var consecutiveCast = prevToken.IsKind(SyntaxKind.CloseParenToken) && prevToken.Parent.IsKind(SyntaxKind.CastExpression);
233233
var partOfInterpolation = prevToken.IsKind(SyntaxKind.OpenBraceToken) && prevToken.Parent.IsKind(SyntaxKind.Interpolation);
234+
var partOfRange = prevToken.IsKind(SyntaxKindEx.DotDotToken);
234235

235-
haveLeadingSpace = !partOfUnaryExpression && !startOfIndexer && !consecutiveCast && !partOfInterpolation;
236+
haveLeadingSpace = !partOfUnaryExpression && !startOfIndexer && !consecutiveCast && !partOfInterpolation && !partOfRange;
236237
break;
237238

238239
case SyntaxKind.ParameterList:

0 commit comments

Comments
 (0)