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)); }
internal Enumerator(TriviaList triviaList) { _list1 = triviaList._list1; _list2 = triviaList._list2; _index = -1; _enumerator = _list1.GetEnumerator(); }
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,
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)); }
protected abstract bool ContainsSkippedTokensOrText(TriviaList list);