private ImmutableArray <Edit> GetWrapLongLinesEdits( WrappingStyle wrappingStyle, SyntaxTrivia indentationTrivia) { var result = ArrayBuilder <Edit> .GetInstance(); AddTextChangeBetweenOpenAndFirstItem(wrappingStyle, result); var currentOffset = wrappingStyle == WrappingStyle.WrapFirst_IndentRest ? indentationTrivia.FullWidth() : _afterOpenTokenIndentationTrivia.FullWidth(); var itemsAndSeparators = _listItems.GetWithSeparators(); for (var i = 0; i < itemsAndSeparators.Count; i += 2) { var item = itemsAndSeparators[i].AsNode(); // Figure out where we'd be after this item. currentOffset += item.Span.Length; if (i > 0) { if (currentOffset < WrappingColumn) { // this item would not make us go pass our preferred wrapping column. So // keep it on this line, making sure there's a space between the previous // comma and us. result.Add(Edit.UpdateBetween(itemsAndSeparators[i - 1], SingleWhitespaceTrivia, NoTrivia, item)); currentOffset += " ".Length; } else { // not the first item on the line and this item makes us go past the wrapping // limit. We want to wrap before this item. result.Add(Edit.UpdateBetween(itemsAndSeparators[i - 1], NewLineTrivia, indentationTrivia, item)); currentOffset = indentationTrivia.FullWidth() + item.Span.Length; } } // Get rid of any spaces between the list item and the following token (a // comma or close token). var nextToken = item.GetLastToken().GetNextToken(); result.Add(Edit.DeleteBetween(item, nextToken)); currentOffset += nextToken.Span.Length; } return(result.ToImmutableAndFree()); }
private static void AnalyzeWhitespacesInTrivia(SyntaxTrivia trivia, ref AnalysisResult result) { // trivia already has text. getting text should be noop Debug.Assert(trivia.Kind() == SyntaxKind.WhitespaceTrivia); Debug.Assert(trivia.Width() == trivia.FullWidth()); int space = 0; int tab = 0; int unknownWhitespace = 0; var text = trivia.ToString(); for (int i = 0; i < trivia.Width(); i++) { if (text[i] == ' ') { space++; } else if (text[i] == '\t') { if (result.Space > 0) { result.HasTabAfterSpace = true; } tab++; } else { unknownWhitespace++; } } // set result result.Space += space; result.Tab += tab; result.HasUnknownWhitespace |= unknownWhitespace > 0; result.TreatAsElastic |= trivia.IsElastic(); }
private ImmutableArray <Edit> GetWrapLongLinesEdits( WrappingStyle wrappingStyle, SyntaxTrivia indentationTrivia) { using var _ = ArrayBuilder <Edit> .GetInstance(out var result); if (_shouldMoveOpenBraceToNewLine) { result.Add(Edit.UpdateBetween(_listSyntax.GetFirstToken().GetPreviousToken(), NewLineTrivia, _braceIndentationTrivia, _listSyntax.GetFirstToken())); } AddTextChangeBetweenOpenAndFirstItem(wrappingStyle, result); var currentOffset = wrappingStyle == WrappingStyle.WrapFirst_IndentRest ? indentationTrivia.FullWidth() : _afterOpenTokenIndentationTrivia.FullWidth(); var itemsAndSeparators = _listItems.GetWithSeparators(); for (var i = 0; i < itemsAndSeparators.Count; i += 2) { var item = itemsAndSeparators[i].AsNode() !; // Figure out where we'd be after this item. currentOffset += item.Span.Length; if (i > 0) { if (currentOffset < Options.WrappingColumn) { // this item would not make us go pass our preferred wrapping column. So // keep it on this line, making sure there's a space between the previous // comma and us. result.Add(Edit.UpdateBetween(itemsAndSeparators[i - 1], SingleWhitespaceTrivia, NoTrivia, item)); currentOffset += " ".Length; } else { // not the first item on the line and this item makes us go past the wrapping // limit. We want to wrap before this item. result.Add(Edit.UpdateBetween(itemsAndSeparators[i - 1], NewLineTrivia, indentationTrivia, item)); currentOffset = indentationTrivia.FullWidth() + item.Span.Length; } } // Get rid of any spaces between the list item and the following comma token if (i + 1 < itemsAndSeparators.Count) { var comma = itemsAndSeparators[i + 1]; Contract.ThrowIfFalse(comma.IsToken); result.Add(Edit.DeleteBetween(item, comma)); currentOffset += comma.Span.Length; } } if (this.Wrapper.ShouldMoveCloseBraceToNewLine) { result.Add(Edit.UpdateBetween(itemsAndSeparators.Last(), NewLineTrivia, _braceIndentationTrivia, _listSyntax.GetLastToken())); } else { result.Add(Edit.DeleteBetween(itemsAndSeparators.Last(), _listSyntax.GetLastToken())); } return(result.ToImmutable()); }