Skip to content

Commit 640afdd

Browse files
committed
Remove new line between methods in interfaces.
1 parent e5dbe7a commit 640afdd

2 files changed

Lines changed: 82 additions & 4 deletions

File tree

Bitbound.Analyzers.MemberOrder/Bitbound.Analyzers.MemberOrder.CodeFixes/MemberOrderCodeFixProvider.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ private async Task<Solution> SortMembersAsync(Document document, TypeDeclaration
5757
.ThenBy(m => MemberOrderAnalyzer.GetIdentifier(m).ValueText, StringComparer.Ordinal)
5858
.ToList();
5959

60-
CopyWhiteSpace(ref members, sortedMembers);
60+
CopyWhiteSpace(ref members, sortedMembers, typeDecl);
6161

6262
var newTypeDecl = typeDecl.WithMembers(SyntaxFactory.List(sortedMembers));
6363

@@ -70,10 +70,12 @@ private async Task<Solution> SortMembersAsync(Document document, TypeDeclaration
7070
return document.WithSyntaxRoot(newRoot).Project.Solution;
7171
}
7272

73-
private static void CopyWhiteSpace(ref SyntaxList<MemberDeclarationSyntax> members, List<MemberDeclarationSyntax> sortedMembers)
73+
private static void CopyWhiteSpace(ref SyntaxList<MemberDeclarationSyntax> members, List<MemberDeclarationSyntax> sortedMembers, TypeDeclarationSyntax typeDecl)
7474
{
7575
if (members.Count == 0) return;
7676

77+
bool isInterface = typeDecl is InterfaceDeclarationSyntax;
78+
7779
// First pass: normalize trailing trivia to remove excessive newlines
7880
for (int i = 0; i < sortedMembers.Count; i++)
7981
{
@@ -125,10 +127,10 @@ private static void CopyWhiteSpace(ref SyntaxList<MemberDeclarationSyntax> membe
125127
prevOrder.Accessibility != currentOrder.Accessibility ||
126128
prevOrder.StaticInstance != currentOrder.StaticInstance;
127129

128-
// Methods should always have spacing between them, even in the same group
130+
// Methods should always have spacing between them in classes, but not in interfaces
129131
bool isMethod = currMember.Kind() == SyntaxKind.MethodDeclaration;
130132
bool prevIsMethod = prevMember.Kind() == SyntaxKind.MethodDeclaration;
131-
bool bothMethods = isMethod && prevIsMethod;
133+
bool bothMethods = isMethod && prevIsMethod && !isInterface;
132134

133135
var prevTrailing = prevMember.GetTrailingTrivia();
134136
bool prevHasNewline = prevTrailing.Any(t => t.IsKind(SyntaxKind.EndOfLineTrivia));

Bitbound.Analyzers.MemberOrder/Bitbound.Analyzers.MemberOrder.Test/MemberOrderSpacingTests.cs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,80 @@ public interface IProcess
181181
var expectedDiagnostic = VerifyCS.Diagnostic("BB0001").WithLocation(0).WithArguments("Responding");
182182
await VerifyCS.VerifyCodeFixAsync(test, expectedDiagnostic, expectedSource);
183183
}
184+
185+
[TestMethod]
186+
public async Task Fix_InterfaceMethods_NoBlankLinesBetweenMethods()
187+
{
188+
var test = """
189+
namespace MyCode
190+
{
191+
public interface IMyInterface
192+
{
193+
int MyProperty { get; set; }
194+
195+
void MethodC();
196+
197+
void {|#0:MethodA|}();
198+
199+
void MethodB();
200+
}
201+
}
202+
""";
203+
204+
var expectedSource = """
205+
namespace MyCode
206+
{
207+
public interface IMyInterface
208+
{
209+
int MyProperty { get; set; }
210+
211+
void MethodA();
212+
void MethodB();
213+
void MethodC();
214+
}
215+
}
216+
""";
217+
218+
var expectedDiagnostic = VerifyCS.Diagnostic("BB0001").WithLocation(0).WithArguments("MethodA");
219+
await VerifyCS.VerifyCodeFixAsync(test, expectedDiagnostic, expectedSource);
220+
}
221+
222+
[TestMethod]
223+
public async Task Fix_ClassMethods_BlankLinesBetweenMethods()
224+
{
225+
var test = """
226+
namespace MyCode
227+
{
228+
public class MyClass
229+
{
230+
public int MyProperty { get; set; }
231+
232+
public void MethodC() { }
233+
234+
public void {|#0:MethodA|}() { }
235+
236+
public void MethodB() { }
237+
}
238+
}
239+
""";
240+
241+
var expectedSource = """
242+
namespace MyCode
243+
{
244+
public class MyClass
245+
{
246+
public int MyProperty { get; set; }
247+
248+
public void MethodA() { }
249+
250+
public void MethodB() { }
251+
252+
public void MethodC() { }
253+
}
254+
}
255+
""";
256+
257+
var expectedDiagnostic = VerifyCS.Diagnostic("BB0001").WithLocation(0).WithArguments("MethodA");
258+
await VerifyCS.VerifyCodeFixAsync(test, expectedDiagnostic, expectedSource);
259+
}
184260
}

0 commit comments

Comments
 (0)