diff --git a/Src/CSharpier.Core/CSharp/SyntaxPrinter/UsingDirectives.cs b/Src/CSharpier.Core/CSharp/SyntaxPrinter/UsingDirectives.cs index c4ae5a7fb..8cc5a57d8 100644 --- a/Src/CSharpier.Core/CSharp/SyntaxPrinter/UsingDirectives.cs +++ b/Src/CSharpier.Core/CSharp/SyntaxPrinter/UsingDirectives.cs @@ -68,6 +68,11 @@ or SyntaxKind.UndefDirectiveTrivia } } + if (Token.HasLeadingCommentMatching(usings[0], CSharpierIgnore.IgnoreStartRegex)) + { + initialComments.Clear(); + } + docs.Add(Token.PrintLeadingTrivia([.. initialComments], context)); if (keepUsingsUntilEndIf) { @@ -94,6 +99,7 @@ or SyntaxKind.UndefDirectiveTrivia } var isFirst = true; + var prevShouldFormat = true; var index = 0; var reorderedDirectives = false; foreach (var groupOfUsingData in GroupUsings(usingList, [.. triviaWithinIf], context)) @@ -102,10 +108,15 @@ or SyntaxKind.UndefDirectiveTrivia { if (!isFirst) { - docs.Add(Doc.HardLine); + if (usingData.ShouldFormat || prevShouldFormat) + { + docs.Add(Doc.HardLine); + } } - if (usingData.LeadingTrivia != Doc.Null) + prevShouldFormat = usingData.ShouldFormat; + + if (usingData.LeadingTrivia != Doc.Null && usingData.ShouldFormat) { docs.Add(usingData.LeadingTrivia); } @@ -117,7 +128,11 @@ or SyntaxKind.UndefDirectiveTrivia } index++; - docs.Add(UsingDirective.Print(usingData.Using, context, printExtraLines)); + docs.Add( + usingData.ShouldFormat + ? UsingDirective.Print(usingData.Using, context, printExtraLines) + : CSharpierIgnore.PrintWithoutFormatting(usingData.Using, context) + ); } isFirst = false; @@ -159,10 +174,23 @@ PrintingContext context var directiveGroup = new List(); var ifCount = 0; var isFirst = true; + var shouldFormat = true; foreach (var usingDirective in usings) { - var openIf = ifCount > 0; + var openIfOrIgnore = ifCount > 0; + if (Token.HasLeadingCommentMatching(usingDirective, CSharpierIgnore.IgnoreEndRegex)) + { + openIfOrIgnore = true; + shouldFormat = true; + } + else if ( + Token.HasLeadingCommentMatching(usingDirective, CSharpierIgnore.IgnoreStartRegex) + ) + { + shouldFormat = false; + } + foreach (var directive in usingDirective.GetLeadingTrivia().Where(o => o.IsDirective)) { if (directive.RawSyntaxKind() is SyntaxKind.IfDirectiveTrivia) @@ -182,25 +210,35 @@ PrintingContext context { Using = usingDirective, LeadingTrivia = PrintLeadingTrivia(usingDirective), + ShouldFormat = shouldFormat, } ); } else { - if (openIf) + if (openIfOrIgnore) { directiveGroup.Add( - new UsingData { LeadingTrivia = PrintLeadingTrivia(usingDirective) } + new UsingData + { + LeadingTrivia = PrintLeadingTrivia(usingDirective), + ShouldFormat = shouldFormat, + } ); } var usingData = new UsingData { Using = usingDirective, - LeadingTrivia = !openIf ? PrintLeadingTrivia(usingDirective) : Doc.Null, + LeadingTrivia = !openIfOrIgnore ? PrintLeadingTrivia(usingDirective) : Doc.Null, + ShouldFormat = shouldFormat, }; - if (usingDirective.GlobalKeyword.RawSyntaxKind() != SyntaxKind.None) + if (!shouldFormat) + { + directiveGroup.Add(usingData); + } + else if (usingDirective.GlobalKeyword.RawSyntaxKind() != SyntaxKind.None) { if (usingDirective.Alias is not null) { @@ -274,6 +312,7 @@ private class UsingData { public Doc LeadingTrivia { get; init; } = Doc.Null; public UsingDirectiveSyntax? Using { get; init; } + public required bool ShouldFormat { get; init; } = true; } private static bool IsSystemName(NameSyntax value) diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore1.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore1.expected.test new file mode 100644 index 000000000..369417989 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore1.expected.test @@ -0,0 +1,7 @@ +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore1.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore1.test new file mode 100644 index 000000000..369417989 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore1.test @@ -0,0 +1,7 @@ +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore2.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore2.expected.test new file mode 100644 index 000000000..678eec20e --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore2.expected.test @@ -0,0 +1,10 @@ +using C; +using D; + +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore2.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore2.test new file mode 100644 index 000000000..2cfae7713 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore2.test @@ -0,0 +1,10 @@ +using D; +using C; + +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore3.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore3.expected.test new file mode 100644 index 000000000..8de9091bc --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore3.expected.test @@ -0,0 +1,9 @@ +using C; +using D; +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore3.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore3.test new file mode 100644 index 000000000..b7a912276 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore3.test @@ -0,0 +1,9 @@ +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end +using D; +using C; diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore4.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore4.expected.test new file mode 100644 index 000000000..811748f1f --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore4.expected.test @@ -0,0 +1,21 @@ +using C; +using D; +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end + + + + + +// csharpier-ignore-start + +using F; + +using E; + +// csharpier-ignore-end diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore4.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore4.test new file mode 100644 index 000000000..764cb2ad3 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore4.test @@ -0,0 +1,21 @@ +// csharpier-ignore-start + +using B; + +using A; + +// csharpier-ignore-end +using D; +using C; + + + + +// csharpier-ignore-start + +using F; + +using E; + +// csharpier-ignore-end + diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore5.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore5.expected.test new file mode 100644 index 000000000..f1c4f3aaf --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore5.expected.test @@ -0,0 +1,18 @@ +using C; +using D; +// csharpier-ignore-start +#if BUILD_MSI_TASKS + + +using System; +using Microsoft. +Build.Framework; + + +#endif + +// csharpier-ignore-end + +namespace RepoTasks; + +class ClassName { } diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore5.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore5.test new file mode 100644 index 000000000..a532dc8d4 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore5.test @@ -0,0 +1,17 @@ +using C; +// csharpier-ignore-start +#if BUILD_MSI_TASKS + + +using System; +using Microsoft. +Build.Framework; + + +#endif + +// csharpier-ignore-end +using D; +namespace RepoTasks; + +class ClassName { } diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore6.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore6.expected.test new file mode 100644 index 000000000..c3560dcec --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore6.expected.test @@ -0,0 +1,21 @@ +using C; +using D; +// csharpier-ignore-start +#if BUILD_MSI_TASKS + + +using System; +using Microsoft. +Build.Framework; + +// csharpier-ignore-end + +using B; +using A; +#endif + + + +namespace RepoTasks; + +class ClassName { } diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore6.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore6.test new file mode 100644 index 000000000..83fb51526 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore6.test @@ -0,0 +1,20 @@ +using C; +// csharpier-ignore-start +#if BUILD_MSI_TASKS + + +using System; +using Microsoft. +Build.Framework; + +// csharpier-ignore-end + + +using B; +using A; +#endif + +using D; +namespace RepoTasks; + +class ClassName { } diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore7.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore7.expected.test new file mode 100644 index 000000000..72178c950 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore7.expected.test @@ -0,0 +1,20 @@ +using C; +using D; +#if BUILD_MSI_TASKS + +using System; +using Microsoft.Build.Framework; +// csharpier-ignore-start + + +using B; +using A; + +// csharpier-ignore-end +#endif + + + +namespace RepoTasks; + +class ClassName { } diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore7.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore7.test new file mode 100644 index 000000000..f738a2ef0 --- /dev/null +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/UsingDirectives_CSharpierIgnore7.test @@ -0,0 +1,19 @@ +using C; +#if BUILD_MSI_TASKS + + +using System; +using Microsoft. +Build.Framework; +// csharpier-ignore-start + + +using B; +using A; +// csharpier-ignore-end +#endif + +using D; +namespace RepoTasks; + +class ClassName { }