Beispiel #1
0
        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;
        }
Beispiel #2
0
        /// <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);
        }