diff --git a/Src/CSharpier.Core/CSharp/SyntaxPrinter/MembersWithForcedLines.cs b/Src/CSharpier.Core/CSharp/SyntaxPrinter/MembersWithForcedLines.cs index 6055aa8f1..18b8d826e 100644 --- a/Src/CSharpier.Core/CSharp/SyntaxPrinter/MembersWithForcedLines.cs +++ b/Src/CSharpier.Core/CSharp/SyntaxPrinter/MembersWithForcedLines.cs @@ -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( + [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()) { @@ -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)); @@ -238,4 +240,18 @@ or SyntaxKind.EndRegionDirectiveTrivia return result; } + + private static void AddUniqueKind( + ref ValueListBuilder vlb, + MemberDeclarationSyntax member + ) + { + foreach (var item in member.GetLeadingTrivia()) + { + if (!vlb.Contains(item.Kind())) + { + vlb.Add(item.Kind()); + } + } + } } diff --git a/Src/CSharpier.Core/Utilities/ListExtensions.cs b/Src/CSharpier.Core/Utilities/ListExtensions.cs index 51ca7b1c3..4189622d6 100644 --- a/Src/CSharpier.Core/Utilities/ListExtensions.cs +++ b/Src/CSharpier.Core/Utilities/ListExtensions.cs @@ -1,5 +1,6 @@ using CSharpier.Core.DocTypes; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; namespace CSharpier.Core.Utilities; @@ -108,4 +109,17 @@ public static bool SequenceEqual(this SyntaxToken[] left, in SyntaxTokenList rig return true; } + + public static bool Contains(this ref ValueListBuilder kinds, SyntaxKind kind) + { + foreach (var element in kinds.AsSpan()) + { + if (element == kind) + { + return true; + } + } + + return false; + } }