Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 21 additions & 5 deletions Src/CSharpier.Core/CSharp/SyntaxPrinter/MembersWithForcedLines.cs
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,12 @@ member is MethodDeclarationSyntax methodDeclaration
var printExtraNewLines = false;
var triviaContainsEndIfOrRegion = false;

var leadingTrivia = member
.GetLeadingTrivia()
.Select(o => o.RawSyntaxKind())
.ToImmutableHashSet();
var leadingTrivia = new ValueListBuilder<SyntaxKind>(
[default, default, default, default, default, default, default, default]
);
AddUniqueKind(ref leadingTrivia, member);

foreach (var syntaxTrivia in leadingTrivia)
foreach (var syntaxTrivia in leadingTrivia.AsSpan())
{
if (syntaxTrivia is SyntaxKind.EndOfLineTrivia || syntaxTrivia.IsComment())
{
Expand Down Expand Up @@ -221,6 +221,8 @@ or SyntaxKind.EndRegionDirectiveTrivia
context.State.NextTriviaNeedsLine = true;
}

leadingTrivia.Dispose();

// this has a side effect (yuck) that fixes the trailing comma + trailing comment issue so we have to call it first
var separator = GetSeparatorIfNeeded();
result.Add(Doc.HardLine, Node.Print(member, context));
Expand All @@ -238,4 +240,18 @@ or SyntaxKind.EndRegionDirectiveTrivia

return result;
}

private static void AddUniqueKind(
ref ValueListBuilder<SyntaxKind> vlb,
MemberDeclarationSyntax member
)
{
foreach (var item in member.GetLeadingTrivia())
{
if (!vlb.Contains(item.Kind()))
{
vlb.Add(item.Kind());
}
}
}
}
14 changes: 14 additions & 0 deletions Src/CSharpier.Core/Utilities/ListExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using CSharpier.Core.DocTypes;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;

namespace CSharpier.Core.Utilities;

Expand Down Expand Up @@ -108,4 +109,17 @@ public static bool SequenceEqual(this SyntaxToken[] left, in SyntaxTokenList rig

return true;
}

public static bool Contains(this ref ValueListBuilder<SyntaxKind> kinds, SyntaxKind kind)
{
foreach (var element in kinds.AsSpan())
{
if (element == kind)
{
return true;
}
}

return false;
}
}