Skip to content

Commit 3d6a972

Browse files
committed
Fix handling of pointers to generic types
Fixes #3302
1 parent 23db6c0 commit 3d6a972

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

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

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

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

815
public class SA1015CSharp8UnitTests : SA1015CSharp7UnitTests
916
{
17+
[Fact]
18+
[WorkItem(3302, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3302")]
19+
public async Task TestGenericTypePointerAsync()
20+
{
21+
const string testCode = @"using System;
22+
23+
public struct Foo<T>
24+
{
25+
internal unsafe Foo<T [|>|] * Next1;
26+
internal unsafe Foo<T [|>|]* Next2;
27+
}";
28+
const string fixedCode = @"using System;
29+
30+
public struct Foo<T>
31+
{
32+
internal unsafe Foo<T> * Next1;
33+
internal unsafe Foo<T>* Next2;
34+
}";
35+
36+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
37+
}
1038
}
1139
}

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

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

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

815
public class SA1023CSharp8UnitTests : SA1023CSharp7UnitTests
916
{
17+
[Fact]
18+
[WorkItem(3302, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3302")]
19+
public async Task TestGenericTypePointerAsync()
20+
{
21+
const string testCode = @"using System;
22+
23+
public struct Foo<T>
24+
{
25+
internal unsafe Foo<T> [|*|] Next1;
26+
internal unsafe Foo<T>[|*|]Next2;
27+
internal unsafe Foo<T> [|[|*|]|]Next3;
28+
}";
29+
const string fixedCode = @"using System;
30+
31+
public struct Foo<T>
32+
{
33+
internal unsafe Foo<T>* Next1;
34+
internal unsafe Foo<T>* Next2;
35+
internal unsafe Foo<T>* Next3;
36+
}";
37+
38+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
39+
}
1040
}
1141
}

StyleCop.Analyzers/StyleCop.Analyzers/SpacingRules/SA1015ClosingGenericBracketsMustBeSpacedCorrectly.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ private static void HandleGreaterThanToken(SyntaxTreeAnalysisContext context, Sy
126126
allowTrailingSpace = true;
127127
break;
128128

129+
case SyntaxKind.AsteriskToken:
130+
allowTrailingNoSpace = nextToken.Parent.IsKind(SyntaxKind.PointerType);
131+
allowTrailingSpace = true;
132+
break;
133+
129134
case SyntaxKind.QuestionToken:
130135
allowTrailingNoSpace = nextToken.Parent.IsKind(SyntaxKind.NullableType);
131136
allowTrailingSpace = true;

0 commit comments

Comments
 (0)