Skip to content

Commit 21c914a

Browse files
committed
Add support for local functions to SA1117
1 parent 9149f54 commit 21c914a

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,63 @@
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 SA1117CSharp7UnitTests : SA1117UnitTests
913
{
14+
[Fact]
15+
public async Task TestValidLocalFunctionsAsync()
16+
{
17+
var testCode = @"
18+
class Foo
19+
{
20+
public void Method()
21+
{
22+
void LocalFunction1(
23+
int a, int b, string s) { }
24+
25+
void LocalFunction2(
26+
int a,
27+
int b,
28+
string s) { }
29+
30+
object LocalFunction3(int a, int b, string s) => null;
31+
}
32+
}";
33+
await this.VerifyCSharpDiagnosticAsync(testCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
34+
}
35+
36+
[Fact]
37+
public async Task TestInvalidLocalFunctionsAsync()
38+
{
39+
var testCode = @"
40+
class Foo
41+
{
42+
public void Method()
43+
{
44+
object LocalFunction(int a, int b,
45+
string s) => null;
46+
}
47+
}";
48+
var fixedCode = @"
49+
class Foo
50+
{
51+
public void Method()
52+
{
53+
object LocalFunction(
54+
int a,
55+
int b,
56+
string s) => null;
57+
}
58+
}";
59+
DiagnosticResult expected = this.CSharpDiagnostic().WithLocation(7, 2);
60+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
61+
await this.VerifyCSharpDiagnosticAsync(fixedCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
62+
////await this.VerifyCSharpFixAsync(testCode, fixedCode, cancellationToken: CancellationToken.None).ConfigureAwait(false);
63+
}
1064
}
1165
}

StyleCop.Analyzers/StyleCop.Analyzers/ReadabilityRules/SA1117ParametersMustBeOnSameLineOrSeparateLines.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 are not all on the same line or each on a separate
@@ -65,6 +66,7 @@ internal class SA1117ParametersMustBeOnSameLineOrSeparateLines : DiagnosticAnaly
6566
ImmutableArray.Create(SyntaxKind.ConstructorDeclaration, SyntaxKind.MethodDeclaration);
6667

6768
private static readonly Action<SyntaxNodeAnalysisContext> BaseMethodDeclarationAction = HandleBaseMethodDeclaration;
69+
private static readonly Action<SyntaxNodeAnalysisContext> LocalFunctionStatementAction = HandleLocalFunctionStatement;
6870
private static readonly Action<SyntaxNodeAnalysisContext> ConstructorInitializerAction = HandleConstructorInitializer;
6971
private static readonly Action<SyntaxNodeAnalysisContext> DelegateDeclarationAction = HandleDelegateDeclaration;
7072
private static readonly Action<SyntaxNodeAnalysisContext> IndexerDeclarationAction = HandleIndexerDeclaration;
@@ -88,6 +90,7 @@ public override void Initialize(AnalysisContext context)
8890
context.EnableConcurrentExecution();
8991

9092
context.RegisterSyntaxNodeAction(BaseMethodDeclarationAction, BaseMethodDeclarationKinds);
93+
context.RegisterSyntaxNodeAction(LocalFunctionStatementAction, SyntaxKindEx.LocalFunctionStatement);
9194
context.RegisterSyntaxNodeAction(ConstructorInitializerAction, SyntaxKinds.ConstructorInitializer);
9295
context.RegisterSyntaxNodeAction(DelegateDeclarationAction, SyntaxKind.DelegateDeclaration);
9396
context.RegisterSyntaxNodeAction(IndexerDeclarationAction, SyntaxKind.IndexerDeclaration);
@@ -107,6 +110,12 @@ private static void HandleBaseMethodDeclaration(SyntaxNodeAnalysisContext contex
107110
HandleParameterListSyntax(context, declaration.ParameterList);
108111
}
109112

113+
private static void HandleLocalFunctionStatement(SyntaxNodeAnalysisContext context)
114+
{
115+
var statement = (LocalFunctionStatementSyntaxWrapper)context.Node;
116+
HandleParameterListSyntax(context, statement.ParameterList);
117+
}
118+
110119
private static void HandleInvocationExpression(SyntaxNodeAnalysisContext context)
111120
{
112121
var invocation = (InvocationExpressionSyntax)context.Node;

0 commit comments

Comments
 (0)