public void Visit(CloseDelimiter delimiter) { switch (delimiter.Type) { case BinaryDelimiterType.Brace: if (!(_prev is OpenDelimiter && ((OpenDelimiter)_prev).Type == BinaryDelimiterType.Brace) && !IsSliceLiteralTerminal(delimiter)) { --_indentLevel; // if we just added a line break due // to some node don't add another one if (!(_prev is Terminal || _prev is Tag)) { _sb.AppendLine(); } AddIndentation(); } _sb.Append('}'); break; case BinaryDelimiterType.Bracket: _sb.Append(']'); break; case BinaryDelimiterType.Paren: if (_prev is ImportEntry) { System.Diagnostics.Debug.Assert(_indentLevel == 1); --_indentLevel; } _sb.Append(')'); break; default: throw new InvalidOperationException($"unsupported open delimiter {delimiter.Type}"); } _prev = delimiter; }
/// <summary> /// Determines if this closing delimiter is the end of a slice literal (e.g. []string{"foo"}). /// </summary> /// <param name="delimiter">The CloseDelimiter object to inspect.</param> /// <returns>True if this is the closing delimiter of a slice literal.</returns> private bool IsSliceLiteralTerminal(CloseDelimiter delimiter) { if (delimiter.Type != BinaryDelimiterType.Brace) { return(false); } Node n = delimiter.Parent; int trip = 0; while (n != null) { if (trip == 4) { return(true); } else if (n is OpenDelimiter) { ++trip; } else if (n is Identifier) { ++trip; } else if (n is CloseDelimiter && ((CloseDelimiter)n).Type == BinaryDelimiterType.Bracket) { ++trip; } else if (n is OpenDelimiter && ((OpenDelimiter)n).Type == BinaryDelimiterType.Bracket) { ++trip; } n = n.Parent; } return(false); }