Skip to content

Commit

Permalink
Adding support for a ranged csharpier-ignore (#687)
Browse files Browse the repository at this point in the history
* Initial POC for ranged ignore

closes #678

* Gettings ranged ignore working with members of types

* Adding more tests, fixing a minor issue

* formatting file

* Updating documents
  • Loading branch information
belav authored Jun 13, 2022
1 parent 0d3825f commit a62195e
Show file tree
Hide file tree
Showing 11 changed files with 306 additions and 18 deletions.
40 changes: 39 additions & 1 deletion Docs/Ignore.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class ClassName
// csharpier-ignore
public void MethodName( ) {
var unformatted = "";
}
}

public void MethodName()
{
Expand All @@ -52,3 +52,41 @@ public class ClassName
}

```

Use a ranged ignore to exclude multiple lines from formatting. A range is valid around statements and members.
```c#
// csharpier-ignore-start
public class Unformatted1 { }
public class Unformatted2 { }
// csharpier-ignore-end
public class ClassName
{
// csharpier-ignore-start
private string unformatted1;
private string unformatted2;
public void MethodName( ) {
var unformatted = "";
}
// csharpier-ignore-end
public void MethodName()
{
// csharpier-ignore-start
var unformatted1 = true;
var unformatted2 = true;
if (false) {
return;
}
// csharpier-ignore-end
if (true)
{
// csharpier-ignore-start
var unformatted3 = true;
var unformatted4 = true;
// csharpier-ignore-end
var formatted = true;
}
}
}
```
59 changes: 59 additions & 0 deletions Src/CSharpier.Tests/FormattingTests/TestFiles/CSharpierIgnore.cst
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,63 @@ public class ClassName
var unformatted = true;
}
}

void MethodName()
{
var formatMe = true;
// csharpier-ignore-start
var unformatted = true;
var unformatted = true;
// csharpier-ignore-end
var formatMe = true;
}

void MethodName()
{
var formatMe = true;
// csharpier-ignore-start
var unformatted = true;
var unformatted = true;
// csharpier-ignore-end
}

void MethodName()
{
var formatMe = true;
// csharpier-ignore-start
var unformatted = true;
var unformatted = true;
}
}

public class ClassName2
{
// csharpier-ignore-start
private string unformatted1;
// csharpier-ignore-end

private string formatMe;
// csharpier-ignore-start
private string noNewLine;
// csharpier-ignore-end

// csharpier-ignore-start
private string keepNewLine;
// csharpier-ignore-end

public void Method()
{
// csharpier-ignore-start
string unformatted1;
// csharpier-ignore-end

string formatMe;
// csharpier-ignore-start
string noNewLine;
// csharpier-ignore-end

// csharpier-ignore-start
string keepNewLine;
// csharpier-ignore-end
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// csharpier-ignore
public class Unformatted { }

public class ClassName
{
// csharpier-ignore
private string unformatted;

public void MethodName()
{
// csharpier-ignore
var unformatted = true;

if (true)
{
// csharpier-ignore
var unformatted = true;
}
}

void MethodName()
{
var formatMe = true;
// csharpier-ignore-start
var unformatted = true;
var unformatted = true;
// csharpier-ignore-end
var formatMe = true;
}

void MethodName()
{
var formatMe = true;
// csharpier-ignore-start
var unformatted = true;
var unformatted = true;
// csharpier-ignore-end
}

void MethodName()
{
var formatMe = true;
// csharpier-ignore-start
var unformatted = true;
var unformatted = true;
}
}

public class ClassName2
{
// csharpier-ignore-start
private string unformatted1;
// csharpier-ignore-end

private string formatMe;
// csharpier-ignore-start
private string noNewLine;
// csharpier-ignore-end

// csharpier-ignore-start
private string keepNewLine;
// csharpier-ignore-end

public void Method()
{
// csharpier-ignore-start
string unformatted1;
// csharpier-ignore-end

string formatMe;
// csharpier-ignore-start
string noNewLine;
// csharpier-ignore-end

// csharpier-ignore-start
string keepNewLine;
// csharpier-ignore-end
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Namespace
{
// csharpier-ignore-start
public class Unformatted { }
// csharpier-ignore-end

public class FormatMe { }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Namespace
{
// csharpier-ignore-start
public class Unformatted { }
// csharpier-ignore-end

public class FormatMe { }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;

// csharpier-ignore-start
string unformatted1;
// csharpier-ignore-end

string formatMe;
// csharpier-ignore-start
string noNewLine;
// csharpier-ignore-end

// csharpier-ignore-start
string keepNewLine;
// csharpier-ignore-end


// csharpier-ignore-start
string removeNewLine;
// csharpier-ignore-end
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;

// csharpier-ignore-start
string unformatted1;
// csharpier-ignore-end

string formatMe;
// csharpier-ignore-start
string noNewLine;
// csharpier-ignore-end

// csharpier-ignore-start
string keepNewLine;
// csharpier-ignore-end


// csharpier-ignore-start
string removeNewLine;
// csharpier-ignore-end
33 changes: 27 additions & 6 deletions Src/CSharpier/SyntaxPrinter/CSharpierIgnore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,34 @@ or NamespaceDeclarationSyntax
return false;
}

return syntaxNode
.GetLeadingTrivia()
.Any(
o =>
o.RawSyntaxKind() is SyntaxKind.SingleLineCommentTrivia
&& o.ToString().Equals("// csharpier-ignore")
return (Token.HasLeadingComment(syntaxNode, "// csharpier-ignore"));
}

public static List<Doc> PrintNodesRespectingRangeIgnore<T>(
SyntaxList<T> list,
FormattingContext context
) where T : SyntaxNode
{
var statements = new List<Doc>();
var printUnformatted = false;

foreach (var node in list)
{
if (Token.HasLeadingComment(node, "// csharpier-ignore-end"))
{
printUnformatted = false;
}
else if (Token.HasLeadingComment(node, "// csharpier-ignore-start"))
{
printUnformatted = true;
}

statements.Add(
printUnformatted ? PrintWithoutFormatting(node) : Node.Print(node, context)
);
}

return statements;
}

public static Doc PrintWithoutFormatting(SyntaxNode syntaxNode)
Expand Down
41 changes: 33 additions & 8 deletions Src/CSharpier/SyntaxPrinter/MembersWithForcedLines.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,41 @@ FormattingContext context
) where T : MemberDeclarationSyntax
{
var result = new List<Doc> { Doc.HardLine };
var printUnformatted = false;
var lastMemberForcedBlankLine = false;
for (var x = 0; x < members.Count; x++)
for (var memberIndex = 0; memberIndex < members.Count; memberIndex++)
{
void AddSeparatorIfNeeded()
var skipAddingLineBecauseIgnoreEnded = false;
var member = members[memberIndex];

if (Token.HasLeadingComment(member, "// csharpier-ignore-end"))
{
skipAddingLineBecauseIgnoreEnded = true;
printUnformatted = false;
}
else if (Token.HasLeadingComment(member, "// csharpier-ignore-start"))
{
if (members is SeparatedSyntaxList<T> list && x < list.SeparatorCount)
if (!printUnformatted && memberIndex > 0)
{
result.Add(Token.Print(list.GetSeparator(x), context));
result.Add(Doc.HardLine);
result.Add(ExtraNewLines.Print(member));
}
printUnformatted = true;
}

if (printUnformatted)
{
result.Add(CSharpierIgnore.PrintWithoutFormatting(member));
continue;
}

var member = members[x];
void AddSeparatorIfNeeded()
{
if (members is SeparatedSyntaxList<T> list && memberIndex < list.SeparatorCount)
{
result.Add(Token.Print(list.GetSeparator(memberIndex), context));
}
}

var blankLineIsForced = (
member is MethodDeclarationSyntax && node is not InterfaceDeclarationSyntax
Expand Down Expand Up @@ -54,15 +77,15 @@ member is MethodDeclarationSyntax methodDeclaration
blankLineIsForced = false;
}

if (x == 0)
if (memberIndex == 0)
{
lastMemberForcedBlankLine = blankLineIsForced;
result.Add(Node.Print(member, context));
AddSeparatorIfNeeded();
continue;
}

var addBlankLine = blankLineIsForced || lastMemberForcedBlankLine;
var addBlankLine = (blankLineIsForced || lastMemberForcedBlankLine);

var triviaContainsCommentOrNewLine = false;
var printExtraNewLines = false;
Expand Down Expand Up @@ -108,7 +131,9 @@ or SyntaxKind.EndRegionDirectiveTrivia
{
result.Add(ExtraNewLines.Print(member));
}
else if (addBlankLine && !triviaContainsEndIfOrRegion)
else if (
addBlankLine && !triviaContainsEndIfOrRegion && !skipAddingLineBecauseIgnoreEnded
)
{
result.Add(Doc.HardLine);
}
Expand Down
8 changes: 5 additions & 3 deletions Src/CSharpier/SyntaxPrinter/SyntaxNodePrinters/Block.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,13 @@ public static Doc Print(BlockSyntax node, FormattingContext context)

if (node.Statements.Count > 0)
{
innerDoc = Doc.Indent(
statementSeparator,
Doc.Join(statementSeparator, node.Statements.Select(o => Node.Print(o, context)))
var statements = CSharpierIgnore.PrintNodesRespectingRangeIgnore(
node.Statements,
context
);

innerDoc = Doc.Indent(statementSeparator, Doc.Join(statementSeparator, statements));

DocUtilities.RemoveInitialDoubleHardLine(innerDoc);
}

Expand Down
Loading

0 comments on commit a62195e

Please sign in to comment.