Пример #1
0
        private void SplitOutMultiLineTriviaAndAddSpacing(
            IReadOnlyList <SyntaxTrivia> trivia,
            TokenSpacingPolicy spacingPolicy,
            out SyntaxAnnotation multiLineAnnotation,
            out SyntaxTriviaList leadingTrivia)
        {
            for (var i = trivia.Count - 1; i >= 0; --i)
            {
                if (RoslynHelpers.IsMultiLine(trivia[i]))
                {
                    multiLineAnnotation = LayoutAnnotations.CreateMultiLineTriviaAnnotation(trivia.Take(i + 1));
                    // if we have no more trivia after the multi-line trivia, then leading is empty. If we have
                    // additional trivial, leading is that trivia plus a space
                    leadingTrivia = trivia.Count > i + 1
                        ? SyntaxFactory.TriviaList(trivia.Skip(i + 1).Concat(SingleWhitespaceList))
                        : SyntaxTriviaList.Empty;
                    return;
                }
            }

            multiLineAnnotation = null;
            leadingTrivia       = trivia.Count > 0 ? SyntaxFactory.TriviaList(trivia.Concat(SingleWhitespaceList))
                : (spacingPolicy & TokenSpacingPolicy.NeedsWhitespace) == TokenSpacingPolicy.NeedsWhitespace ? SingleWhitespaceList
                : SyntaxTriviaList.Empty;
        }
Пример #2
0
        private void MergeNewLines(List <SyntaxTrivia> buffer, TokenSpacingPolicy spacingPolicy, bool hadTrailingTrivia)
        {
            // if we have only one trivia entry, either:
            // (1) it's a newline, in which case we can remove it unless it followed some trailing trivia
            // (2) it's not a newline, in which case nothing will be removed so just return
            if (buffer.Count == 1)
            {
                if (!hadTrailingTrivia && buffer[0].IsKind(SyntaxKind.EndOfLineTrivia))
                {
                    buffer.Clear();
                }
                return;
            }

            var newLineStart = -1;

            for (var i = 0; i <= buffer.Count; ++i)
            {
                if (i < buffer.Count && buffer[i].IsKind(SyntaxKind.EndOfLineTrivia))
                {
                    if (newLineStart < 0)
                    {
                        newLineStart = i;
                    }
                }
                else if (newLineStart >= 0)
                {
                    // if we find more than the allowed # of newlines in a row, remove all but the first # allowed
                    var allowedNewLines = (newLineStart == 0 && (spacingPolicy | TokenSpacingPolicy.BanMultipleTrailingNewLines) == TokenSpacingPolicy.BanMultipleTrailingNewLines) ? 1
                        : (i == buffer.Count && (spacingPolicy | TokenSpacingPolicy.BanMultipleLeadingNewLines) == TokenSpacingPolicy.BanMultipleLeadingNewLines) ? 1
                        : 2;

                    var count = i - newLineStart;
                    if (count > allowedNewLines)
                    {
                        buffer.RemoveRange(newLineStart + allowedNewLines, count: count - allowedNewLines);
                        i = newLineStart + allowedNewLines;
                    }
                    newLineStart = -1;
                }
            }
        }