Skip to content

Commit bdc34aa

Browse files
committed
Improve analyzer AddEmptyLineAfterClosingBrace (RCS1153).
1 parent eb88806 commit bdc34aa

File tree

2 files changed

+79
-3
lines changed

2 files changed

+79
-3
lines changed

src/Analyzers/CSharp/Analysis/AddEmptyLineAfterClosingBraceAnalyzer.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public override void Initialize(AnalysisContext context)
3030
context.RegisterSyntaxNodeAction(AnalyzeBlock, SyntaxKind.Block);
3131
context.RegisterSyntaxNodeAction(AnalyzeWhileStatement, SyntaxKind.WhileStatement);
3232
context.RegisterSyntaxNodeAction(AnalyzeForStatement, SyntaxKind.ForStatement);
33-
context.RegisterSyntaxNodeAction(AnalyzeForEachStatement, SyntaxKind.ForEachStatement);
33+
context.RegisterSyntaxNodeAction(AnalyzeCommonForEachStatement, SyntaxKind.ForEachStatement);
34+
context.RegisterSyntaxNodeAction(AnalyzeCommonForEachStatement, SyntaxKind.ForEachVariableStatement);
3435
context.RegisterSyntaxNodeAction(AnalyzeUsingStatement, SyntaxKind.UsingStatement);
3536
context.RegisterSyntaxNodeAction(AnalyzeFixedStatement, SyntaxKind.FixedStatement);
3637
context.RegisterSyntaxNodeAction(AnalyzeCheckedStatement, SyntaxKind.CheckedStatement);
@@ -40,6 +41,7 @@ public override void Initialize(AnalysisContext context)
4041
context.RegisterSyntaxNodeAction(AnalyzeIfStatement, SyntaxKind.IfStatement);
4142
context.RegisterSyntaxNodeAction(AnalyzeSwitchStatement, SyntaxKind.SwitchStatement);
4243
context.RegisterSyntaxNodeAction(AnalyzeTryStatement, SyntaxKind.TryStatement);
44+
context.RegisterSyntaxNodeAction(AnalyzeElseClause, SyntaxKind.ElseClause);
4345
}
4446

4547
private static void AnalyzeBlock(SyntaxNodeAnalysisContext context)
@@ -76,9 +78,9 @@ private static void AnalyzeForStatement(SyntaxNodeAnalysisContext context)
7678
}
7779
}
7880

79-
private static void AnalyzeForEachStatement(SyntaxNodeAnalysisContext context)
81+
private static void AnalyzeCommonForEachStatement(SyntaxNodeAnalysisContext context)
8082
{
81-
var forEachStatement = (ForEachStatementSyntax)context.Node;
83+
var forEachStatement = (CommonForEachStatementSyntax)context.Node;
8284

8385
if (forEachStatement.IsParentKind(SyntaxKind.Block))
8486
{
@@ -187,6 +189,21 @@ private static void AnalyzeTryStatement(SyntaxNodeAnalysisContext context)
187189
}
188190
}
189191

192+
private static void AnalyzeElseClause(SyntaxNodeAnalysisContext context)
193+
{
194+
var elseClause = (ElseClauseSyntax)context.Node;
195+
196+
if (elseClause.Statement?.Kind() == SyntaxKind.Block)
197+
{
198+
IfStatementSyntax ifStatement = elseClause.GetTopmostIf();
199+
200+
if (ifStatement.IsParentKind(SyntaxKind.Block))
201+
{
202+
AnalyzeStatement(context, ifStatement, (BlockSyntax)elseClause.Statement);
203+
}
204+
}
205+
}
206+
190207
private static void AnalyzeStatement(SyntaxNodeAnalysisContext context, StatementSyntax statement, BlockSyntax block)
191208
{
192209
if (block?.IsMissing == false)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright (c) Josef Pihrt. All rights reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
2+
3+
using System.Threading.Tasks;
4+
using Microsoft.CodeAnalysis;
5+
using Microsoft.CodeAnalysis.CodeFixes;
6+
using Microsoft.CodeAnalysis.Diagnostics;
7+
using Roslynator.CSharp.CodeFixes;
8+
using Xunit;
9+
10+
namespace Roslynator.CSharp.Analysis.Tests
11+
{
12+
public class RCS1153AddEmptyLineAfterClosingBraceTests : AbstractCSharpFixVerifier
13+
{
14+
public override DiagnosticDescriptor Descriptor { get; } = DiagnosticDescriptors.AddEmptyLineAfterClosingBrace;
15+
16+
public override DiagnosticAnalyzer Analyzer { get; } = new AddEmptyLineAfterClosingBraceAnalyzer();
17+
18+
public override CodeFixProvider FixProvider { get; } = new AddEmptyLineAfterClosingBraceCodeFixProvider();
19+
20+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.AddEmptyLineAfterClosingBrace)]
21+
public async Task Test_ElseClause()
22+
{
23+
await VerifyDiagnosticAndFixAsync(@"
24+
class C
25+
{
26+
void M()
27+
{
28+
bool x = false;
29+
30+
if (x)
31+
{
32+
}
33+
else
34+
{
35+
}[|
36+
|] M();
37+
}
38+
}
39+
", @"
40+
class C
41+
{
42+
void M()
43+
{
44+
bool x = false;
45+
46+
if (x)
47+
{
48+
}
49+
else
50+
{
51+
}
52+
53+
M();
54+
}
55+
}
56+
");
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)