Skip to content

Commit

Permalink
Simplify Indent because we don't support dedent and it was a hot path.
Browse files Browse the repository at this point in the history
Add test for tabs
  • Loading branch information
belav committed Jun 7, 2021
1 parent ce92dfa commit 8415a5f
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 117 deletions.
35 changes: 13 additions & 22 deletions Src/CSharpier.Benchmarks/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,19 @@ namespace CSharpier.Benchmarks
[MemoryDiagnoser]
public class Benchmarks
{
// [Benchmark]
// public void Default()
// {
// var codeFormatter = new CodeFormatter();
// codeFormatter.Format(code, new PrinterOptions());
// }

// [Benchmark]
// public void Default_SyntaxNodeComparer()
// {
// var syntaxNodeComparer = new SyntaxNodeComparer(code, code, CancellationToken.None);
// SyntaxNodeComparer.BeBetter = false;
// syntaxNodeComparer.CompareSource();
// }
//
// [Benchmark]
// public void Better_SyntaxNodeComparer()
// {
// var syntaxNodeComparer = new SyntaxNodeComparer(code, code, CancellationToken.None);
// SyntaxNodeComparer.BeBetter = true;
// syntaxNodeComparer.CompareSource();
// }
[Benchmark]
public void Default_CodeFormatter()
{
var codeFormatter = new CodeFormatter();
codeFormatter.Format(code, new PrinterOptions());
}

[Benchmark]
public void Default_SyntaxNodeComparer()
{
var syntaxNodeComparer = new SyntaxNodeComparer(code, code, CancellationToken.None);
syntaxNodeComparer.CompareSource();
}

private string code =
@"using System;
Expand Down
4 changes: 2 additions & 2 deletions Src/CSharpier.Tests/TestFiles/BaseTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void Setup()
}
}

protected void RunTest(string folderName, string fileName)
protected void RunTest(string folderName, string fileName, bool useTabs = false)
{
var filePath = Path.Combine(
this.rootDirectory.FullName,
Expand All @@ -37,7 +37,7 @@ protected void RunTest(string folderName, string fileName)
var formatter = new CodeFormatter();
var result = formatter.Format(
fileReaderResult.FileContents,
new PrinterOptions() { Width = PrinterOptions.WidthUsedByTests }
new PrinterOptions() { Width = PrinterOptions.WidthUsedByTests, UseTabs = useTabs }
);

var actualFilePath = filePath.Replace(".cst", ".actual.cst");
Expand Down
13 changes: 13 additions & 0 deletions Src/CSharpier.Tests/TestFiles/Tabs/Tabs.cst
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
public class ClassName
{
public dynamic ShortValue = new { Property = true };

public dynamic LongValue = new
{
One = "One",
Two = "Two",
ThreeThreeThree = "ThreeThreeThree"
};

public dynamic Value = new { NoName };
}
14 changes: 14 additions & 0 deletions Src/CSharpier.Tests/TestFiles/Tabs/_TabsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using CSharpier.Tests.TestFileTests;
using NUnit.Framework;

namespace CSharpier.Tests.TestFiles
{
public class TabsTests : BaseTest
{
[Test]
public void Tabs()
{
this.RunTest("Tabs", "Tabs", useTabs: true);
}
}
}
104 changes: 11 additions & 93 deletions Src/CSharpier/DocPrinter/Indent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,115 +4,33 @@

namespace CSharpier.DocPrinter
{
public record IndentType(string Type, int Number);

public record Indent(string Value, int Length, List<IndentType> Queue);
public record Indent(string Value, int Length);

public static class IndentBuilder
{
public static Indent MakeRoot()
{
return new Indent(string.Empty, 0, new List<IndentType>());
return new Indent(string.Empty, 0);
}

public static Indent Make(Indent indent, PrinterOptions printerOptions)
{
return GenerateIndent(indent, newPart: new IndentType("indent", 0), printerOptions);
return GenerateIndent(indent, printerOptions);
}

private static Indent GenerateIndent(
Indent indent,
IndentType newPart,
PrinterOptions printerOptions
) {
var queue = new List<IndentType>(indent.Queue);
if (newPart.Type == "dedent")
private static Indent GenerateIndent(Indent indent, PrinterOptions printerOptions)
{
if (printerOptions.UseTabs)
{
queue.RemoveAt(queue.Count - 1);
return new Indent(indent.Value + "\t", indent.Length + printerOptions.TabWidth);
}
else
{
queue.Add(newPart);
}

var value = new StringBuilder();
var length = 0;
var lastTabs = 0;

var lastSpaces = 0;
foreach (var part in queue)
{
switch (part.Type)
{
case "indent":
Flush();
if (printerOptions.UseTabs)
{
AddTabs(1);
}
else
{
AddSpaces(printerOptions.TabWidth);
}
break;
default:
throw new Exception(part.Type);
}
}

FlushSpaces();

void AddTabs(int count)
{
value.Append('\t', count);
length += printerOptions.TabWidth * count;
}

void AddSpaces(int count)
{
value.Append(' ', count);
length += count;
}

void Flush()
{
if (printerOptions.UseTabs)
{
FlushTabs();
}
else
{
FlushSpaces();
}
}

void FlushTabs()
{
if (lastTabs > 0)
{
AddTabs(lastTabs);
}

ResetLast();
}

void FlushSpaces()
{
if (lastSpaces > 0)
{
AddSpaces(lastSpaces);
}

ResetLast();
return new Indent(
indent.Value + new string(' ', printerOptions.TabWidth),
indent.Length + printerOptions.TabWidth
);
}

void ResetLast()
{
lastTabs = 0;
lastSpaces = 0;
}

return new Indent(value.ToString(), length, queue);
}
}
}

0 comments on commit 8415a5f

Please sign in to comment.