Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions samples/TinyC/Node.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ static void Print(Node node, IndentedStringBuilder sb)
break;

case NumberNode(Value: var number):
sb.Append(number.ToString());
sb.Append(number);
break;

case IfNode c:
Expand All @@ -43,10 +43,10 @@ static void Print(Node node, IndentedStringBuilder sb)

Print(c.IfTrue, sb);

if (c.IfFalse is BlockNode { Statements: [IfNode @else] })
if (c.IfFalse is BlockNode { Statements: [IfNode ifElse] })
{
sb.Append("else ");
Print(@else, sb);
Print(ifElse, sb);
}
else if (c.IfFalse is not BlockNode([]))
{
Expand All @@ -58,11 +58,17 @@ static void Print(Node node, IndentedStringBuilder sb)

case TernaryNode c:
Print(c.Test, sb);
sb.Append(" ? (");
sb.IncrementIndent();
sb
.AppendLine()
.Append("? ");
Print(c.IfTrue, sb);
sb.Append(") : (");

sb
.AppendLine()
.Append(": ");
Print(c.IfFalse, sb);
sb.Append(')');
sb.DecrementIndent();
break;

case WhileLoopNode w:
Expand All @@ -88,6 +94,13 @@ static void Print(Node node, IndentedStringBuilder sb)
sb.Append(')');
break;

case BinaryNode(Operator: "=", var variable, var expr):
Print(variable, sb);
sb.Append(" = (");
Print(expr, sb);
sb.Append(')');
break;

case BinaryNode b:
sb.Append('(');
Print(b.Left, sb);
Expand Down
57 changes: 12 additions & 45 deletions samples/Utilities/IndentedStringBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,59 +9,45 @@ internal sealed class IndentedStringBuilder

private readonly StringBuilder _sb = new StringBuilder();

public int Length => _sb.Length;

public IndentedStringBuilder Append(string value)
public IndentedStringBuilder Append(char value)
{
DoIndent();
_sb.Append(value);
return this;
}

public IndentedStringBuilder Append(FormattableString value)
public IndentedStringBuilder Append(int value)
{
DoIndent();
_sb.Append(value);
return this;
}

public IndentedStringBuilder Append(char value)
public IndentedStringBuilder Append(string value)
{
DoIndent();
_sb.Append(value);
return this;
}

public IndentedStringBuilder AppendLine()
public IndentedStringBuilder Append(FormattableString value)
{
AppendLine(string.Empty);
DoIndent();
_sb.Append(value);
return this;
}

public IndentedStringBuilder AppendLine(string value)
public IndentedStringBuilder AppendLine()
{
if (value.Length != 0)
DoIndent();

_sb.AppendLine(value);
_indentPending = true;
AppendLine(string.Empty);
return this;
}

public IndentedStringBuilder AppendLine(FormattableString value)
public IndentedStringBuilder AppendLine(string value)
{
DoIndent();
_sb.Append(value);
_indentPending = true;
return this;
}

public IndentedStringBuilder Clear()
{
_sb.Clear();
_sb.AppendLine(value);
_indentPending = true;
_indent = 0;

return this;
}

Expand All @@ -73,37 +59,18 @@ public IndentedStringBuilder IncrementIndent()

public IndentedStringBuilder DecrementIndent()
{
if (_indent > 0)
_indent--;

_indent = Math.Max(0, _indent - 1);
return this;
}

public IDisposable Indent() =>
new Indenter(this);

public override string ToString() =>
_sb.ToString();

private void DoIndent()
{
if (_indentPending && _indent > 0)
if (_indentPending && _indent != 0)
_sb.Append(' ', _indent * 4);

_indentPending = false;
}

private sealed class Indenter : IDisposable
{
private readonly IndentedStringBuilder _sb;

public Indenter(IndentedStringBuilder sb)
{
_sb = sb;
_sb.IncrementIndent();
}

public void Dispose() =>
_sb.DecrementIndent();
}
}