Lines Matching refs:State

72   LineState State;
73 State.FirstIndent = FirstIndent;
74 State.Column = FirstIndent;
75 State.Line = Line;
76 State.NextToken = Line->First;
77 State.Stack.push_back(ParenState(FirstIndent, Line->Level, FirstIndent,
80 State.LineContainsContinuedForLoopSection = false;
81 State.StartOfStringLiteral = 0;
82 State.StartOfLineLevel = 0;
83 State.LowestLevelOnLine = 0;
84 State.IgnoreStackForComparison = false;
87 moveStateToNextToken(State, DryRun, /*Newline=*/false);
88 return State;
91 bool ContinuationIndenter::canBreak(const LineState &State) {
92 const FormatToken &Current = *State.NextToken;
95 if (!Current.CanBreakBefore && !(State.Stack.back().BreakBeforeClosingBrace &&
111 State.LowestLevelOnLine < State.StartOfLineLevel)
113 if (Current.isMemberAccess() && State.Stack.back().ContainsUnwrappedBuilder)
119 Previous.is(tok::l_brace) && State.Stack.size() > 1 &&
120 State.Stack[State.Stack.size() - 2].JSFunctionInlined &&
121 State.Stack[State.Stack.size() - 2].HasMultipleNestedBlocks)
124 return !State.Stack.back().NoLineBreak;
127 bool ContinuationIndenter::mustBreak(const LineState &State) {
128 const FormatToken &Current = *State.NextToken;
132 if (State.Stack.back().BreakBeforeClosingBrace &&
135 if (Previous.is(tok::semi) && State.LineContainsContinuedForLoopSection)
143 State.Stack.back().BreakBeforeParameter && !Current.isTrailingComment() &&
147 State.Column > State.Stack.back().Indent && // Breaking saves columns.
150 Previous.Type != TT_ConditionalExpr && nextIsMultilineString(State))
155 getLengthToMatchingParen(Previous) + State.Column > getColumnLimit(State))
162 if (State.Column < getNewLineColumn(State))
188 State.Stack.back().BreakBeforeParameter)
194 State.Stack.back().BreakBeforeParameter &&
195 State.Stack.back().FirstLessLess == 0)
199 State.Stack.back().ObjCSelectorNameFound &&
200 State.Stack.back().BreakBeforeParameter)
209 State.Stack.back().BreakBeforeParameter)
213 (State.Stack.back().CallContinuation != 0 ||
214 (State.Stack.back().BreakBeforeParameter &&
215 State.Stack.back().ContainsUnwrappedBuilder)))
228 unsigned ContinuationIndenter::addTokenToState(LineState &State, bool Newline,
231 const FormatToken &Current = *State.NextToken;
233 assert(!State.Stack.empty());
240 State.NextToken->WhitespaceRange.getEnd()) -
242 State.NextToken->WhitespaceRange.getBegin());
243 State.Column += WhitespaceLength;
244 moveStateToNextToken(State, DryRun, /*Newline=*/false);
250 Penalty = addTokenOnNewLine(State, DryRun);
252 addTokenOnCurrentLine(State, DryRun, ExtraSpaces);
254 return moveStateToNextToken(State, DryRun, Newline) + Penalty;
257 void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
259 FormatToken &Current = *State.NextToken;
260 const FormatToken &Previous = *State.NextToken->Previous;
262 (State.Line->First->is(tok::kw_for) || Current.NestingLevel == 0) &&
263 State.Stack.back().VariablePos == 0) {
264 State.Stack.back().VariablePos = State.Column;
267 while (Tok && State.Stack.back().VariablePos >= Tok->ColumnWidth) {
268 State.Stack.back().VariablePos -= Tok->ColumnWidth;
274 State.Stack.back().LastSpace = State.Stack.back().VariablePos;
281 Spaces, State.Column + Spaces);
284 !State.Stack.back().ObjCSelectorNameFound) {
286 State.Stack.back().AlignColons = false;
287 else if (State.Stack.back().Indent + Current.LongestObjCSelectorName >
288 State.Column + Spaces + Current.ColumnWidth)
289 State.Stack.back().ColonPos =
290 State.Stack.back().Indent + Current.LongestObjCSelectorName;
292 State.Stack.back().ColonPos = State.Column + Spaces + Current.ColumnWidth;
297 State.Stack.back().Indent = State.Column + Spaces;
298 if (State.Stack.back().AvoidBinPacking && startsNextParameter(Current, Style))
299 State.Stack.back().NoLineBreak = true;
301 State.Stack.back().ContainsUnwrappedBuilder = true;
303 State.Column += Spaces;
308 State.Stack.back().LastSpace = State.Column;
312 State.Stack.back().LastSpace = State.Column;
323 State.Stack.back().LastSpace = State.Column;
325 State.Stack.back().Indent = State.Column;
326 State.Stack.back().LastSpace = State.Column;
339 State.Stack[State.Stack.size() - 2].CallContinuation == 0)
340 State.Stack.back().LastSpace = State.Column;
344 unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
346 FormatToken &Current = *State.NextToken;
347 const FormatToken &Previous = *State.NextToken->Previous;
359 if (!State.Stack.back().ContainsLineBreak)
361 State.Stack.back().ContainsLineBreak = true;
363 Penalty += State.NextToken->SplitPenalty;
369 State.Stack.back().FirstLessLess == 0 &&
370 (State.Column <= Style.ColumnLimit / 3 ||
371 State.Stack.back().BreakBeforeParameter))
374 State.Column = getNewLineColumn(State);
376 if (State.Stack.back().CallContinuation == 0)
377 State.Stack.back().CallContinuation = State.Column;
379 if (!State.Stack.back().ObjCSelectorNameFound) {
381 State.Stack.back().AlignColons = false;
383 State.Stack.back().ColonPos =
384 State.Stack.back().Indent + NextNonComment->LongestObjCSelectorName;
386 } else if (State.Stack.back().AlignColons &&
387 State.Stack.back().ColonPos <= NextNonComment->ColumnWidth) {
388 State.Stack.back().ColonPos = State.Column + NextNonComment->ColumnWidth;
402 if (State.Stack.size() > 1)
403 State.Stack[State.Stack.size() - 2].LastSpace =
404 std::max(State.Stack.back().LastSpace, State.Stack.back().Indent) +
409 !State.Stack.back().AvoidBinPacking) ||
411 State.Stack.back().BreakBeforeParameter = false;
413 State.Stack.back().BreakBeforeParameter = false;
416 State.Stack.back().BreakBeforeParameter = true;
422 State.Stack.back().IndentLevel, State.Column,
423 State.Column, State.Line->InPPDirective);
427 State.Stack.back().LastSpace = State.Column;
428 State.StartOfLineLevel = Current.NestingLevel;
429 State.LowestLevelOnLine = Current.NestingLevel;
435 State.Stack.size() > 1 &&
436 State.Stack[State.Stack.size() - 2].JSFunctionInlined;
438 for (unsigned i = 0, e = State.Stack.size() - 1; i != e; ++i) {
439 State.Stack[i].BreakBeforeParameter = true;
448 State.Stack.back().BreakBeforeParameter = true;
455 State.Stack.back().BreakBeforeClosingBrace = true;
457 if (State.Stack.back().AvoidBinPacking) {
464 State.Line->MustBeDeclaration) ||
466 State.Stack.back().BreakBeforeParameter = true;
472 unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
473 if (!State.NextToken || !State.NextToken->Previous)
475 FormatToken &Current = *State.NextToken;
476 const FormatToken &Previous = *State.NextToken->Previous;
479 std::max(State.Stack.back().LastSpace, State.Stack.back().Indent) +
486 return Current.NestingLevel == 0 ? State.FirstIndent
487 : State.Stack.back().Indent;
489 if (State.Stack.size() > 1 &&
490 State.Stack[State.Stack.size() - 2].JSFunctionInlined)
491 return State.FirstIndent;
495 return State.Stack[State.Stack.size() - 2].LastSpace;
497 return State.FirstIndent;
501 return State.Stack.back().Indent;
502 if (NextNonComment->isStringLiteral() && State.StartOfStringLiteral != 0)
503 return State.StartOfStringLiteral;
505 State.Stack.back().FirstLessLess != 0)
506 return State.Stack.back().FirstLessLess;
508 if (State.Stack.back().CallContinuation == 0) {
511 return State.Stack.back().CallContinuation;
514 if (State.Stack.back().QuestionColumn != 0 &&
518 return State.Stack.back().QuestionColumn;
519 if (Previous.is(tok::comma) && State.Stack.back().VariablePos != 0)
520 return State.Stack.back().VariablePos;
526 return std::max(State.Stack.back().LastSpace, State.Stack.back().Indent);
528 if (!State.Stack.back().ObjCSelectorNameFound) {
530 return State.Stack.back().Indent;
532 return State.Stack.back().Indent +
536 } else if (!State.Stack.back().AlignColons) {
537 return State.Stack.back().Indent;
538 } else if (State.Stack.back().ColonPos > NextNonComment->ColumnWidth) {
539 return State.Stack.back().ColonPos - NextNonComment->ColumnWidth;
541 return State.Stack.back().Indent;
545 if (State.Stack.back().StartOfArraySubscripts != 0)
546 return State.Stack.back().StartOfArraySubscripts;
559 return State.FirstIndent + Style.ConstructorInitializerIndentWidth;
561 return State.Stack.back().Indent;
562 if (State.Stack.back().Indent == State.FirstIndent && PreviousNonComment &&
566 return State.Stack.back().Indent + Style.ContinuationIndentWidth;
567 return State.Stack.back().Indent;
570 unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
572 assert(State.Stack.size());
573 const FormatToken &Current = *State.NextToken;
576 State.Stack.back().AvoidBinPacking = true;
578 if (State.Stack.back().FirstLessLess == 0)
579 State.Stack.back().FirstLessLess = State.Column;
581 State.Stack.back().LastOperatorWrapped = Newline;
585 State.Stack.back().LastOperatorWrapped = Newline;
587 State.Stack.back().StartOfArraySubscripts == 0)
588 State.Stack.back().StartOfArraySubscripts = State.Column;
593 State.Stack.back().QuestionColumn = State.Column;
595 State.LowestLevelOnLine =
596 std::min(State.LowestLevelOnLine, Current.NestingLevel);
598 State.Stack.back().StartOfFunctionCall =
599 Current.LastOperator ? 0 : State.Column + Current.ColumnWidth;
601 State.Stack.back().ObjCSelectorNameFound = true;
608 State.Stack.back().Indent =
609 State.Column + (Style.BreakConstructorInitializersBeforeComma ? 0 : 2);
611 State.Stack.back().AvoidBinPacking = true;
612 State.Stack.back().BreakBeforeParameter = false;
619 State.Stack.back().Indent += Style.ContinuationIndentWidth;
632 State.Stack.size() > 1) {
633 if (State.Stack[State.Stack.size() - 2].JSFunctionInlined && Newline) {
634 for (unsigned i = 0, e = State.Stack.size() - 1; i != e; ++i) {
635 State.Stack[i].NoLineBreak = true;
638 State.Stack[State.Stack.size() - 2].JSFunctionInlined = false;
641 State.Stack.back().JSFunctionInlined = !Newline;
644 moveStatePastFakeLParens(State, Newline);
645 moveStatePastScopeOpener(State, Newline);
646 moveStatePastScopeCloser(State);
647 moveStatePastFakeRParens(State);
649 if (Current.isStringLiteral() && State.StartOfStringLiteral == 0) {
650 State.StartOfStringLiteral = State.Column;
653 State.StartOfStringLiteral = 0;
656 State.Column += Current.ColumnWidth;
657 State.NextToken = State.NextToken->Next;
658 unsigned Penalty = breakProtrudingToken(Current, State, DryRun);
659 if (State.Column > getColumnLimit(State)) {
660 unsigned ExcessCharacters = State.Column - getColumnLimit(State);
665 Current.Role->formatFromToken(State, this, DryRun);
672 Penalty += Previous->Role->formatAfterToken(State, this, DryRun);
677 void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,
679 const FormatToken &Current = *State.NextToken;
693 ParenState NewParenState = State.Stack.back();
701 std::max(std::max(State.Column, NewParenState.Indent),
702 State.Stack.back().LastSpace);
718 (!State.Stack.back().LastOperatorWrapped && BreakBeforeOperator))
729 NewParenState.LastSpace = std::max(NewParenState.LastSpace, State.Column);
730 NewParenState.StartOfFunctionCall = State.Column;
742 State.Stack.push_back(NewParenState);
748 static void consumeRParens(LineState& State, const FormatToken &Tok) {
750 unsigned VariablePos = State.Stack.back().VariablePos;
751 assert(State.Stack.size() > 1);
752 if (State.Stack.size() == 1) {
756 State.Stack.pop_back();
757 State.Stack.back().VariablePos = VariablePos;
778 static bool fakeRParenSpecialCase(const LineState &State) {
779 const FormatToken &Tok = *State.NextToken;
785 return !State.Stack.back().HasMultipleNestedBlocks &&
792 void ContinuationIndenter::moveStatePastFakeRParens(LineState &State) {
795 if (fakeRParenSpecialCase(State))
798 consumeRParens(State, *State.NextToken);
801 void ContinuationIndenter::moveStatePastScopeOpener(LineState &State,
803 const FormatToken &Current = *State.NextToken;
808 moveStateToNewBlock(State);
813 unsigned NewIndentLevel = State.Stack.back().IndentLevel;
817 if (fakeRParenSpecialCase(State))
818 consumeRParens(State, *Current.MatchingParen);
820 NewIndent = State.Stack.back().LastSpace;
823 NewIndent = std::min(State.Column + 2, NewIndent);
827 NewIndent = std::min(State.Column + 1, NewIndent);
838 std::max(State.Stack.back().LastSpace,
839 State.Stack.back().StartOfFunctionCall);
848 getLengthToMatchingParen(Current) + State.Column >
849 getColumnLimit(State))
852 bool NoLineBreak = State.Stack.back().NoLineBreak ||
854 State.Stack.back().ContainsUnwrappedBuilder);
855 State.Stack.push_back(ParenState(NewIndent, NewIndentLevel,
856 State.Stack.back().LastSpace,
858 State.Stack.back().BreakBeforeParameter = BreakBeforeParameter;
859 State.Stack.back().HasMultipleNestedBlocks = Current.BlockParameterCount > 1;
862 void ContinuationIndenter::moveStatePastScopeCloser(LineState &State) {
863 const FormatToken &Current = *State.NextToken;
869 if (State.Stack.size() > 1 &&
871 (Current.is(tok::r_brace) && State.NextToken != State.Line->First) ||
872 State.NextToken->Type == TT_TemplateCloser))
873 State.Stack.pop_back();
879 State.Stack.back().StartOfArraySubscripts = 0;
883 void ContinuationIndenter::moveStateToNewBlock(LineState &State) {
886 if (fakeRParenSpecialCase(State))
887 consumeRParens(State, *State.NextToken->MatchingParen);
890 unsigned NewIndent = State.Stack.back().LastSpace +
891 (State.NextToken->Type == TT_ObjCBlockLBrace
894 State.Stack.push_back(ParenState(
895 NewIndent, /*NewIndentLevel=*/State.Stack.back().IndentLevel + 1,
896 State.Stack.back().LastSpace, /*AvoidBinPacking=*/true,
897 State.Stack.back().NoLineBreak));
898 State.Stack.back().BreakBeforeParameter = true;
902 LineState &State) {
904 for (unsigned i = 0, e = State.Stack.size(); i != e; ++i)
905 State.Stack[i].BreakBeforeParameter = true;
907 unsigned ColumnsUsed = State.Column;
910 State.Column = Current.LastLineColumnWidth;
912 if (ColumnsUsed > getColumnLimit(State))
913 return Style.PenaltyExcessCharacter * (ColumnsUsed - getColumnLimit(State));
936 LineState &State,
941 return addMultilineToken(Current, State);
951 unsigned StartColumn = State.Column - Current.ColumnWidth;
952 unsigned ColumnLimit = getColumnLimit(State);
960 if (State.Line->Type == LT_PreprocessorDirective)
988 Current, State.Line->Level, StartColumn, Prefix, Postfix,
989 State.Line->InPPDirective, Encoding, Style));
997 Current, State.Line->Level, StartColumn, Current.OriginalColumn,
998 !Current.Previous, State.Line->InPPDirective, Encoding, Style));
1004 Token.reset(new BreakableLineComment(Current, State.Line->Level,
1069 State.Column = RemainingTokenColumns;
1076 for (unsigned i = 0, e = State.Stack.size(); i != e; ++i)
1077 State.Stack[i].BreakBeforeParameter = true;
1083 State.Stack.back().LastSpace = StartColumn;
1088 unsigned ContinuationIndenter::getColumnLimit(const LineState &State) const {
1090 return Style.ColumnLimit - (State.Line->InPPDirective ? 2 : 0);
1093 bool ContinuationIndenter::nextIsMultilineString(const LineState &State) {
1094 const FormatToken &Current = *State.NextToken;
1107 if (State.Column + Current.ColumnWidth + Current.UnbreakableTailLength >