diff --git a/src/Generator/Utils/TextGenerator.cs b/src/Generator/Utils/TextGenerator.cs new file mode 100644 index 00000000..555d9a71 --- /dev/null +++ b/src/Generator/Utils/TextGenerator.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Cxxi +{ + public class TextGenerator + { + private const uint DefaultIndent = 4; + private const uint MaxIndent = 80; + + private readonly StringBuilder sb; + private readonly Stack currentIndent; + private bool isStartOfLine; + private bool needsNewLine; + + public TextGenerator() + { + sb = new StringBuilder(); + currentIndent = new Stack(); + isStartOfLine = false; + } + + public void Write(string msg, params object[] args) + { + if (isStartOfLine) + sb.Append(new string(' ', (int)currentIndent.Sum(u => u))); + + if (args.Length > 0) + msg = string.Format(msg, args); + + if (msg.Length > 0) + isStartOfLine = false; + + sb.Append(msg); + } + + public void WriteLine(string msg, params object[] args) + { + Write(msg, args); + NewLine(); + } + + public void WriteLineIndent(string msg, params object[] args) + { + PushIndent(); + WriteLine(msg, args); + PopIndent(); + } + + public void NewLine() + { + sb.AppendLine(string.Empty); + isStartOfLine = true; + } + + public void NewLineIfNeeded() + { + if (!needsNewLine) return; + + NewLine(); + needsNewLine = false; + } + + public void NeedNewLine() + { + needsNewLine = true; + } + + public void PushIndent(uint indent = DefaultIndent) + { + currentIndent.Push(indent); + } + + public void PopIndent() + { + currentIndent.Pop(); + } + + public void WriteStartBraceIndent() + { + WriteLine("{"); + PushIndent(); + } + + public void WriteCloseBraceIndent() + { + PopIndent(); + WriteLine("}"); + } + + public override string ToString() + { + return sb.ToString(); + } + } +}