internal static string SimpleFormat(Node constantNode)
        {
            var textLine = new StringBuilder();
            var nodeInfos = new List<NodeInfo>();

            GetSimpleFormatString(constantNode, nodeInfos, textLine);
            return textLine.ToString();
        }
 static void GetSimpleFormatString(Node constantNode, List<NodeInfo> nodeInfos, StringBuilder textLine)
 {
     constantNode.Walk((text, value, depth) =>
         {
             if (value != null)
             {
                 nodeInfos.Add(new NodeInfo {Location = textLine.Length, Value = value, Depth = depth});
             }
             textLine.Append(text);
         }, 0);
 }
        internal static string[] Format(Node constantNode)
        {
            var textLine = new StringBuilder();
            var nodeInfos = new List<NodeInfo>();

            GetSimpleFormatString(constantNode, nodeInfos, textLine);

            var lines = new List<StringBuilder>();

            var stalks = new List<int>();
            foreach (var info in nodeInfos.OrderBy(x => x.Location))
            {
                var line = new StringBuilder(new string(' ', info.Location));
                stalks.ForEach(x => line[x] = pipe);
                stalks.Add(info.Location);
                line.Append(info.Value);
                lines.Add(line);
            }

            if (nodeInfos.Any())
            {
                for (int i = nodeInfos.Max(x => x.Depth) - 1; i >= 0; i--)
                {
                    var line = new StringBuilder(new string(' ', nodeInfos.Max(x => x.Location) + 1));
                    nodeInfos.ForEach(x => line[x.Location] = x.Depth > i ? dot : pipe);
                    lines.Add(line);
                }
            }

            lines.Add(textLine);

            return lines
                .AsEnumerable()
                .Reverse()
                .Select(x => x.ToString().TrimEnd())
                .Where(x => x.Length > 0)
                .ToArray();
        }