diff --git a/Src/CSharpier.Core/CSharp/SyntaxPrinter/Modifiers.cs b/Src/CSharpier.Core/CSharp/SyntaxPrinter/Modifiers.cs index 14688165a..40ffc5d52 100644 --- a/Src/CSharpier.Core/CSharp/SyntaxPrinter/Modifiers.cs +++ b/Src/CSharpier.Core/CSharp/SyntaxPrinter/Modifiers.cs @@ -101,9 +101,11 @@ Func, Doc> print // reordering modifiers inside of #ifs can lead to code that doesn't compile var willReorderModifiers = modifiers.Count > 1 - && !modifiers.Any(o => o.LeadingTrivia.Any(p => p.IsDirective || p.IsComment())); + && !modifiers.Skip(1).Any(o => o.LeadingTrivia.Any(p => p.IsDirective || p.IsComment())) + && !modifiers[0].LeadingTrivia.Any(p => p.IsDirective); var sortedModifiers = modifiers.ToArray(); + var leadingToken = sortedModifiers.FirstOrDefault(); if (willReorderModifiers) { Array.Sort(sortedModifiers, Comparer); @@ -112,6 +114,15 @@ Func, Doc> print if (willReorderModifiers && !sortedModifiers.SequenceEqual(modifiers)) { context.State.ReorderedModifiers = true; + + var leadingTrivia = leadingToken.LeadingTrivia; + var leadingTokenIndex = Array.FindIndex( + sortedModifiers, + token => token == leadingToken + ); + sortedModifiers[leadingTokenIndex] = sortedModifiers[leadingTokenIndex] + .WithLeadingTrivia(new SyntaxTriviaList()); + sortedModifiers[0] = sortedModifiers[0].WithLeadingTrivia(leadingTrivia); } return print(sortedModifiers); diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.expected.test new file mode 100644 index 000000000..ca7eebd7a --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.expected.test @@ -0,0 +1,31 @@ +public class DontReorderThis +{ +#if !SILVERLIGHT + [Attribute] +#endif + internal +#if !SILVERLIGHT + unsafe +#endif + static String Method() { } + +#if MONO + public void NewSymbolSet() { } +#endif + +#if !SILVERLIGHT + [Attribute] +#endif + private +#if !SILVERLIGHT + static +#endif + string Field; + + // leading comment should reorder modifiers + public static void Method() { } + + static + // midway comment should not reorder modifiers + public void Method1() { } +} diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.test index 3605ab53c..01031ec6e 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.test +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/Modifiers_Sort_Preprocessors.test @@ -22,6 +22,10 @@ public class DontReorderThis #endif string Field; - // comment should not reorder modifiers + // leading comment should reorder modifiers static public void Method() { } + + static + // midway comment should not reorder modifiers + public void Method1() { } }