예제 #1
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(SyntaxTrivia);

                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(SyntaxTrivia),
                formatter, whitespaceAdder,
                changes, implicitLineBreak, cancellationToken);

            return(lineColumn);
        }
예제 #2
0
        private LineColumn FormatFirstTriviaAndWhitespaceAfter <T>(
            LineColumn lineColumnBeforeTrivia1,
            SyntaxTrivia trivia1,
            LineColumnDelta existingWhitespaceBetween,
            SyntaxTrivia trivia2,
            Formatter <T> format,
            WhitespaceAppender <T> addWhitespaceTrivia,
            List <T> changes,
            CancellationToken cancellationToken)
        {
            var lineColumnAfterTrivia1 = trivia1.RawKind == 0 ?
                                         lineColumnBeforeTrivia1 : lineColumnBeforeTrivia1.With(format(lineColumnBeforeTrivia1, trivia1, changes, cancellationToken));

            var rule            = GetOverallLineColumnRuleBetween(trivia1, existingWhitespaceBetween, trivia2);
            var whitespaceDelta = Apply(lineColumnBeforeTrivia1, trivia1, lineColumnAfterTrivia1, existingWhitespaceBetween, trivia2, rule);

            var span = GetTextSpan(trivia1, trivia2);

            addWhitespaceTrivia(lineColumnAfterTrivia1, whitespaceDelta, span, changes);

            return(lineColumnAfterTrivia1.With(whitespaceDelta));
        }
예제 #3
0
        private LineColumn FormatTrivia <T>(Formatter <T> formatter, WhitespaceAppender <T> whitespaceAdder, ArrayBuilder <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);

            // Holds last position before _ ' Comment so we can reset after processing comment
            var          previousLineColumn = LineColumn.Default;
            SyntaxTrivia trivia;

            for (var i = 0; i < list.Count; i++)
            {
                trivia = list[i];
                if (trivia.RawKind == 0)
                {
                    continue;
                }

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

                    if (IsEndOfLine(trivia))
                    {
                        implicitLineBreak = false;
                        // If we are on a new line we don't want to continue
                        // reseting indenting this handles the case of a NewLine
                        // followed by whitespace and a comment
                        previousLineColumn = LineColumn.Default;
                    }
                    else if (LineContinuationFollowedByWhitespaceComment(previousTrivia, (i + 1) < list.Count ? list[i + 1] : default))
                    {
                        // we have a comment following an underscore space the formatter
                        // thinks this next line should be shifted to right by
                        // indentation value. Since we know through the test above that
                        // this is the special case of _ ' Comment we don't want the extra indent
                        // so we set the LineColumn value back to where it was before the comment
                        previousLineColumn = lineColumn;
                    }

                    previousWhitespaceTrivia = trivia;
                    continue;
                }

                previousWhitespaceTrivia = default;

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

                if (previousLineColumn.Column != 0 &&
                    previousLineColumn.Column < lineColumn.Column &&
                    IsVisualBasicComment(trivia))
                {
                    lineColumn = previousLineColumn;
                    // When we see a NewLine we don't want any special handling
                    // for _ ' Comment
                    previousLineColumn = LineColumn.Default;
                }

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

                previousTrivia = trivia;
            }

            lineColumn = FormatFirstTriviaAndWhitespaceAfter(
                lineColumn,
                previousTrivia, existingWhitespaceDelta, default,