diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.expected.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.expected.test index d4ad2ebe2..d09d9e2f8 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.expected.test +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.expected.test @@ -64,6 +64,53 @@ public class ClassName var unformatted = true; var unformatted = true; } + + void ObjectInitialize() + { + return new SomeClass + { + // csharpier-ignore-start + SomeProperty = someValue + // csharpier-ignore-end + }; + + return new SomeClass + { + SomeProperty1 = 1, + + // csharpier-ignore-start + SomeProperty2 = 2, + // csharpier-ignore-end + SomeProperty3 = 3, + }; + + return new Lines + { + // csharpier-ignore-start + SomeProperty = someValue, + SomeProperty2 = someValue + // csharpier-ignore-end + }; + + return new Lines + { + // csharpier-ignore-start + SomeProperty = someValue, + + SomeProperty2 = someValue + // csharpier-ignore-end + }; + + return new Lines + { + // csharpier-ignore-start + SomeProperty = someValue, + + + SomeProperty2 = someValue + // csharpier-ignore-end + }; + } } public class ClassName2 diff --git a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.test b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.test index 3986d6244..cc3f8d3c7 100644 --- a/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.test +++ b/Src/CSharpier.Tests/FormattingTests/TestFiles/cs/CSharpierIgnore.test @@ -65,6 +65,52 @@ public class ClassName var unformatted = true; var unformatted = true; } + + void ObjectInitialize() + { + return new SomeClass + { + // csharpier-ignore-start + SomeProperty = someValue + // csharpier-ignore-end + }; + + return new SomeClass + { + SomeProperty1 = 1, + // csharpier-ignore-start + SomeProperty2 = 2, + // csharpier-ignore-end + SomeProperty3 = 3, + }; + + return new Lines + { + // csharpier-ignore-start + SomeProperty = someValue, + SomeProperty2 = someValue + // csharpier-ignore-end + }; + + return new Lines + { + // csharpier-ignore-start + SomeProperty = someValue, + + SomeProperty2 = someValue + // csharpier-ignore-end + }; + + return new Lines + { + // csharpier-ignore-start + SomeProperty = someValue, + + + SomeProperty2 = someValue + // csharpier-ignore-end + }; + } } public class ClassName2 diff --git a/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs b/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs index 3af051069..6e858fb89 100644 --- a/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs +++ b/Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs @@ -19,7 +19,7 @@ public static List Print( { result.Add(Doc.HardLine); } - ; + var unFormattedCode = new StringBuilder(); var printUnformatted = false; var lastMemberForcedBlankLine = false; diff --git a/Src/CSharpier/SyntaxPrinter/SeparatedSyntaxList.cs b/Src/CSharpier/SyntaxPrinter/SeparatedSyntaxList.cs index 29a936bf7..45e730f55 100644 --- a/Src/CSharpier/SyntaxPrinter/SeparatedSyntaxList.cs +++ b/Src/CSharpier/SyntaxPrinter/SeparatedSyntaxList.cs @@ -1,5 +1,7 @@ namespace CSharpier.SyntaxPrinter; +using System.Text; + internal static class SeparatedSyntaxList { public static Doc Print( @@ -40,8 +42,38 @@ private static Doc Print( where T : SyntaxNode { var docs = new List(); + var unFormattedCode = new StringBuilder(); + var printUnformatted = false; for (var x = startingIndex; x < list.Count; x++) { + var member = list[x]; + + if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreEndRegex)) + { + docs.Add(unFormattedCode.ToString().Trim()); + unFormattedCode.Clear(); + printUnformatted = false; + } + else if (Token.HasLeadingCommentMatching(member, CSharpierIgnore.IgnoreStartRegex)) + { + if (!printUnformatted && x > 0) + { + docs.Add(Doc.HardLine); + } + printUnformatted = true; + } + + if (printUnformatted) + { + unFormattedCode.Append(CSharpierIgnore.PrintWithoutFormatting(member, context)); + if (x < list.SeparatorCount) + { + unFormattedCode.AppendLine(list.GetSeparator(x).Text); + } + + continue; + } + docs.Add(printFunc(list[x], context)); // if the syntax tree doesn't have a trailing comma but we want want, then add it @@ -86,6 +118,11 @@ private static Doc Print( } } + if (unFormattedCode.Length > 0) + { + docs.Add(unFormattedCode.ToString().Trim()); + } + return docs.Count == 0 ? Doc.Null : Doc.Concat(docs); } } diff --git a/docs/Ignore.md b/docs/Ignore.md index 19458ec11..34646edbf 100644 --- a/docs/Ignore.md +++ b/docs/Ignore.md @@ -70,7 +70,7 @@ public class ClassName ``` -Use a ranged ignore to exclude multiple lines from formatting. A range is valid around statements and members. +Use a ranged ignore to exclude multiple lines from formatting. A range is not valid in all contexts. Currently it works with statements, members and object initializer expressions. ```csharp // csharpier-ignore-start public class Unformatted1 { } @@ -104,6 +104,12 @@ public class ClassName var formatted = true; } + + return new SomeClass + { + // csharpier-ignore-start + SomeProperty = true + // csharpier-ignore-end } } ```