Skip to content

Commit d403d78

Browse files
committed
Fix SA1023 for C# 9 function pointer parameters
1 parent aa26bda commit d403d78

3 files changed

Lines changed: 66 additions & 0 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/SpacingRules/SA1023CSharp9UnitTests.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,66 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp9.SpacingRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.CSharp8.SpacingRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.SpacingRules.SA1023DereferenceAndAccessOfSymbolsMustBeSpacedCorrectly;
12+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
13+
StyleCop.Analyzers.SpacingRules.SA1023DereferenceAndAccessOfSymbolsMustBeSpacedCorrectly,
14+
StyleCop.Analyzers.SpacingRules.TokenSpacingCodeFixProvider>;
715

816
public class SA1023CSharp9UnitTests : SA1023CSharp8UnitTests
917
{
18+
[Fact]
19+
public async Task TestFunctionPointerParameterValidSpacingAsync()
20+
{
21+
var testCode = @"public class TestClass
22+
{
23+
unsafe delegate*<int*> FuncPtr;
24+
}
25+
";
26+
27+
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
28+
}
29+
30+
[Fact]
31+
public async Task TestFunctionPointerParameterInvalidPrecedingSpaceAsync()
32+
{
33+
var testCode = @"public class TestClass
34+
{
35+
unsafe delegate*<int *> FuncPtr;
36+
}
37+
";
38+
39+
var fixedCode = @"public class TestClass
40+
{
41+
unsafe delegate*<int*> FuncPtr;
42+
}
43+
";
44+
45+
var expected = Diagnostic(DescriptorNotPreceded).WithLocation(3, 26);
46+
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
47+
}
48+
49+
[Fact]
50+
public async Task TestFunctionPointerParameterInvalidTrailingSpaceAsync()
51+
{
52+
var testCode = @"public class TestClass
53+
{
54+
unsafe delegate*<int* > FuncPtr;
55+
}
56+
";
57+
58+
var fixedCode = @"public class TestClass
59+
{
60+
unsafe delegate*<int*> FuncPtr;
61+
}
62+
";
63+
64+
var expected = Diagnostic(DescriptorNotFollowed).WithLocation(3, 25);
65+
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
66+
}
1067
}
1168
}

StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ internal static class SyntaxKindEx
4949
public const SyntaxKind ImplicitStackAllocArrayCreationExpression = (SyntaxKind)9053;
5050
public const SyntaxKind SuppressNullableWarningExpression = (SyntaxKind)9054;
5151
public const SyntaxKind NullableDirectiveTrivia = (SyntaxKind)9055;
52+
public const SyntaxKind FunctionPointerParameter = (SyntaxKind)9057;
5253
public const SyntaxKind WithInitializerExpression = (SyntaxKind)9062;
5354
public const SyntaxKind RecordDeclaration = (SyntaxKind)9063;
5455
}

StyleCop.Analyzers/StyleCop.Analyzers/SpacingRules/SA1023DereferenceAndAccessOfSymbolsMustBeSpacedCorrectly.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace StyleCop.Analyzers.SpacingRules
1010
using Microsoft.CodeAnalysis.CSharp;
1111
using Microsoft.CodeAnalysis.Diagnostics;
1212
using StyleCop.Analyzers.Helpers;
13+
using StyleCop.Analyzers.Lightup;
1314

1415
/// <summary>
1516
/// A dereference symbol or an access-of symbol within a C# element is not spaced correctly.
@@ -113,6 +114,13 @@ private static void HandleAsteriskToken(SyntaxTreeAnalysisContext context, Synta
113114
bool allowTrailingSpace;
114115
switch (token.Parent.Kind())
115116
{
117+
case SyntaxKind.PointerType when token.Parent.Parent.IsKind(SyntaxKindEx.FunctionPointerParameter):
118+
allowAtLineStart = true;
119+
allowAtLineEnd = true;
120+
allowPrecedingSpace = false;
121+
allowTrailingSpace = false;
122+
break;
123+
116124
case SyntaxKind.PointerType:
117125
allowAtLineStart = false;
118126
allowAtLineEnd = true;

0 commit comments

Comments
 (0)