Skip to content

Commit 9724e3d

Browse files
authored
Merge pull request #3408 from bjornhellander/feature/Issue3369TargetTypedNew
Update SA1116 and SA1117 to handle target-typed new (C# 9)
2 parents aacf8a5 + 86cceed commit 9724e3d

File tree

4 files changed

+105
-0
lines changed

4 files changed

+105
-0
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/ReadabilityRules/SA1116CSharp9UnitTests.cs

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

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

815
public class SA1116CSharp9UnitTests : SA1116CSharp8UnitTests
916
{
17+
[Fact]
18+
public async Task TestTargetTypedNewExpressionnAsync()
19+
{
20+
var testCode = @"
21+
class Foo
22+
{
23+
public Foo(int a, int b)
24+
{
25+
}
26+
27+
public void Method()
28+
{
29+
Foo x = new(1,
30+
2);
31+
}
32+
}";
33+
34+
var fixedCode = @"
35+
class Foo
36+
{
37+
public Foo(int a, int b)
38+
{
39+
}
40+
41+
public void Method()
42+
{
43+
Foo x = new(
44+
1,
45+
2);
46+
}
47+
}";
48+
49+
DiagnosticResult expected = Diagnostic().WithLocation(10, 21);
50+
await VerifyCSharpFixAsync(testCode, expected, fixedCode, CancellationToken.None).ConfigureAwait(false);
51+
}
1052
}
1153
}

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/ReadabilityRules/SA1117CSharp9UnitTests.cs

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

44
namespace StyleCop.Analyzers.Test.CSharp9.ReadabilityRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.CSharp8.ReadabilityRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopDiagnosticVerifier<StyleCop.Analyzers.ReadabilityRules.SA1117ParametersMustBeOnSameLineOrSeparateLines>;
712

813
public class SA1117CSharp9UnitTests : SA1117CSharp8UnitTests
914
{
15+
[Fact]
16+
public async Task TestValidTargetTypedNewExpressionAsync()
17+
{
18+
var testCode = @"
19+
class Foo
20+
{
21+
public Foo(int a, int b, int c)
22+
{
23+
}
24+
25+
public void Method()
26+
{
27+
Foo x = new(
28+
1,
29+
2,
30+
3);
31+
}
32+
}";
33+
34+
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
35+
}
36+
37+
[Fact]
38+
public async Task TestInvalidTargetTypedNewExpressionAsync()
39+
{
40+
var testCode = @"
41+
class Foo
42+
{
43+
public Foo(int a, int b, int c)
44+
{
45+
}
46+
47+
public void Method()
48+
{
49+
Foo x = new(1,
50+
2, 3);
51+
}
52+
}";
53+
54+
DiagnosticResult expected = Diagnostic().WithLocation(11, 16);
55+
await VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
56+
}
1057
}
1158
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1116SplitParametersMustStartOnLineAfterDeclaration.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ internal class SA1116SplitParametersMustStartOnLineAfterDeclaration : Diagnostic
6161
private static readonly Action<SyntaxNodeAnalysisContext> IndexerDeclarationAction = HandleIndexerDeclaration;
6262
private static readonly Action<SyntaxNodeAnalysisContext> InvocationExpressionAction = HandleInvocationExpression;
6363
private static readonly Action<SyntaxNodeAnalysisContext> ObjectCreationExpressionAction = HandleObjectCreationExpression;
64+
private static readonly Action<SyntaxNodeAnalysisContext> ImplicitObjectCreationExpressionAction = HandleImplicitObjectCreationExpression;
6465
private static readonly Action<SyntaxNodeAnalysisContext> ElementAccessExpressionAction = HandleElementAccessExpression;
6566
private static readonly Action<SyntaxNodeAnalysisContext> ElementBindingExpressionAction = HandleElementBindingExpression;
6667
private static readonly Action<SyntaxNodeAnalysisContext> ImplicitElementAccessAction = HandleImplicitElementAccess;
@@ -86,6 +87,7 @@ public override void Initialize(AnalysisContext context)
8687
context.RegisterSyntaxNodeAction(IndexerDeclarationAction, SyntaxKind.IndexerDeclaration);
8788
context.RegisterSyntaxNodeAction(InvocationExpressionAction, SyntaxKind.InvocationExpression);
8889
context.RegisterSyntaxNodeAction(ObjectCreationExpressionAction, SyntaxKind.ObjectCreationExpression);
90+
context.RegisterSyntaxNodeAction(ImplicitObjectCreationExpressionAction, SyntaxKindEx.ImplicitObjectCreationExpression);
8991
context.RegisterSyntaxNodeAction(ElementAccessExpressionAction, SyntaxKind.ElementAccessExpression);
9092
context.RegisterSyntaxNodeAction(ElementBindingExpressionAction, SyntaxKind.ElementBindingExpression);
9193
context.RegisterSyntaxNodeAction(ImplicitElementAccessAction, SyntaxKind.ImplicitElementAccess);
@@ -119,6 +121,12 @@ private static void HandleObjectCreationExpression(SyntaxNodeAnalysisContext con
119121
HandleArgumentListSyntax(context, objectCreation.ArgumentList);
120122
}
121123

124+
private static void HandleImplicitObjectCreationExpression(SyntaxNodeAnalysisContext context)
125+
{
126+
var implicitObjectCreation = (ImplicitObjectCreationExpressionSyntaxWrapper)context.Node;
127+
HandleArgumentListSyntax(context, implicitObjectCreation.ArgumentList);
128+
}
129+
122130
private static void HandleIndexerDeclaration(SyntaxNodeAnalysisContext context)
123131
{
124132
var indexerDeclaration = (IndexerDeclarationSyntax)context.Node;

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1117ParametersMustBeOnSameLineOrSeparateLines.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ internal class SA1117ParametersMustBeOnSameLineOrSeparateLines : DiagnosticAnaly
7272
private static readonly Action<SyntaxNodeAnalysisContext> IndexerDeclarationAction = HandleIndexerDeclaration;
7373
private static readonly Action<SyntaxNodeAnalysisContext> InvocationExpressionAction = HandleInvocationExpression;
7474
private static readonly Action<SyntaxNodeAnalysisContext> ObjectCreationExpressionAction = HandleObjectCreationExpression;
75+
private static readonly Action<SyntaxNodeAnalysisContext> ImplicitObjectCreationExpressionAction = HandleImplicitObjectCreationExpression;
7576
private static readonly Action<SyntaxNodeAnalysisContext> ElementAccessExpressionAction = HandleElementAccessExpression;
7677
private static readonly Action<SyntaxNodeAnalysisContext> ElementBindingExpressionAction = HandleElementBindingExpression;
7778
private static readonly Action<SyntaxNodeAnalysisContext> ArrayCreationExpressionAction = HandleArrayCreationExpression;
@@ -96,6 +97,7 @@ public override void Initialize(AnalysisContext context)
9697
context.RegisterSyntaxNodeAction(IndexerDeclarationAction, SyntaxKind.IndexerDeclaration);
9798
context.RegisterSyntaxNodeAction(InvocationExpressionAction, SyntaxKind.InvocationExpression);
9899
context.RegisterSyntaxNodeAction(ObjectCreationExpressionAction, SyntaxKind.ObjectCreationExpression);
100+
context.RegisterSyntaxNodeAction(ImplicitObjectCreationExpressionAction, SyntaxKindEx.ImplicitObjectCreationExpression);
99101
context.RegisterSyntaxNodeAction(ElementAccessExpressionAction, SyntaxKind.ElementAccessExpression);
100102
context.RegisterSyntaxNodeAction(ElementBindingExpressionAction, SyntaxKind.ElementBindingExpression);
101103
context.RegisterSyntaxNodeAction(ArrayCreationExpressionAction, SyntaxKind.ArrayCreationExpression);
@@ -128,6 +130,12 @@ private static void HandleObjectCreationExpression(SyntaxNodeAnalysisContext con
128130
HandleArgumentListSyntax(context, objectCreation.ArgumentList);
129131
}
130132

133+
private static void HandleImplicitObjectCreationExpression(SyntaxNodeAnalysisContext context)
134+
{
135+
var implicitObjectCreation = (ImplicitObjectCreationExpressionSyntaxWrapper)context.Node;
136+
HandleArgumentListSyntax(context, implicitObjectCreation.ArgumentList);
137+
}
138+
131139
private static void HandleIndexerDeclaration(SyntaxNodeAnalysisContext context)
132140
{
133141
var indexerDeclaration = (IndexerDeclarationSyntax)context.Node;

0 commit comments

Comments
 (0)