unsigned CommaSeparatedList::formatAfterToken(LineState &State, ContinuationIndenter *Indenter, bool DryRun) { if (State.NextToken == nullptr || !State.NextToken->Previous) return 0; if (Formats.size() == 1) return 0; // Handled by formatFromToken // Ensure that we start on the opening brace. const FormatToken *LBrace = State.NextToken->Previous->getPreviousNonComment(); if (!LBrace || !LBrace->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) || LBrace->BlockKind == BK_Block || LBrace->Type == TT_DictLiteral || LBrace->Next->Type == TT_DesignatedInitializerPeriod) return 0; // Calculate the number of code points we have to format this list. As the // first token is already placed, we have to subtract it. unsigned RemainingCodePoints = Style.ColumnLimit - State.Column + State.NextToken->Previous->ColumnWidth; // Find the best ColumnFormat, i.e. the best number of columns to use. const ColumnFormat *Format = getColumnFormat(RemainingCodePoints); // If no ColumnFormat can be used, the braced list would generally be // bin-packed. Add a severe penalty to this so that column layouts are // preferred if possible. if (!Format) return 10000; // Format the entire list. unsigned Penalty = 0; unsigned Column = 0; unsigned Item = 0; while (State.NextToken != LBrace->MatchingParen) { bool NewLine = false; unsigned ExtraSpaces = 0; // If the previous token was one of our commas, we are now on the next item. if (Item < Commas.size() && State.NextToken->Previous == Commas[Item]) { if (!State.NextToken->isTrailingComment()) { ExtraSpaces += Format->ColumnSizes[Column] - ItemLengths[Item]; ++Column; } ++Item; } if (Column == Format->Columns || State.NextToken->MustBreakBefore) { Column = 0; NewLine = true; } // Place token using the continuation indenter and store the penalty. Penalty += Indenter->addTokenToState(State, NewLine, DryRun, ExtraSpaces); } return Penalty; }
unsigned CommaSeparatedList::format(LineState &State, ContinuationIndenter *Indenter, bool DryRun) { if (!State.NextToken->Previous || !State.NextToken->Previous->Previous || Commas.size() <= 2) return 0; // Ensure that we start on the opening brace. const FormatToken *LBrace = State.NextToken->Previous->Previous; if (LBrace->isNot(tok::l_brace) || LBrace->Next->Type == TT_DesignatedInitializerPeriod) return 0; // Calculate the number of code points we have to format this list. As the // first token is already placed, we have to subtract it. unsigned RemainingCodePoints = Style.ColumnLimit - State.Column + State.NextToken->Previous->CodePointCount; // Find the best ColumnFormat, i.e. the best number of columns to use. const ColumnFormat *Format = getColumnFormat(RemainingCodePoints); if (!Format) return 0; // Format the entire list. unsigned Penalty = 0; unsigned Column = 0; unsigned Item = 0; while (State.NextToken != LBrace->MatchingParen) { bool NewLine = false; unsigned ExtraSpaces = 0; // If the previous token was one of our commas, we are now on the next item. if (Item < Commas.size() && State.NextToken->Previous == Commas[Item]) { if (!State.NextToken->isTrailingComment()) { ExtraSpaces += Format->ColumnSizes[Column] - ItemLengths[Item]; ++Column; } ++Item; } if (Column == Format->Columns || State.NextToken->MustBreakBefore) { Column = 0; NewLine = true; } // Place token using the continuation indenter and store the penalty. Penalty += Indenter->addTokenToState(State, NewLine, DryRun, ExtraSpaces); } return Penalty; }