Skip to content

Commit

Permalink
Better formatting of multiline comments when indentation is changing (#…
Browse files Browse the repository at this point in the history
…582)

* Handle multiline comments better

closes #580

* Adding a test case. Starting to handle the extra indent in /* style comments.

* Getting test passing

* Fixing validation logic

* Update DocPrinter.cs

* Update Token.cs

* Handling another edge case

* Cleaning up some code

* Code review change
  • Loading branch information
belav committed Feb 5, 2022
1 parent 1518657 commit 648f7db
Show file tree
Hide file tree
Showing 9 changed files with 159 additions and 14 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,5 @@ publish
/.husky/pre-commit

debug.txt

Src/CSharpier.VSCode/.idea/prettier.xml
2 changes: 1 addition & 1 deletion Scripts/CreateTestingPR.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
param (
[string]$pathToTestingRepo,
[switch] $fast = $false
[switch]$fast = $false
)

if (!$pathToTestingRepo) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
public class ClassName
{
/// multiline
/// second line
private string field;

public void Method()
{
/* multiline
* multiline
*/
var variable = true;
}
/// <summary> no tabs here
/// Tabs here
/// </summary>
public class ClassName { }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
public class ClassName
{
/// multiline
/// second line
private string field;

public void Method()
{
/* multiline
* multiline
*/
var variable = true;
}

/// <summary> no tabs here
/// Tabs here
/// </summary>
public class ClassName { }
}
32 changes: 32 additions & 0 deletions Src/CSharpier.Tests/SyntaxNodeComparerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,38 @@ public void Mismatched_Disabled_Text_Should_Not_Print_Error()
#endif
}
";
var result = AreEqual(left, right);
result.Should().BeEmpty();
}

[Test]
public void Comments_Should_Ignore_Indent_Width()
{
var left =
@"class ClassName
{
/// multiline
/// multiline
private string field;
/* multiline
* multiline
*/
private string field;
}";

var right =
@"class ClassName
{
/// multiline
/// multiline
private string field;
/* multiline
* multiline
*/
private string field;
}";

var result = AreEqual(left, right);
result.Should().BeEmpty();
Expand Down
44 changes: 43 additions & 1 deletion Src/CSharpier/DocPrinter/DocPrinter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ private void ProcessNextCommand()
this.Output.Append(this.EndOfLine);
}

this.Output.Append(indent.Value).Append(leadingComment.Comment);
this.AppendComment(leadingComment, indent);

this.CurrentWidth = indent.Length;
this.NewLineNextStringValue = false;
this.SkipNextNewLine = false;
Expand All @@ -155,6 +156,47 @@ private void ProcessNextCommand()
}
}

private void AppendComment(LeadingComment leadingComment, Indent indent)
{
var stringReader = new StringReader(leadingComment.Comment);
var line = stringReader.ReadLine();
var firstLine = line;
string? extraIndent = null;
while (line != null)
{
this.Output.Append(indent.Value);
if (extraIndent?.Length > 0)
{
this.Output.Append(extraIndent);
}
this.Output.Append(line.Trim());
line = stringReader.ReadLine();
if (line == null)
{
return;
}

this.Output.Append(this.EndOfLine);
if (extraIndent != null)
{
continue;
}

// comparing the amount of whitespace ensures formatting like this is possible
// /*
// * keeps the * in line
// */
var firstLineIndentLength =
firstLine!.Replace("\t", " ").Length - firstLine.TrimStart().Length;
var secondLineIndentLength =
line.Replace("\t", " ").Length - line.TrimStart().Length;
extraIndent = new string(
' ',
Math.Max(secondLineIndentLength - firstLineIndentLength, 0)
);
}
}

private void ProcessString(StringDoc stringDoc, Indent indent)
{
if (string.IsNullOrEmpty(stringDoc.Value))
Expand Down
4 changes: 2 additions & 2 deletions Src/CSharpier/DocTypes/LeadingComment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ namespace CSharpier.DocTypes;

internal class LeadingComment : Doc
{
public CommentType Type { get; set; }
public string Comment { get; set; } = string.Empty;
public CommentType Type { get; init; }
public string Comment { get; init; } = string.Empty;
}
20 changes: 20 additions & 0 deletions Src/CSharpier/SyntaxNodeComparer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,26 @@ private CompareResult Compare(SyntaxTrivia originalTrivia, SyntaxTrivia formatte
: NotEqual(originalTrivia.Span, formattedTrivia.Span);
}

if (originalTrivia.IsComment())
{
var originalStringReader = new StringReader(originalTrivia.ToString());
var formattedStringReader = new StringReader(formattedTrivia.ToString());
var originalLine = originalStringReader.ReadLine();
var formattedLine = formattedStringReader.ReadLine();
while (originalLine != null)
{
if (formattedLine == null || originalLine.Trim() != formattedLine.Trim())
{
return NotEqual(originalTrivia.Span, formattedTrivia.Span);
}

originalLine = originalStringReader.ReadLine();
formattedLine = formattedStringReader.ReadLine();
}

return Equal;
}

return originalTrivia.ToString().TrimEnd() == formattedTrivia.ToString().TrimEnd()
? Equal
: NotEqual(originalTrivia.Span, formattedTrivia.Span);
Expand Down
32 changes: 22 additions & 10 deletions Src/CSharpier/SyntaxPrinter/Token.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,26 +135,38 @@ private static Doc PrivatePrintLeadingTrivia(
{
printNewLines = true;
}
if (IsSingleLineComment(kind))

void AddLeadingComment(CommentType commentType)
{
// when printing comments, we need leading whitespace to ensure something like the following formats correctly
// /*
// * keep the * in line
// */
var previousTrivia = x > 0 ? leadingTrivia[x - 1] : (SyntaxTrivia?)null;
docs.Add(
Doc.LeadingComment(
trivia.ToFullString().TrimEnd('\n', '\r'),
CommentType.SingleLine
),
(
previousTrivia?.Kind() is SyntaxKind.WhitespaceTrivia
? previousTrivia
: null
) + trivia.ToFullString().TrimEnd('\n', '\r'),
commentType
)
);
}

if (IsSingleLineComment(kind))
{
AddLeadingComment(CommentType.SingleLine);
docs.Add(
kind == SyntaxKind.SingleLineDocumentationCommentTrivia
? Doc.HardLineSkipBreakIfFirstInGroup
: Doc.Null
);
}
else if (IsMultiLineComment(kind))
{
docs.Add(
Doc.LeadingComment(
trivia.ToFullString().TrimEnd('\n', '\r'),
CommentType.MultiLine
)
);
AddLeadingComment(CommentType.MultiLine);
}
else if (kind == SyntaxKind.DisabledTextTrivia)
{
Expand Down

0 comments on commit 648f7db

Please sign in to comment.