Settings for formatting of { } scope.
Inheritance: IDisposable
示例#1
0
文件: RFormatter.cs 项目: Fooway/RTVS
        private void CloseFormattingScope()
        {
            Debug.Assert(_tokens.CurrentToken.TokenType == RTokenType.CloseCurlyBrace);

            _tb.SoftLineBreak();
            _tb.CloseIndentLevel();
            _tb.SoftIndent();

            if (_formattingScopes.Count > 1)
            {
                if (_formattingScopes.Peek().CloseBracePosition == _tokens.Position)
                {
                    FormattingScope scope = _formattingScopes.Pop();
                    scope.Close();
                }
            }

            AppendToken(leadingSpace: false, trailingSpace: false);

            if (SuppressLineBreakCount == 0 && !_tokens.IsEndOfStream())
            {
                // We insert line break after } unless next token is comma
                // (scope is in the argument list) or a closing brace
                // (last parameter in a function or indexer) or it is followed by 'else'
                // so 'else' does not get separated from 'if'.
                if (!KeepCurlyAndElseTogether())
                {
                    if (!IsClosingToken(_tokens.CurrentToken) && !IsInArguments())
                    {
                        _tb.SoftLineBreak();
                    }
                }
            }
        }
示例#2
0
 public void TryCloseScope(int tokenIndex)
 {
     if (_formattingScopes.Count > 1)
     {
         if (_formattingScopes.Peek().CloseCurlyBraceTokenIndex == tokenIndex)
         {
             FormattingScope scope = _formattingScopes.Pop();
             scope.Dispose();
         }
     }
 }
示例#3
0
        private void CloseFormattingScope()
        {
            Debug.Assert(_tokens.CurrentToken.TokenType == RTokenType.CloseCurlyBrace);

            if (!SingleLineScope)
            {
                _tb.SoftLineBreak();
                _tb.CloseIndentLevel();
                _tb.SoftIndent();
            }

            var leadingSpace = SingleLineScope && _tokens.PreviousToken.TokenType != RTokenType.CloseCurlyBrace;

            if (_formattingScopes.Count > 1)
            {
                if (_formattingScopes.Peek().CloseBracePosition == _tokens.Position)
                {
                    FormattingScope scope = _formattingScopes.Pop();
                    scope.Dispose();
                }
            }

            AppendToken(leadingSpace: leadingSpace, trailingSpace: false);

            bool singleLineScopeJustClosed = false;

            if (_tokens.CurrentToken.Start >= _singleLineScopeEnd)
            {
                _singleLineScopeEnd       = -1;
                singleLineScopeJustClosed = true;
            }

            if (SuppressLineBreakCount == 0 && !_tokens.IsEndOfStream())
            {
                // We insert line break after } unless
                //  a) Next token is comma (scope is in the argument list) or
                //  b) Next token is a closing brace (last parameter in a function or indexer) or
                //  c) Next token is by 'else' (so 'else' does not get separated from 'if') or
                //  d) We are in a single-line scope sequence like if() {{ }}
                if (!KeepCurlyAndElseTogether())
                {
                    if (singleLineScopeJustClosed &&
                        !IsClosingToken(_tokens.CurrentToken) &&
                        !IsInArguments())
                    {
                        SoftLineBreak();
                    }
                }
            }
        }
示例#4
0
        /// <summary>
        /// Opens new formatting scope. Scope is opened when either
        /// code discovers open curly brace or when line break
        /// suppression is on.
        /// </summary>
        private void OpenFormattingScope()
        {
            Debug.Assert(_tokens.CurrentToken.TokenType == RTokenType.OpenCurlyBrace);

            if (IsInArguments())
            {
                // Inside argument lists indentation rules are different
                // so open new set of options and indentation
                FormattingScope formattingScope = new FormattingScope(_tb, _tokens, _options);
                _formattingScopes.Push(formattingScope);
            }

            // If scope is empty, make it { } unless there is a line break already in it
            if (_tokens.NextToken.TokenType == RTokenType.CloseCurlyBrace &&
                _textProvider.IsWhiteSpaceOnlyRange(_tokens.CurrentToken.End, _tokens.NextToken.Start))
            {
                AppendToken(leadingSpace: _tokens.PreviousToken.TokenType == RTokenType.CloseBrace, trailingSpace: true);
                AppendToken(leadingSpace: false, trailingSpace: false);
                return;
            }
            else
            {
                // Determine if the scope is a single line like if(TRUE) { 1 } and keep it
                // on a single line unless there are line breaks in it. Continue without
                // breaks until the scope ends. Includes multiple nested scopes such as {{{ 1 }}}.
                // We continue on the outer scope boundaries.
                if (_singleLineScopeEnd < 0)
                {
                    _singleLineScopeEnd = GetSingleLineScopeEnd();
                }

                if (_options.BracesOnNewLine && !SingleLineScope)
                {
                    SoftLineBreak();
                }
                else if (!IsOpenBraceToken(_tokens.PreviousToken.TokenType))
                {
                    _tb.AppendSpace();
                }
            }

            AppendToken(leadingSpace: false, trailingSpace: false);

            if (!SingleLineScope)
            {
                _tb.SoftLineBreak();
                _tb.NewIndentLevel();
            }
        }
示例#5
0
文件: RFormatter.cs 项目: Fooway/RTVS
        /// <summary>
        /// Opens new formatting scope. Scope is opened when either
        /// code discovers open curly brace or when line break
        /// suppression is on.
        /// </summary>
        private void OpenFormattingScope()
        {
            Debug.Assert(_tokens.CurrentToken.TokenType == RTokenType.OpenCurlyBrace);

            if (IsInArguments())
            {
                FormattingScope formattingScope = new FormattingScope(_indentBuilder);
                if (formattingScope.Open(_textProvider, _tokens, _options))
                {
                    _formattingScopes.Push(formattingScope);
                }
            }

            // If scope is empty, make it { } unless there is a line break already in it
            if (_tokens.NextToken.TokenType == RTokenType.CloseCurlyBrace &&
                IsWhiteSpaceOnlyRange(_tokens.CurrentToken.End, _tokens.NextToken.Start))
            {
                AppendToken(leadingSpace: _tokens.PreviousToken.TokenType == RTokenType.CloseBrace, trailingSpace: true);
                AppendToken(leadingSpace: false, trailingSpace: false);
                return;
            }
            else
            {
                if (_options.BracesOnNewLine)
                {
                    _tb.SoftLineBreak();
                }
                else if (!IsOpenBraceToken(_tokens.PreviousToken.TokenType))
                {
                    _tb.AppendSpace();
                }
            }

            AppendToken(leadingSpace: false, trailingSpace: false);

            _tb.SoftLineBreak();
            _tb.NewIndentLevel();
        }
示例#6
0
 public void OpenScope(FormattingScope scope) => _formattingScopes.Push(scope);
示例#7
0
        /// <summary>
        /// Opens new formatting scope. Scope is opened when either
        /// code discovers open curly brace or when line break
        /// suppression is on.
        /// </summary>
        private void OpenFormattingScope() {
            Debug.Assert(_tokens.CurrentToken.TokenType == RTokenType.OpenCurlyBrace);

            if (IsInArguments()) {
                FormattingScope formattingScope = new FormattingScope(_indentBuilder);
                if (formattingScope.Open(_textProvider, _tokens, _options)) {
                    _formattingScopes.Push(formattingScope);
                }
            }

            // If scope is empty, make it { } unless there is a line break already in it
            if (_tokens.NextToken.TokenType == RTokenType.CloseCurlyBrace &&
                 IsWhiteSpaceOnlyRange(_tokens.CurrentToken.End, _tokens.NextToken.Start)) {
                AppendToken(leadingSpace: _tokens.PreviousToken.TokenType == RTokenType.CloseBrace, trailingSpace: true);
                AppendToken(leadingSpace: false, trailingSpace: false);
                return;
            } else {
                if (_options.BracesOnNewLine) {
                    _tb.SoftLineBreak();
                } else if (!IsOpenBraceToken(_tokens.PreviousToken.TokenType)) {
                    _tb.AppendSpace();
                }
            }

            AppendToken(leadingSpace: false, trailingSpace: false);

            _tb.SoftLineBreak();
            _tb.NewIndentLevel();
        }
示例#8
0
 public void OpenScope(FormattingScope scope) => _formattingScopes.Push(scope);