diff --git a/Src/CSharpier.Generators/NodePrinterGenerator.sbntxt b/Src/CSharpier.Generators/NodePrinterGenerator.sbntxt index ba74c5596..6bacf6b63 100644 --- a/Src/CSharpier.Generators/NodePrinterGenerator.sbntxt +++ b/Src/CSharpier.Generators/NodePrinterGenerator.sbntxt @@ -23,7 +23,7 @@ namespace CSharpier.SyntaxPrinter if (CSharpierIgnore.IsNodeIgnored(syntaxNode)) { - return CSharpierIgnore.PrintWithoutFormatting(syntaxNode); + return CSharpierIgnore.PrintWithoutFormatting(syntaxNode).Trim(); } context.PrintingDepth++; diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.cst b/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.cst index c968bea30..2844cb58a 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.cst +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.cst @@ -76,4 +76,44 @@ public class ClassName2 string keepNewLine; // csharpier-ignore-end } + + public void KeepLines1() + { + // csharpier-ignore-start + var unformattedWithLine1; + + var unformattedWithLine2; + // csharpier-ignore-end + } + + public void KeepLines2() + { + // csharpier-ignore-start + string unformattedWithLine1; + + string unformattedWithLine2; + // csharpier-ignore-end + + string anotherValue; + } +} + +public class KeepLines1 +{ + // csharpier-ignore-start + private string first; + + private string second; + // csharpier-ignore-end +} + +public class KeepLines2 +{ + // csharpier-ignore-start + private string first; + + private string second; + // csharpier-ignore-end + + private string third; } diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.expected.cst b/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.expected.cst index 30c75656b..4935b7266 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.expected.cst +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.expected.cst @@ -76,4 +76,44 @@ public class ClassName2 string keepNewLine; // csharpier-ignore-end } + + public void KeepLines1() + { + // csharpier-ignore-start + var unformattedWithLine1; + + var unformattedWithLine2; + // csharpier-ignore-end + } + + public void KeepLines2() + { + // csharpier-ignore-start + string unformattedWithLine1; + + string unformattedWithLine2; + // csharpier-ignore-end + + string anotherValue; + } +} + +public class KeepLines1 +{ + // csharpier-ignore-start + private string first; + + private string second; + // csharpier-ignore-end +} + +public class KeepLines2 +{ + // csharpier-ignore-start + private string first; + + private string second; + // csharpier-ignore-end + + private string third; } diff --git a/Src/CSharpier/SyntaxPrinter/CSharpierIgnore.cs b/Src/CSharpier/SyntaxPrinter/CSharpierIgnore.cs index b6962addf..601003506 100644 --- a/Src/CSharpier/SyntaxPrinter/CSharpierIgnore.cs +++ b/Src/CSharpier/SyntaxPrinter/CSharpierIgnore.cs @@ -1,23 +1,17 @@ namespace CSharpier.SyntaxPrinter; +using System.Text; + internal static class CSharpierIgnore { public static bool IsNodeIgnored(SyntaxNode syntaxNode) { - if ( - syntaxNode.Parent - is not ( - BaseTypeDeclarationSyntax - or BlockSyntax - or CompilationUnitSyntax - or NamespaceDeclarationSyntax - ) - ) - { - return false; - } - - return (Token.HasLeadingComment(syntaxNode, "// csharpier-ignore")); + return syntaxNode.Parent + is BaseTypeDeclarationSyntax + or BlockSyntax + or CompilationUnitSyntax + or NamespaceDeclarationSyntax + && Token.HasLeadingComment(syntaxNode, "// csharpier-ignore"); } public static List PrintNodesRespectingRangeIgnore( @@ -26,12 +20,15 @@ FormattingContext context ) where T : SyntaxNode { var statements = new List(); + var unFormattedCode = new StringBuilder(); var printUnformatted = false; foreach (var node in list) { if (Token.HasLeadingComment(node, "// csharpier-ignore-end")) { + statements.Add(unFormattedCode.ToString().Trim()); + unFormattedCode.Clear(); printUnformatted = false; } else if (Token.HasLeadingComment(node, "// csharpier-ignore-start")) @@ -39,16 +36,26 @@ FormattingContext context printUnformatted = true; } - statements.Add( - printUnformatted ? PrintWithoutFormatting(node) : Node.Print(node, context) - ); + if (printUnformatted) + { + unFormattedCode.Append(PrintWithoutFormatting(node)); + } + else + { + statements.Add(Node.Print(node, context)); + } + } + + if (unFormattedCode.Length > 0) + { + statements.Add(unFormattedCode.ToString().Trim()); } return statements; } - public static Doc PrintWithoutFormatting(SyntaxNode syntaxNode) + public static string PrintWithoutFormatting(SyntaxNode syntaxNode) { - return syntaxNode.GetText().ToString().Trim(); + return syntaxNode.GetText().ToString(); } } diff --git a/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs b/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs index 3db1ddec5..1cd1d10af 100644 --- a/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs +++ b/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs @@ -2,6 +2,8 @@ namespace CSharpier.SyntaxPrinter; +using System.Text; + internal static class MembersWithForcedLines { public static List Print( @@ -11,6 +13,7 @@ FormattingContext context ) where T : MemberDeclarationSyntax { var result = new List { Doc.HardLine }; + var unFormattedCode = new StringBuilder(); var printUnformatted = false; var lastMemberForcedBlankLine = false; for (var memberIndex = 0; memberIndex < members.Count; memberIndex++) @@ -21,6 +24,8 @@ FormattingContext context if (Token.HasLeadingComment(member, "// csharpier-ignore-end")) { skipAddingLineBecauseIgnoreEnded = true; + result.Add(unFormattedCode.ToString().Trim()); + unFormattedCode.Clear(); printUnformatted = false; } else if (Token.HasLeadingComment(member, "// csharpier-ignore-start")) @@ -35,7 +40,7 @@ FormattingContext context if (printUnformatted) { - result.Add(CSharpierIgnore.PrintWithoutFormatting(member)); + unFormattedCode.Append(CSharpierIgnore.PrintWithoutFormatting(member)); continue; } @@ -174,6 +179,11 @@ or SyntaxKind.EndRegionDirectiveTrivia lastMemberForcedBlankLine = blankLineIsForced; } + if (unFormattedCode.Length > 0) + { + result.Add(unFormattedCode.ToString().Trim()); + } + return result; } }