Skip to content

Commit 9149f54

Browse files
committed
Add support for local functions to SA1116
1 parent 76df38f commit 9149f54

2 files changed

Lines changed: 54 additions & 0 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp7/ReadabilityRules/SA1116CSharp7UnitTests.cs

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

44
namespace StyleCop.Analyzers.Test.CSharp7.ReadabilityRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
68
using StyleCop.Analyzers.Test.ReadabilityRules;
9+
using TestHelper;
10+
using Xunit;
711

812
public class SA1116CSharp7UnitTests : SA1116UnitTests
913
{
14+
[Fact]
15+
public async Task TestValidLocalFunctionAsync()
16+
{
17+
var testCode = @"
18+
class Foo
19+
{
20+
public void Method()
21+
{
22+
object LocalFunction(int a, string s) => null;
23+
}
24+
}";
25+
await this.VerifyCSharpDiagnosticAsync(testCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
26+
}
27+
28+
[Fact]
29+
public async Task TestInvalidLocalFunctionsAsync()
30+
{
31+
var testCode = @"
32+
class Foo
33+
{
34+
public void Method()
35+
{
36+
object LocalFunction(int a,
37+
string s) => null;
38+
}
39+
}";
40+
var fixedCode = @"
41+
class Foo
42+
{
43+
public void Method()
44+
{
45+
object LocalFunction(
46+
int a,
47+
string s) => null;
48+
}
49+
}";
50+
DiagnosticResult expected = this.CSharpDiagnostic().WithLocation(6, 30);
51+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
52+
await this.VerifyCSharpDiagnosticAsync(fixedCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
53+
await this.VerifyCSharpFixAsync(testCode, fixedCode, cancellationToken: CancellationToken.None).ConfigureAwait(false);
54+
}
1055
}
1156
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace StyleCop.Analyzers.ReadabilityRules
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 parameters to a C# method or indexer call or declaration span across multiple lines, but the first parameter
@@ -54,6 +55,7 @@ internal class SA1116SplitParametersMustStartOnLineAfterDeclaration : Diagnostic
5455
ImmutableArray.Create(SyntaxKind.ConstructorDeclaration, SyntaxKind.MethodDeclaration, SyntaxKind.OperatorDeclaration);
5556

5657
private static readonly Action<SyntaxNodeAnalysisContext> BaseMethodDeclarationAction = HandleBaseMethodDeclaration;
58+
private static readonly Action<SyntaxNodeAnalysisContext> LocalFunctionStatementAction = HandleLocalFunctionStatement;
5759
private static readonly Action<SyntaxNodeAnalysisContext> ConstructorInitializerAction = HandleConstructorInitializer;
5860
private static readonly Action<SyntaxNodeAnalysisContext> DelegateDeclarationAction = HandleDelegateDeclaration;
5961
private static readonly Action<SyntaxNodeAnalysisContext> IndexerDeclarationAction = HandleIndexerDeclaration;
@@ -78,6 +80,7 @@ public override void Initialize(AnalysisContext context)
7880
context.EnableConcurrentExecution();
7981

8082
context.RegisterSyntaxNodeAction(BaseMethodDeclarationAction, BaseMethodDeclarationKinds);
83+
context.RegisterSyntaxNodeAction(LocalFunctionStatementAction, SyntaxKindEx.LocalFunctionStatement);
8184
context.RegisterSyntaxNodeAction(ConstructorInitializerAction, SyntaxKinds.ConstructorInitializer);
8285
context.RegisterSyntaxNodeAction(DelegateDeclarationAction, SyntaxKind.DelegateDeclaration);
8386
context.RegisterSyntaxNodeAction(IndexerDeclarationAction, SyntaxKind.IndexerDeclaration);
@@ -98,6 +101,12 @@ private static void HandleBaseMethodDeclaration(SyntaxNodeAnalysisContext contex
98101
HandleParameterListSyntax(context, declaration.ParameterList);
99102
}
100103

104+
private static void HandleLocalFunctionStatement(SyntaxNodeAnalysisContext context)
105+
{
106+
var statement = (LocalFunctionStatementSyntaxWrapper)context.Node;
107+
HandleParameterListSyntax(context, statement.ParameterList);
108+
}
109+
101110
private static void HandleInvocationExpression(SyntaxNodeAnalysisContext context)
102111
{
103112
var invocation = (InvocationExpressionSyntax)context.Node;

0 commit comments

Comments
 (0)