Пример #1
0
            public override TriviaData WithIndentation(
                int indentation, FormattingContext context, ChainedFormattingRules formattingRules, CancellationToken cancellationToken)
            {
                // if tokens are not in different line, there is nothing we can do here
                if (!this.SecondTokenIsFirstTokenOnLine)
                {
                    return(this);
                }

                // well, we are already in a desired format, nothing to do. return as it is.
                if (this.Spaces == indentation)
                {
                    return(this);
                }

                // do expansive check
                // we need to actually format here to find out indentation
                var list = new TriviaList(_token1.TrailingTrivia, _token2.LeadingTrivia);

                Contract.ThrowIfFalse(list.Count > 0);

                if (ContainsSkippedTokensOrText(list))
                {
                    // we can't format
                    return(this);
                }

                // okay, we need to do expansive calculation to find out actual space between two tokens
                var trivia       = Format(context, formattingRules, this.LineBreaks, indentation, cancellationToken);
                var triviaString = CreateString(trivia, cancellationToken);

                ExtractLineAndSpace(triviaString, out var lineBreaks, out var spaces);

                return(CreateComplexTrivia(lineBreaks, spaces, indentation));
            }
Пример #2
0
            internal Enumerator(TriviaList triviaList)
            {
                _list1 = triviaList._list1;
                _list2 = triviaList._list2;

                _index      = -1;
                _enumerator = _list1.GetEnumerator();
            }
Пример #3
0
        private LineColumn FormatTrivia <T>(Formatter <T> formatter, WhitespaceAppender <T> whitespaceAdder, List <T> changes, CancellationToken cancellationToken)
        {
            var lineColumn = this.InitialLineColumn;

            var existingWhitespaceDelta  = LineColumnDelta.Default;
            var previousWhitespaceTrivia = default(SyntaxTrivia);
            var previousTrivia           = default(SyntaxTrivia);
            var implicitLineBreak        = false;

            var list = new TriviaList(this.Token1.TrailingTrivia, this.Token2.LeadingTrivia);

            foreach (var trivia in list)
            {
                if (trivia.RawKind == 0)
                {
                    continue;
                }

                if (IsWhitespaceOrEndOfLine(trivia))
                {
                    if (IsEndOfLine(trivia))
                    {
                        implicitLineBreak = false;
                    }

                    existingWhitespaceDelta = existingWhitespaceDelta.With(
                        GetLineColumnOfWhitespace(
                            lineColumn,
                            previousTrivia,
                            previousWhitespaceTrivia,
                            existingWhitespaceDelta,
                            trivia));

                    previousWhitespaceTrivia = trivia;
                    continue;
                }

                previousWhitespaceTrivia = default;

                lineColumn = FormatFirstTriviaAndWhitespaceAfter(
                    lineColumn,
                    previousTrivia, existingWhitespaceDelta, trivia,
                    formatter, whitespaceAdder,
                    changes, implicitLineBreak, cancellationToken);

                implicitLineBreak       = implicitLineBreak || ContainsImplicitLineBreak(trivia);
                existingWhitespaceDelta = LineColumnDelta.Default;

                previousTrivia = trivia;
            }

            lineColumn = FormatFirstTriviaAndWhitespaceAfter(
                lineColumn,
                previousTrivia, existingWhitespaceDelta, default,
Пример #4
0
        public List <SyntaxTrivia> FormatToSyntaxTrivia(CancellationToken cancellationToken)
        {
            var changes = ListPool <SyntaxTrivia> .Allocate();

            var lineColumn = FormatTrivia(Format, AddWhitespaceTrivia, changes, cancellationToken);

            // deal with edges
            // insert empty linebreaks at the beginning of trivia list
            AddExtraLines(lineColumn.Line, changes);

            if (Succeeded())
            {
                var temp = new List <SyntaxTrivia>(changes);
                ListPool <SyntaxTrivia> .Free(changes);

                return(temp);
            }

            ListPool <SyntaxTrivia> .Free(changes);

            var triviaList = new TriviaList(this.Token1.TrailingTrivia, this.Token2.LeadingTrivia);

            return(new List <SyntaxTrivia>(triviaList));
        }
Пример #5
0
 protected abstract bool ContainsSkippedTokensOrText(TriviaList list);