16b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//===--- ContinuationIndenter.cpp - Format C++ code -----------------------===//
26b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//
36b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//                     The LLVM Compiler Infrastructure
46b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//
56b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper// This file is distributed under the University of Illinois Open Source
66b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper// License. See LICENSE.TXT for details.
76b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//
86b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//===----------------------------------------------------------------------===//
96b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper///
106b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper/// \file
116b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper/// \brief This file implements the continuation indenter.
126b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper///
136b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper//===----------------------------------------------------------------------===//
146b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
156b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "BreakableToken.h"
166b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "ContinuationIndenter.h"
176b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "WhitespaceManager.h"
186b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "clang/Basic/OperatorPrecedence.h"
196b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "clang/Basic/SourceManager.h"
206b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "clang/Format/Format.h"
216b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include "llvm/Support/Debug.h"
226b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper#include <string>
236b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEBUG_TYPE "format-formatter"
256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
266b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jaspernamespace clang {
276b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jaspernamespace format {
286b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
296b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper// Returns the length of everything up to the first possible line break after
306b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper// the ), ], } or > matching \c Tok.
316b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasperstatic unsigned getLengthToMatchingParen(const FormatToken &Tok) {
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Tok.MatchingParen)
336b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return 0;
346b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  FormatToken *End = Tok.MatchingParen;
356b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  while (End->Next && !End->Next->CanBreakBefore) {
366b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    End = End->Next;
376b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
386b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  return End->TotalLength - Tok.TotalLength + 1;
396b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
406b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
41d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper// Returns \c true if \c Tok is the "." or "->" of a call and starts the next
42d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper// segment of a builder type call.
43d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasperstatic bool startsSegmentOfBuilderTypeCall(const FormatToken &Tok) {
44d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper  return Tok.isMemberAccess() && Tok.Previous && Tok.Previous->closesScope();
45d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper}
46d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper
4719ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper// Returns \c true if \c Current starts a new parameter.
4819ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasperstatic bool startsNextParameter(const FormatToken &Current,
4919ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper                                const FormatStyle &Style) {
5019ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper  const FormatToken &Previous = *Current.Previous;
5119ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper  if (Current.Type == TT_CtorInitializerComma &&
5219ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper      Style.BreakConstructorInitializersBeforeComma)
5319ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper    return true;
5419ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper  return Previous.is(tok::comma) && !Current.isTrailingComment() &&
5519ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper         (Previous.Type != TT_CtorInitializerComma ||
5619ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper          !Style.BreakConstructorInitializersBeforeComma);
5719ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper}
5819ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper
596b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel JasperContinuationIndenter::ContinuationIndenter(const FormatStyle &Style,
606b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                           SourceManager &SourceMgr,
616b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                           WhitespaceManager &Whitespaces,
626b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                           encoding::Encoding Encoding,
636b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                           bool BinPackInconclusiveFunctions)
64567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    : Style(Style), SourceMgr(SourceMgr), Whitespaces(Whitespaces),
65567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper      Encoding(Encoding),
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      BinPackInconclusiveFunctions(BinPackInconclusiveFunctions),
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      CommentPragmasRegex(Style.CommentPragmas) {}
686b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
69567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel JasperLineState ContinuationIndenter::getInitialState(unsigned FirstIndent,
70b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper                                                const AnnotatedLine *Line,
71b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper                                                bool DryRun) {
726b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  LineState State;
73567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  State.FirstIndent = FirstIndent;
746b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  State.Column = FirstIndent;
75567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  State.Line = Line;
76567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  State.NextToken = Line->First;
77f0fc89c358cdd0717c0e12eb4a90e4a6ce956e98Alexander Kornienko  State.Stack.push_back(ParenState(FirstIndent, Line->Level, FirstIndent,
786b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                   /*AvoidBinPacking=*/false,
796b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                   /*NoLineBreak=*/false));
806b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  State.LineContainsContinuedForLoopSection = false;
816b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  State.StartOfStringLiteral = 0;
826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.StartOfLineLevel = 0;
836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.LowestLevelOnLine = 0;
846b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  State.IgnoreStackForComparison = false;
856b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
866b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // The first token has already been indented and thus consumed.
87b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper  moveStateToNextToken(State, DryRun, /*Newline=*/false);
886b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  return State;
896b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
906b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
916b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasperbool ContinuationIndenter::canBreak(const LineState &State) {
926b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  const FormatToken &Current = *State.NextToken;
936b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  const FormatToken &Previous = *Current.Previous;
946b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  assert(&Previous == Current.Previous);
95a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper  if (!Current.CanBreakBefore && !(State.Stack.back().BreakBeforeClosingBrace &&
96a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper                                   Current.closesBlockTypeList(Style)))
976b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return false;
986b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // The opening "{" of a braced list has to be on the same line as the first
996b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // element if it is nested in another braced init list or function call.
1006b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (!Current.MustBreakBefore && Previous.is(tok::l_brace) &&
1016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Previous.Type != TT_DictLiteral && Previous.BlockKind == BK_BracedInit &&
1026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Previous.Previous &&
1036b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      Previous.Previous->isOneOf(tok::l_brace, tok::l_paren, tok::comma))
1046b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return false;
1056b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // This prevents breaks like:
1066b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  //   ...
1076b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  //   SomeParameter, OtherParameter).DoSomething(
1086b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  //   ...
1096b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // As they hide "DoSomething" and are generally bad for readability.
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Previous.opensScope() && Previous.isNot(tok::l_brace) &&
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.LowestLevelOnLine < State.StartOfLineLevel)
1126b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return false;
113d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper  if (Current.isMemberAccess() && State.Stack.back().ContainsUnwrappedBuilder)
114d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper    return false;
115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
116ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Don't create a 'hanging' indent if there are multiple blocks in a single
117ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // statement.
118ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Style.Language == FormatStyle::LK_JavaScript &&
119ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Previous.is(tok::l_brace) && State.Stack.size() > 1 &&
120ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      State.Stack[State.Stack.size() - 2].JSFunctionInlined &&
121ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      State.Stack[State.Stack.size() - 2].HasMultipleNestedBlocks)
122ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return false;
123ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1246b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  return !State.Stack.back().NoLineBreak;
1256b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
1266b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
1276b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasperbool ContinuationIndenter::mustBreak(const LineState &State) {
1286b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  const FormatToken &Current = *State.NextToken;
1296b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  const FormatToken &Previous = *Current.Previous;
1306b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Current.MustBreakBefore || Current.Type == TT_InlineASMColon)
1316b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
132a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper  if (State.Stack.back().BreakBeforeClosingBrace &&
133a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper      Current.closesBlockTypeList(Style))
1346b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
1356b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Previous.is(tok::semi) && State.LineContainsContinuedForLoopSection)
1366b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
13719ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper  if ((startsNextParameter(Current, Style) || Previous.is(tok::semi) ||
1381a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper       (Style.BreakBeforeTernaryOperators &&
1391a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper        (Current.is(tok::question) || (Current.Type == TT_ConditionalExpr &&
1401a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper                                       Previous.isNot(tok::question)))) ||
1411a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper       (!Style.BreakBeforeTernaryOperators &&
1421a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper        (Previous.is(tok::question) || Previous.Type == TT_ConditionalExpr))) &&
1436b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      State.Stack.back().BreakBeforeParameter && !Current.isTrailingComment() &&
1446b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      !Current.isOneOf(tok::r_paren, tok::r_brace))
1456b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
1466b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Style.AlwaysBreakBeforeMultilineStrings &&
1474df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper      State.Column > State.Stack.back().Indent && // Breaking saves columns.
148a7856d021a1f318f9319c0a3028f0d76e38b6ca1Daniel Jasper      !Previous.isOneOf(tok::kw_return, tok::lessless, tok::at) &&
149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Previous.Type != TT_InlineASMColon &&
150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Previous.Type != TT_ConditionalExpr && nextIsMultilineString(State))
1516b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
1523c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper  if (((Previous.Type == TT_DictLiteral && Previous.is(tok::l_brace)) ||
153a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper       Previous.Type == TT_ArrayInitializerLSquare) &&
1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Style.ColumnLimit > 0 &&
155a53bbae476f8f20d18250effb4cc3f110c9b8030Daniel Jasper      getLengthToMatchingParen(Previous) + State.Column > getColumnLimit(State))
156a53bbae476f8f20d18250effb4cc3f110c9b8030Daniel Jasper    return true;
157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Current.Type == TT_CtorInitializerColon &&
1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ((Style.AllowShortFunctionsOnASingleLine != FormatStyle::SFS_All) ||
159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       Style.BreakConstructorInitializersBeforeComma || Style.ColumnLimit != 0))
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return true;
1616b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
162651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (State.Column < getNewLineColumn(State))
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
1646b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (!Style.BreakBeforeBinaryOperators) {
1656b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // If we need to break somewhere inside the LHS of a binary expression, we
1666b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // should also break after the operator. Otherwise, the formatting would
1676b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // hide the operator precedence, e.g. in:
1686b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    //   if (aaaaaaaaaaaaaa ==
1696b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    //           bbbbbbbbbbbbbb && c) {..
1706b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // For comparisons, we only apply this rule, if the LHS is a binary
1716b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // expression itself as otherwise, the line breaks seem superfluous.
1726b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // We need special cases for ">>" which we have split into two ">" while
1736b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // lexing in order to make template parsing easier.
1746b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    //
1756b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // FIXME: We'll need something similar for styles that break before binary
1766b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // operators.
1776b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    bool IsComparison = (Previous.getPrecedence() == prec::Relational ||
1786b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                         Previous.getPrecedence() == prec::Equality) &&
1796b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                        Previous.Previous &&
1806b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                        Previous.Previous->Type != TT_BinaryOperator; // For >>.
1816b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    bool LHSIsBinaryExpr =
182db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper        Previous.Previous && Previous.Previous->EndsBinaryExpression;
1836b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (Previous.Type == TT_BinaryOperator &&
1846b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        (!IsComparison || LHSIsBinaryExpr) &&
1856b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        Current.Type != TT_BinaryOperator && // For >>.
1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        !Current.isTrailingComment() && !Previous.is(tok::lessless) &&
1876b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        Previous.getPrecedence() != prec::Assignment &&
1886b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        State.Stack.back().BreakBeforeParameter)
1896b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      return true;
1906b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
1916b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
1926b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // Same as above, but for the first "<<" operator.
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Current.is(tok::lessless) && Current.Type != TT_OverloadedOperator &&
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack.back().BreakBeforeParameter &&
1956b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      State.Stack.back().FirstLessLess == 0)
1966b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
1976b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Current.Type == TT_SelectorName &&
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack.back().ObjCSelectorNameFound &&
2006b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      State.Stack.back().BreakBeforeParameter)
2016b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
2026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Previous.ClosesTemplateDeclaration && Current.NestingLevel == 0 &&
203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      !Current.isTrailingComment())
2046b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
2056b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // If the return type spans multiple lines, wrap before the function name.
207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if ((Current.Type == TT_FunctionDeclarationName ||
208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines       Current.is(tok::kw_operator)) &&
209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      State.Stack.back().BreakBeforeParameter)
2106b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return true;
211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
212d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper  if (startsSegmentOfBuilderTypeCall(Current) &&
213eb331832830c51322a225a3de480189c7d6d7503Daniel Jasper      (State.Stack.back().CallContinuation != 0 ||
214eb331832830c51322a225a3de480189c7d6d7503Daniel Jasper       (State.Stack.back().BreakBeforeParameter &&
215eb331832830c51322a225a3de480189c7d6d7503Daniel Jasper        State.Stack.back().ContainsUnwrappedBuilder)))
216d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper    return true;
217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // The following could be precomputed as they do not depend on the state.
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // However, as they should take effect only if the UnwrappedLine does not fit
220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // into the ColumnLimit, they are checked here in the ContinuationIndenter.
2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Style.ColumnLimit != 0 && Previous.BlockKind == BK_Block &&
2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Previous.is(tok::l_brace) && !Current.isOneOf(tok::r_brace, tok::comment))
223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return true;
224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2256b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  return false;
2266b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
2276b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
2286b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasperunsigned ContinuationIndenter::addTokenToState(LineState &State, bool Newline,
229d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper                                               bool DryRun,
230d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper                                               unsigned ExtraSpaces) {
2316b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  const FormatToken &Current = *State.NextToken;
2326b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(!State.Stack.empty());
234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if ((Current.Type == TT_ImplicitStringLiteral &&
2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines       (Current.Previous->Tok.getIdentifierInfo() == nullptr ||
2368437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper        Current.Previous->Tok.getIdentifierInfo()->getPPKeywordID() ==
2378437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper            tok::pp_not_keyword))) {
2386b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // FIXME: Is this correct?
2396b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    int WhitespaceLength = SourceMgr.getSpellingColumnNumber(
2406b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                               State.NextToken->WhitespaceRange.getEnd()) -
2416b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                           SourceMgr.getSpellingColumnNumber(
2426b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                               State.NextToken->WhitespaceRange.getBegin());
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    State.Column += WhitespaceLength;
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    moveStateToNextToken(State, DryRun, /*Newline=*/false);
2456b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return 0;
2466b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
2476b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
248e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  unsigned Penalty = 0;
249e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (Newline)
250e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    Penalty = addTokenOnNewLine(State, DryRun);
251e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  else
252e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    addTokenOnCurrentLine(State, DryRun, ExtraSpaces);
253e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
254e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  return moveStateToNextToken(State, DryRun, Newline) + Penalty;
255e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko}
256e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
257e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienkovoid ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
258e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko                                                 unsigned ExtraSpaces) {
259ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  FormatToken &Current = *State.NextToken;
260e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  const FormatToken &Previous = *State.NextToken->Previous;
261e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (Current.is(tok::equal) &&
2626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      (State.Line->First->is(tok::kw_for) || Current.NestingLevel == 0) &&
263e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().VariablePos == 0) {
264e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().VariablePos = State.Column;
265e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // Move over * and & if they are bound to the variable name.
266e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    const FormatToken *Tok = &Previous;
267e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    while (Tok && State.Stack.back().VariablePos >= Tok->ColumnWidth) {
268e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().VariablePos -= Tok->ColumnWidth;
269e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      if (Tok->SpacesRequiredBefore != 0)
270e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko        break;
271e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      Tok = Tok->Previous;
272e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    }
273e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    if (Previous.PartOfMultiVariableDeclStmt)
274e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().LastSpace = State.Stack.back().VariablePos;
275e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  }
276e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
277e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  unsigned Spaces = Current.SpacesRequiredBefore + ExtraSpaces;
278e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
279e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (!DryRun)
280e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    Whitespaces.replaceWhitespace(Current, /*Newlines=*/0, /*IndentLevel=*/0,
281e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko                                  Spaces, State.Column + Spaces);
282e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
283ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Current.Type == TT_SelectorName &&
284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      !State.Stack.back().ObjCSelectorNameFound) {
285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Current.LongestObjCSelectorName == 0)
286651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack.back().AlignColons = false;
287651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else if (State.Stack.back().Indent + Current.LongestObjCSelectorName >
288651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             State.Column + Spaces + Current.ColumnWidth)
289e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().ColonPos =
290e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko          State.Stack.back().Indent + Current.LongestObjCSelectorName;
291e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    else
292e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().ColonPos = State.Column + Spaces + Current.ColumnWidth;
293e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  }
294e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
295e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (Previous.opensScope() && Previous.Type != TT_ObjCMethodExpr &&
296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (Current.Type != TT_LineComment || Previous.BlockKind == BK_BracedInit))
297e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().Indent = State.Column + Spaces;
29819ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper  if (State.Stack.back().AvoidBinPacking && startsNextParameter(Current, Style))
299e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().NoLineBreak = true;
300e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (startsSegmentOfBuilderTypeCall(Current))
301e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().ContainsUnwrappedBuilder = true;
302e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
303e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  State.Column += Spaces;
3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.isNot(tok::comment) && Previous.is(tok::l_paren) &&
3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Previous.Previous && Previous.Previous->isOneOf(tok::kw_if, tok::kw_for))
306e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // Treat the condition inside an if as if it was a second function
307c2827ec708b1611f2b0717bebc423b17a857631eDaniel Jasper    // parameter, i.e. let nested calls have a continuation indent.
3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    State.Stack.back().LastSpace = State.Column;
309ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  else if (!Current.isOneOf(tok::comment, tok::caret) &&
310651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines           (Previous.is(tok::comma) ||
311651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            (Previous.is(tok::colon) && Previous.Type == TT_ObjCMethodExpr)))
312e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().LastSpace = State.Column;
313e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  else if ((Previous.Type == TT_BinaryOperator ||
314e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko            Previous.Type == TT_ConditionalExpr ||
315e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko            Previous.Type == TT_CtorInitializerColon) &&
3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines           ((Previous.getPrecedence() != prec::Assignment &&
3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             (Previous.isNot(tok::lessless) || Previous.OperatorIndex != 0 ||
3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              !Previous.LastOperator)) ||
319e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko            Current.StartsBinaryExpression))
320e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // Always indent relative to the RHS of the expression unless this is a
321e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // simple assignment without binary expression on the RHS. Also indent
322e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // relative to unary operators and the colons of constructor initializers.
323e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().LastSpace = State.Column;
324cea014bd8d280070caeb27e4e6e33e5723b4226fDaniel Jasper  else if (Previous.Type == TT_InheritanceColon) {
325e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().Indent = State.Column;
326cea014bd8d280070caeb27e4e6e33e5723b4226fDaniel Jasper    State.Stack.back().LastSpace = State.Column;
327cea014bd8d280070caeb27e4e6e33e5723b4226fDaniel Jasper  } else if (Previous.opensScope()) {
328e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // If a function has a trailing call, indent all parameters from the
329e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // opening parenthesis. This avoids confusing indents like:
330e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    //   OuterFunction(InnerFunctionCall( // break
331e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    //       ParameterToInnerFunction))   // break
332e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    //       .SecondInnerFunctionCall();
333e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    bool HasTrailingCall = false;
334e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    if (Previous.MatchingParen) {
335e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      const FormatToken *Next = Previous.MatchingParen->getNextNonComment();
336e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      HasTrailingCall = Next && Next->isMemberAccess();
337e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    }
338e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    if (HasTrailingCall &&
339e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko        State.Stack[State.Stack.size() - 2].CallContinuation == 0)
340e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().LastSpace = State.Column;
341e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  }
342e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko}
343e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
344e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienkounsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
345e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko                                                 bool DryRun) {
346ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  FormatToken &Current = *State.NextToken;
347e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  const FormatToken &Previous = *State.NextToken->Previous;
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
349e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  // Extra penalty that needs to be added because of the way certain line
350e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  // breaks are chosen.
351e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  unsigned Penalty = 0;
352e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FormatToken *PreviousNonComment = Current.getPreviousNonComment();
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FormatToken *NextNonComment = Previous.getNextNonComment();
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!NextNonComment)
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    NextNonComment = &Current;
3576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // The first line break on any NestingLevel causes an extra penalty in order
358e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  // prefer similar line breaks.
359e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (!State.Stack.back().ContainsLineBreak)
360e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    Penalty += 15;
361e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  State.Stack.back().ContainsLineBreak = true;
362e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
363e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  Penalty += State.NextToken->SplitPenalty;
364e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
365e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  // Breaking before the first "<<" is generally not desirable if the LHS is
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // short. Also always add the penalty if the LHS is split over mutliple lines
367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // to avoid unnecessary line breaks that just work around this penalty.
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->is(tok::lessless) &&
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack.back().FirstLessLess == 0 &&
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (State.Column <= Style.ColumnLimit / 3 ||
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       State.Stack.back().BreakBeforeParameter))
372e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    Penalty += Style.PenaltyBreakFirstLessLess;
373e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  State.Column = getNewLineColumn(State);
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->isMemberAccess()) {
376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (State.Stack.back().CallContinuation == 0)
377e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().CallContinuation = State.Column;
378ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  } else if (NextNonComment->Type == TT_SelectorName) {
379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!State.Stack.back().ObjCSelectorNameFound) {
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (NextNonComment->LongestObjCSelectorName == 0) {
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        State.Stack.back().AlignColons = false;
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else {
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        State.Stack.back().ColonPos =
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            State.Stack.back().Indent + NextNonComment->LongestObjCSelectorName;
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (State.Stack.back().AlignColons &&
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               State.Stack.back().ColonPos <= NextNonComment->ColumnWidth) {
388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack.back().ColonPos = State.Column + NextNonComment->ColumnWidth;
3896b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    }
390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else if (PreviousNonComment && PreviousNonComment->is(tok::colon) &&
391651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             (PreviousNonComment->Type == TT_ObjCMethodExpr ||
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              PreviousNonComment->Type == TT_DictLiteral)) {
393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // FIXME: This is hacky, find a better way. The problem is that in an ObjC
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // method expression, the block should be aligned to the line starting it,
395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // e.g.:
396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //   [aaaaaaaaaaaaaaa aaaaaaaaa: \\ break for some reason
397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //                        ^(int *i) {
398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //                            // ...
399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    //                        }];
4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // Thus, we set LastSpace of the next higher NestingLevel, to which we move
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // when we consume all of the "}"'s FakeRParens at the "{".
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (State.Stack.size() > 1)
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack[State.Stack.size() - 2].LastSpace =
404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          std::max(State.Stack.back().LastSpace, State.Stack.back().Indent) +
405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          Style.ContinuationIndentWidth;
406e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  }
4076b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
408e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if ((Previous.isOneOf(tok::comma, tok::semi) &&
409e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko       !State.Stack.back().AvoidBinPacking) ||
410e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      Previous.Type == TT_BinaryOperator)
411e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().BreakBeforeParameter = false;
4126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Previous.Type == TT_TemplateCloser && Current.NestingLevel == 0)
413e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().BreakBeforeParameter = false;
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->is(tok::question) ||
4151a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper      (PreviousNonComment && PreviousNonComment->is(tok::question)))
4161a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper    State.Stack.back().BreakBeforeParameter = true;
417e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
418e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (!DryRun) {
419ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    unsigned Newlines = std::max(
420ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        1u, std::min(Current.NewlinesBefore, Style.MaxEmptyLinesToKeep + 1));
421f0fc89c358cdd0717c0e12eb4a90e4a6ce956e98Alexander Kornienko    Whitespaces.replaceWhitespace(Current, Newlines,
422f0fc89c358cdd0717c0e12eb4a90e4a6ce956e98Alexander Kornienko                                  State.Stack.back().IndentLevel, State.Column,
423f0fc89c358cdd0717c0e12eb4a90e4a6ce956e98Alexander Kornienko                                  State.Column, State.Line->InPPDirective);
424e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  }
4256b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
426e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (!Current.isTrailingComment())
427e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().LastSpace = State.Column;
4286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.StartOfLineLevel = Current.NestingLevel;
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.LowestLevelOnLine = Current.NestingLevel;
430e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
431e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  // Any break on this level means that the parent level has been broken
432e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  // and we need to avoid bin packing there.
4336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool JavaScriptFormat = Style.Language == FormatStyle::LK_JavaScript &&
4346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                          Current.is(tok::r_brace) &&
4356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                          State.Stack.size() > 1 &&
4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                          State.Stack[State.Stack.size() - 2].JSFunctionInlined;
4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!JavaScriptFormat) {
4386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (unsigned i = 0, e = State.Stack.size() - 1; i != e; ++i) {
4396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack[i].BreakBeforeParameter = true;
4406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
441e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  }
4426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4438b156e2a040d7a652e821878b68822041f65d71aDaniel Jasper  if (PreviousNonComment &&
4448b156e2a040d7a652e821878b68822041f65d71aDaniel Jasper      !PreviousNonComment->isOneOf(tok::comma, tok::semi) &&
4458b156e2a040d7a652e821878b68822041f65d71aDaniel Jasper      PreviousNonComment->Type != TT_TemplateCloser &&
4468b156e2a040d7a652e821878b68822041f65d71aDaniel Jasper      PreviousNonComment->Type != TT_BinaryOperator &&
4476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Current.Type != TT_BinaryOperator && !PreviousNonComment->opensScope())
448e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().BreakBeforeParameter = true;
449e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
450a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper  // If we break after { or the [ of an array initializer, we should also break
451a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper  // before the corresponding } or ].
452ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (PreviousNonComment &&
453ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      (PreviousNonComment->is(tok::l_brace) ||
454ef8225444452a1486bd721f3285301fe84643b00Stephen Hines       PreviousNonComment->Type == TT_ArrayInitializerLSquare))
455e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    State.Stack.back().BreakBeforeClosingBrace = true;
456e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko
457e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  if (State.Stack.back().AvoidBinPacking) {
458e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    // If we are breaking after '(', '{', '<', this is not bin packing
4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // unless AllowAllParametersOfDeclarationOnNextLine is false or this is a
4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // dict/object literal.
461e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko    if (!(Previous.isOneOf(tok::l_paren, tok::l_brace) ||
462e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko          Previous.Type == TT_BinaryOperator) ||
463e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko        (!Style.AllowAllParametersOfDeclarationOnNextLine &&
4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         State.Line->MustBeDeclaration) ||
4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Previous.Type == TT_DictLiteral)
466e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko      State.Stack.back().BreakBeforeParameter = true;
4676b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
4686b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
469e5321c400c76517f10ee6090556f6d87c150b826Alexander Kornienko  return Penalty;
4706b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
4716b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesunsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!State.NextToken || !State.NextToken->Previous)
474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 0;
475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FormatToken &Current = *State.NextToken;
476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FormatToken &Previous = *State.NextToken->Previous;
477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If we are continuing an expression, we want to use the continuation indent.
478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned ContinuationIndent =
479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::max(State.Stack.back().LastSpace, State.Stack.back().Indent) +
480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Style.ContinuationIndentWidth;
481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FormatToken *PreviousNonComment = Current.getPreviousNonComment();
482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FormatToken *NextNonComment = Previous.getNextNonComment();
483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!NextNonComment)
484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    NextNonComment = &Current;
4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (NextNonComment->is(tok::l_brace) && NextNonComment->BlockKind == BK_Block)
4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return Current.NestingLevel == 0 ? State.FirstIndent
4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                     : State.Stack.back().Indent;
488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Current.isOneOf(tok::r_brace, tok::r_square)) {
4896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (State.Stack.size() > 1 &&
4906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        State.Stack[State.Stack.size() - 2].JSFunctionInlined)
4916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return State.FirstIndent;
492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Current.closesBlockTypeList(Style) ||
493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        (Current.MatchingParen &&
494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         Current.MatchingParen->BlockKind == BK_BracedInit))
495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.Stack[State.Stack.size() - 2].LastSpace;
496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else
497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.FirstIndent;
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
4996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.is(tok::identifier) && Current.Next &&
5006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Current.Next->Type == TT_DictLiteral)
5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return State.Stack.back().Indent;
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->isStringLiteral() && State.StartOfStringLiteral != 0)
503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.StartOfStringLiteral;
504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->is(tok::lessless) &&
505651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      State.Stack.back().FirstLessLess != 0)
506651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.Stack.back().FirstLessLess;
507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->isMemberAccess()) {
508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (State.Stack.back().CallContinuation == 0) {
509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return ContinuationIndent;
510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
511651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.Stack.back().CallContinuation;
512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (State.Stack.back().QuestionColumn != 0 &&
5156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ((NextNonComment->is(tok::colon) &&
5166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        NextNonComment->Type == TT_ConditionalExpr) ||
517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       Previous.Type == TT_ConditionalExpr))
518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.Stack.back().QuestionColumn;
519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Previous.is(tok::comma) && State.Stack.back().VariablePos != 0)
520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.Stack.back().VariablePos;
521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if ((PreviousNonComment && (PreviousNonComment->ClosesTemplateDeclaration ||
522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              PreviousNonComment->Type == TT_AttributeParen)) ||
523ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      (!Style.IndentWrappedFunctionNames &&
524ef8225444452a1486bd721f3285301fe84643b00Stephen Hines       (NextNonComment->is(tok::kw_operator) ||
525ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        NextNonComment->Type == TT_FunctionDeclarationName)))
526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return std::max(State.Stack.back().LastSpace, State.Stack.back().Indent);
527ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (NextNonComment->Type == TT_SelectorName) {
528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!State.Stack.back().ObjCSelectorNameFound) {
529651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (NextNonComment->LongestObjCSelectorName == 0) {
530651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return State.Stack.back().Indent;
531651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else {
532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return State.Stack.back().Indent +
533651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               NextNonComment->LongestObjCSelectorName -
534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               NextNonComment->ColumnWidth;
535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (!State.Stack.back().AlignColons) {
537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.Stack.back().Indent;
538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (State.Stack.back().ColonPos > NextNonComment->ColumnWidth) {
539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.Stack.back().ColonPos - NextNonComment->ColumnWidth;
540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.Stack.back().Indent;
542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->Type == TT_ArraySubscriptLSquare) {
545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (State.Stack.back().StartOfArraySubscripts != 0)
546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return State.Stack.back().StartOfArraySubscripts;
547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else
548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return ContinuationIndent;
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->Type == TT_StartOfName ||
551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Previous.isOneOf(tok::coloncolon, tok::equal)) {
552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return ContinuationIndent;
553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (PreviousNonComment && PreviousNonComment->is(tok::colon) &&
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (PreviousNonComment->Type == TT_ObjCMethodExpr ||
556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       PreviousNonComment->Type == TT_DictLiteral))
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return ContinuationIndent;
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->Type == TT_CtorInitializerColon)
559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.FirstIndent + Style.ConstructorInitializerIndentWidth;
560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NextNonComment->Type == TT_CtorInitializerComma)
561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.Stack.back().Indent;
562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (State.Stack.back().Indent == State.FirstIndent && PreviousNonComment &&
563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      PreviousNonComment->isNot(tok::r_brace))
564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Ensure that we fall back to the continuation indent width instead of
565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // just flushing continuations left.
566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return State.Stack.back().Indent + Style.ContinuationIndentWidth;
567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return State.Stack.back().Indent;
568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5706b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasperunsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
5716b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                                    bool DryRun, bool Newline) {
5726b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  assert(State.Stack.size());
5736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FormatToken &Current = *State.NextToken;
5746b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
5756b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Current.Type == TT_InheritanceColon)
5766b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().AvoidBinPacking = true;
5776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.is(tok::lessless) && Current.Type != TT_OverloadedOperator) {
5786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (State.Stack.back().FirstLessLess == 0)
5796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack.back().FirstLessLess = State.Column;
5806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    else
5816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack.back().LastOperatorWrapped = Newline;
5826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
5836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if ((Current.Type == TT_BinaryOperator && Current.isNot(tok::lessless)) ||
5846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Current.Type == TT_ConditionalExpr)
5856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    State.Stack.back().LastOperatorWrapped = Newline;
586a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper  if (Current.Type == TT_ArraySubscriptLSquare &&
5876b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      State.Stack.back().StartOfArraySubscripts == 0)
5886b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().StartOfArraySubscripts = State.Column;
5891a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper  if ((Current.is(tok::question) && Style.BreakBeforeTernaryOperators) ||
5901a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper      (Current.getPreviousNonComment() && Current.isNot(tok::colon) &&
5911a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper       Current.getPreviousNonComment()->is(tok::question) &&
5921a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper       !Style.BreakBeforeTernaryOperators))
5936b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().QuestionColumn = State.Column;
5946b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (!Current.opensScope() && !Current.closesScope())
5956b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.LowestLevelOnLine =
5966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        std::min(State.LowestLevelOnLine, Current.NestingLevel);
597d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper  if (Current.isMemberAccess())
5986b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().StartOfFunctionCall =
5996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Current.LastOperator ? 0 : State.Column + Current.ColumnWidth;
600ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Current.Type == TT_SelectorName)
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    State.Stack.back().ObjCSelectorNameFound = true;
6026b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Current.Type == TT_CtorInitializerColon) {
6036b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // Indent 2 from the column, so:
6046b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // SomeClass::SomeClass()
6056b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    //     : First(...), ...
6066b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    //       Next(...)
6076b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    //       ^ line up here.
6086b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().Indent =
6096b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        State.Column + (Style.BreakConstructorInitializersBeforeComma ? 0 : 2);
6106b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (Style.ConstructorInitializerAllOnOneLineOrOnePerLine)
6116b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      State.Stack.back().AvoidBinPacking = true;
6126b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().BreakBeforeParameter = false;
6136b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
6146b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
6156b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // In ObjC method declaration we align on the ":" of parameters, but we need
616c2827ec708b1611f2b0717bebc423b17a857631eDaniel Jasper  // to ensure that we indent parameters on subsequent lines by at least our
617c2827ec708b1611f2b0717bebc423b17a857631eDaniel Jasper  // continuation indent width.
6186b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Current.Type == TT_ObjCMethodSpecifier)
619c2827ec708b1611f2b0717bebc423b17a857631eDaniel Jasper    State.Stack.back().Indent += Style.ContinuationIndentWidth;
6206b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
6216b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // Insert scopes created by fake parenthesis.
6226b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  const FormatToken *Previous = Current.getPreviousNonComment();
6236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // Add special behavior to support a format commonly used for JavaScript
6256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // closures:
6266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   SomeFunction(function() {
6276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //     foo();
6286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //     bar();
6296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   }, a, b, c);
6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Style.Language == FormatStyle::LK_JavaScript) {
6316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Current.isNot(tok::comment) && Previous && Previous->is(tok::l_brace) &&
6326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        State.Stack.size() > 1) {
6336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (State.Stack[State.Stack.size() - 2].JSFunctionInlined && Newline) {
6346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        for (unsigned i = 0, e = State.Stack.size() - 1; i != e; ++i) {
6356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          State.Stack[i].NoLineBreak = true;
6366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        }
6376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
6386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack[State.Stack.size() - 2].JSFunctionInlined = false;
6396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
6406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Current.TokenText == "function")
6416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack.back().JSFunctionInlined = !Newline;
6426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
6436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  moveStatePastFakeLParens(State, Newline);
6456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  moveStatePastScopeOpener(State, Newline);
6466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  moveStatePastScopeCloser(State);
6476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  moveStatePastFakeRParens(State);
6486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.isStringLiteral() && State.StartOfStringLiteral == 0) {
6506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    State.StartOfStringLiteral = State.Column;
6516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  } else if (!Current.isOneOf(tok::comment, tok::identifier, tok::hash) &&
6526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             !Current.isStringLiteral()) {
6536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    State.StartOfStringLiteral = 0;
6546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
6556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.Column += Current.ColumnWidth;
6576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.NextToken = State.NextToken->Next;
6586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  unsigned Penalty = breakProtrudingToken(Current, State, DryRun);
6596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (State.Column > getColumnLimit(State)) {
6606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    unsigned ExcessCharacters = State.Column - getColumnLimit(State);
6616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Penalty += Style.PenaltyExcessCharacter * ExcessCharacters;
6626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
6636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.Role)
6656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Current.Role->formatFromToken(State, this, DryRun);
6666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // If the previous has a special role, let it consume tokens as appropriate.
6676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // It is necessary to start at the previous token for the only implemented
6686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // role (comma separated list). That way, the decision whether or not to break
6696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // after the "{" is already done and both options are tried and evaluated.
6706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: This is ugly, find a better way.
6716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Previous && Previous->Role)
6726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Penalty += Previous->Role->formatAfterToken(State, this, DryRun);
6736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return Penalty;
6756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
6766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ContinuationIndenter::moveStatePastFakeLParens(LineState &State,
6786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                    bool Newline) {
6796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FormatToken &Current = *State.NextToken;
6806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FormatToken *Previous = Current.getPreviousNonComment();
6816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6826b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // Don't add extra indentation for the first fake parenthesis after
6836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // 'return', assignments or opening <({[. The indentation for these cases
6846b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // is special cased.
6856b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  bool SkipFirstExtraIndent =
686f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper      (Previous && (Previous->opensScope() || Previous->is(tok::kw_return) ||
687966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper                    Previous->getPrecedence() == prec::Assignment ||
688966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper                    Previous->Type == TT_ObjCMethodExpr));
6896b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  for (SmallVectorImpl<prec::Level>::const_reverse_iterator
6906b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper           I = Current.FakeLParens.rbegin(),
6916b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper           E = Current.FakeLParens.rend();
6926b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper       I != E; ++I) {
6936b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    ParenState NewParenState = State.Stack.back();
6946b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    NewParenState.ContainsLineBreak = false;
695f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper
696f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper    // Indent from 'LastSpace' unless this the fake parentheses encapsulating a
697f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper    // builder type call after 'return'. If such a call is line-wrapped, we
698f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper    // commonly just want to indent from the start of the line.
699f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper    if (!Previous || Previous->isNot(tok::kw_return) || *I > 0)
700f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper      NewParenState.Indent =
701f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper          std::max(std::max(State.Column, NewParenState.Indent),
702f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper                   State.Stack.back().LastSpace);
703f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper
704651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Don't allow the RHS of an operator to be split over multiple lines unless
705651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // there is a line-break right after the operator.
706651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Exclude relational operators, as there, it is always more desirable to
707651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // have the LHS 'left' of the RHS.
7086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Previous && Previous->getPrecedence() > prec::Assignment &&
7096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        (Previous->Type == TT_BinaryOperator ||
7106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         Previous->Type == TT_ConditionalExpr) &&
7116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Previous->getPrecedence() != prec::Relational) {
7126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      bool BreakBeforeOperator = Previous->is(tok::lessless) ||
7136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                 (Previous->Type == TT_BinaryOperator &&
7146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                  Style.BreakBeforeBinaryOperators) ||
7156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                 (Previous->Type == TT_ConditionalExpr &&
7166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                  Style.BreakBeforeTernaryOperators);
7176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if ((!Newline && !BreakBeforeOperator) ||
7186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          (!State.Stack.back().LastOperatorWrapped && BreakBeforeOperator))
7196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        NewParenState.NoLineBreak = true;
7206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
722567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    // Do not indent relative to the fake parentheses inserted for "." or "->".
723567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    // This is a special case to make the following to statements consistent:
724567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    //   OuterFunction(InnerFunctionCall( // break
725567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    //       ParameterToInnerFunction));
726567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    //   OuterFunction(SomeObject.InnerFunctionCall( // break
727567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    //       ParameterToInnerFunction));
728567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    if (*I > prec::Unknown)
729567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper      NewParenState.LastSpace = std::max(NewParenState.LastSpace, State.Column);
730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    NewParenState.StartOfFunctionCall = State.Column;
7316b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
7326b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // Always indent conditional expressions. Never indent expression where
7336b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // the 'operator' is ',', ';' or an assignment (i.e. *I <=
7346b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // prec::Assignment) as those have different indentation rules. Indent
7356b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // other expression, unless the indentation needs to be skipped.
7366b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (*I == prec::Conditional ||
7376b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        (!SkipFirstExtraIndent && *I > prec::Assignment &&
7386b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper         !Style.BreakBeforeBinaryOperators))
739c2827ec708b1611f2b0717bebc423b17a857631eDaniel Jasper      NewParenState.Indent += Style.ContinuationIndentWidth;
740a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper    if ((Previous && !Previous->opensScope()) || *I > prec::Comma)
7416b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      NewParenState.BreakBeforeParameter = false;
7426b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.push_back(NewParenState);
7436b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    SkipFirstExtraIndent = false;
7446b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
7456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7466b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
747ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Remove the fake r_parens after 'Tok'.
748ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic void consumeRParens(LineState& State, const FormatToken &Tok) {
749ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (unsigned i = 0, e = Tok.FakeRParens; i != e; ++i) {
750ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    unsigned VariablePos = State.Stack.back().VariablePos;
751ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    assert(State.Stack.size() > 1);
752ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (State.Stack.size() == 1) {
753ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      // Do not pop the last element.
754ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      break;
7556b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    }
756ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    State.Stack.pop_back();
757ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    State.Stack.back().VariablePos = VariablePos;
7586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
7596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7606b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
761ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Returns whether 'Tok' opens or closes a scope requiring special handling
762ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// of the subsequent fake r_parens.
763ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//
764ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// For example, if this is an l_brace starting a nested block, we pretend (wrt.
765ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// to indentation) that we already consumed the corresponding r_brace. Thus, we
766ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// remove all ParenStates caused by fake parentheses that end at the r_brace.
767ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// The net effect of this is that we don't indent relative to the l_brace, if
768ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// the nested block is the last parameter of a function. This formats:
769ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//
770ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//   SomeFunction(a, [] {
771ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//     f();  // break
772ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//   });
773ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//
774ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// instead of:
775ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//   SomeFunction(a, [] {
776ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//                     f();  // break
777ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//                   });
778ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic bool fakeRParenSpecialCase(const LineState &State) {
779ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const FormatToken &Tok = *State.NextToken;
780ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (!Tok.MatchingParen)
781ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return false;
782ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const FormatToken *Left = &Tok;
783ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Tok.isOneOf(tok::r_brace, tok::r_square))
784ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Left = Tok.MatchingParen;
785ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return !State.Stack.back().HasMultipleNestedBlocks &&
786ef8225444452a1486bd721f3285301fe84643b00Stephen Hines         Left->isOneOf(tok::l_brace, tok::l_square) &&
787ef8225444452a1486bd721f3285301fe84643b00Stephen Hines         (Left->BlockKind == BK_Block ||
788ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          Left->Type == TT_ArrayInitializerLSquare ||
789ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          Left->Type == TT_DictLiteral);
790ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
791ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
792ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid ContinuationIndenter::moveStatePastFakeRParens(LineState &State) {
793ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Don't remove FakeRParens attached to r_braces that surround nested blocks
794ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // as they will have been removed early (see above).
795ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (fakeRParenSpecialCase(State))
796ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return;
797ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
798ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  consumeRParens(State, *State.NextToken);
799ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
800ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
8016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ContinuationIndenter::moveStatePastScopeOpener(LineState &State,
8026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                    bool Newline) {
8036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FormatToken &Current = *State.NextToken;
8046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Current.opensScope())
8056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
8066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.MatchingParen && Current.BlockKind == BK_Block) {
8086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    moveStateToNewBlock(State);
8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
8106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
8116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  unsigned NewIndent;
8136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  unsigned NewIndentLevel = State.Stack.back().IndentLevel;
8146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool AvoidBinPacking;
8156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool BreakBeforeParameter = false;
8166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Current.is(tok::l_brace) || Current.Type == TT_ArrayInitializerLSquare) {
817ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (fakeRParenSpecialCase(State))
818ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      consumeRParens(State, *Current.MatchingParen);
819ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
8206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NewIndent = State.Stack.back().LastSpace;
8216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Current.opensBlockTypeList(Style)) {
8226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NewIndent += Style.IndentWidth;
8236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NewIndent = std::min(State.Column + 2, NewIndent);
8246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ++NewIndentLevel;
8256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    } else {
8266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NewIndent += Style.ContinuationIndentWidth;
8276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NewIndent = std::min(State.Column + 1, NewIndent);
8286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
8296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    const FormatToken *NextNoComment = Current.getNextNonComment();
8306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    AvoidBinPacking = Current.Type == TT_ArrayInitializerLSquare ||
8316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      Current.Type == TT_DictLiteral ||
8326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      Style.Language == FormatStyle::LK_Proto ||
8336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      !Style.BinPackParameters ||
8346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      (NextNoComment &&
8356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                       NextNoComment->Type == TT_DesignatedInitializerPeriod);
8366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  } else {
8376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NewIndent = Style.ContinuationIndentWidth +
8386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                std::max(State.Stack.back().LastSpace,
8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         State.Stack.back().StartOfFunctionCall);
8406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    AvoidBinPacking = !Style.BinPackParameters ||
8416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      (Style.ExperimentalAutoDetectBinPacking &&
8426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                       (Current.PackingKind == PPK_OnePerLine ||
8436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                        (!BinPackInconclusiveFunctions &&
8446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         Current.PackingKind == PPK_Inconclusive)));
8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // If this '[' opens an ObjC call, determine whether all parameters fit
8466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // into one line and put one per line if they don't.
8476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Current.Type == TT_ObjCMethodExpr && Style.ColumnLimit != 0 &&
8486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        getLengthToMatchingParen(Current) + State.Column >
8496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines            getColumnLimit(State))
8506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      BreakBeforeParameter = true;
8516b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
8526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool NoLineBreak = State.Stack.back().NoLineBreak ||
8536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     (Current.Type == TT_TemplateOpener &&
8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      State.Stack.back().ContainsUnwrappedBuilder);
8556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.Stack.push_back(ParenState(NewIndent, NewIndentLevel,
8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   State.Stack.back().LastSpace,
8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   AvoidBinPacking, NoLineBreak));
8586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.Stack.back().BreakBeforeParameter = BreakBeforeParameter;
859ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  State.Stack.back().HasMultipleNestedBlocks = Current.BlockParameterCount > 1;
8606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ContinuationIndenter::moveStatePastScopeCloser(LineState &State) {
8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const FormatToken &Current = *State.NextToken;
8646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Current.closesScope())
8656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
8666b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
8676b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // If we encounter a closing ), ], } or >, we can remove a level from our
8686b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // stacks.
8697143a21706d951ad53b5167a4dcd750f5997d208Daniel Jasper  if (State.Stack.size() > 1 &&
8707143a21706d951ad53b5167a4dcd750f5997d208Daniel Jasper      (Current.isOneOf(tok::r_paren, tok::r_square) ||
871567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper       (Current.is(tok::r_brace) && State.NextToken != State.Line->First) ||
872ef8225444452a1486bd721f3285301fe84643b00Stephen Hines       State.NextToken->Type == TT_TemplateCloser))
8736b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.pop_back();
874ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
8756b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (Current.is(tok::r_square)) {
8766b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // If this ends the array subscript expr, reset the corresponding value.
8776b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    const FormatToken *NextNonComment = Current.getNextNonComment();
8786b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (NextNonComment && NextNonComment->isNot(tok::l_square))
8796b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      State.Stack.back().StartOfArraySubscripts = 0;
8806b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
8816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
8826b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
8836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid ContinuationIndenter::moveStateToNewBlock(LineState &State) {
8846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // If we have already found more than one lambda introducers on this level, we
8856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // opt out of this because similarity between the lambdas is more important.
886ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (fakeRParenSpecialCase(State))
887ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    consumeRParens(State, *State.NextToken->MatchingParen);
8886b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
8896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // For some reason, ObjC blocks are indented like continuations.
8906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  unsigned NewIndent = State.Stack.back().LastSpace +
8916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                       (State.NextToken->Type == TT_ObjCBlockLBrace
8926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                            ? Style.ContinuationIndentWidth
8936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                            : Style.IndentWidth);
8946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.Stack.push_back(ParenState(
8956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NewIndent, /*NewIndentLevel=*/State.Stack.back().IndentLevel + 1,
8966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack.back().LastSpace, /*AvoidBinPacking=*/true,
8976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      State.Stack.back().NoLineBreak));
8986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  State.Stack.back().BreakBeforeParameter = true;
8996b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
9006b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
9016f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienkounsigned ContinuationIndenter::addMultilineToken(const FormatToken &Current,
9026f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienko                                                 LineState &State) {
903dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko  // Break before further function parameters on all levels.
904dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko  for (unsigned i = 0, e = State.Stack.size(); i != e; ++i)
905dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko    State.Stack[i].BreakBeforeParameter = true;
906dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko
90783a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko  unsigned ColumnsUsed = State.Column;
9084b762a91faac0473fa380ea9731992b24867e2e6Alexander Kornienko  // We can only affect layout of the first and the last line, so the penalty
9094b762a91faac0473fa380ea9731992b24867e2e6Alexander Kornienko  // for all other lines is constant, and we ignore it.
9100b62cc30c9aa462184de0435dc083d944a41d67fAlexander Kornienko  State.Column = Current.LastLineColumnWidth;
9114b762a91faac0473fa380ea9731992b24867e2e6Alexander Kornienko
912567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  if (ColumnsUsed > getColumnLimit(State))
913567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    return Style.PenaltyExcessCharacter * (ColumnsUsed - getColumnLimit(State));
914dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko  return 0;
915dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko}
916dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko
9176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool getRawStringLiteralPrefixPostfix(StringRef Text, StringRef &Prefix,
9182c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko                                             StringRef &Postfix) {
9192c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko  if (Text.startswith(Prefix = "R\"") || Text.startswith(Prefix = "uR\"") ||
9202c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      Text.startswith(Prefix = "UR\"") || Text.startswith(Prefix = "u8R\"") ||
9212c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      Text.startswith(Prefix = "LR\"")) {
9222c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    size_t ParenPos = Text.find('(');
9232c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    if (ParenPos != StringRef::npos) {
9242c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      StringRef Delimiter =
9252c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko          Text.substr(Prefix.size(), ParenPos - Prefix.size());
9262c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      Prefix = Text.substr(0, ParenPos + 1);
9272c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      Postfix = Text.substr(Text.size() - 2 - Delimiter.size());
9282c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      return Postfix.front() == ')' && Postfix.back() == '"' &&
9292c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko             Postfix.substr(1).startswith(Delimiter);
9302c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    }
9312c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko  }
9322c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko  return false;
9332c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko}
9342c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko
9356b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasperunsigned ContinuationIndenter::breakProtrudingToken(const FormatToken &Current,
9366b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                                    LineState &State,
9376b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                                                    bool DryRun) {
9386f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienko  // Don't break multi-line tokens other than block comments. Instead, just
9396f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienko  // update the state.
9406f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienko  if (Current.Type != TT_BlockComment && Current.IsMultiline)
9416f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienko    return addMultilineToken(Current, State);
9426f6154c5f5976e3e57f34f6a755bdfa95b7ff745Alexander Kornienko
9438437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper  // Don't break implicit string literals.
9448437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper  if (Current.Type == TT_ImplicitStringLiteral)
9458437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper    return 0;
9468437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper
947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!Current.isStringLiteral() && !Current.is(tok::comment))
948ed51c02f4c87ddb2d2f45193e4041921ac363f76Daniel Jasper    return 0;
949ed51c02f4c87ddb2d2f45193e4041921ac363f76Daniel Jasper
950651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<BreakableToken> Token;
95183a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko  unsigned StartColumn = State.Column - Current.ColumnWidth;
9525486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko  unsigned ColumnLimit = getColumnLimit(State);
9536b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
954651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Current.isStringLiteral()) {
955b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko    // Don't break string literals inside preprocessor directives (except for
956b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko    // #define directives, as their contents are stored in separate lines and
957b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko    // are not affected by this check).
958b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko    // This way we avoid breaking code with line directives and unknown
959b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko    // preprocessor directives that contain long string literals.
960b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko    if (State.Line->Type == LT_PreprocessorDirective)
961b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko      return 0;
9626b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // Exempts unterminated string literals from line breaking. The user will
9636b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // likely want to terminate the string before any line breaking is done.
9646b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (Current.IsUnterminatedLiteral)
9656b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      return 0;
9666b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
9672c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    StringRef Text = Current.TokenText;
9682c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    StringRef Prefix;
9692c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    StringRef Postfix;
970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool IsNSStringLiteral = false;
9712c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    // FIXME: Handle whitespace between '_T', '(', '"..."', and ')'.
9722c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    // FIXME: Store Prefix and Suffix (or PrefixLength and SuffixLength to
9732c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    // reduce the overhead) for each FormatToken, which is a string, so that we
9742c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    // don't run multiple checks here on the hot path.
975651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Text.startswith("\"") && Current.Previous &&
976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        Current.Previous->is(tok::at)) {
977651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      IsNSStringLiteral = true;
978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Prefix = "@\"";
979651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
9802c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    if ((Text.endswith(Postfix = "\"") &&
981651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         (IsNSStringLiteral || Text.startswith(Prefix = "\"") ||
982651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          Text.startswith(Prefix = "u\"") || Text.startswith(Prefix = "U\"") ||
983651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          Text.startswith(Prefix = "u8\"") ||
9842c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko          Text.startswith(Prefix = "L\""))) ||
9852c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko        (Text.startswith(Prefix = "_T(\"") && Text.endswith(Postfix = "\")")) ||
9862c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko        getRawStringLiteralPrefixPostfix(Text, Prefix, Postfix)) {
9873d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko      Token.reset(new BreakableStringLiteral(
9883d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko          Current, State.Line->Level, StartColumn, Prefix, Postfix,
9893d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko          State.Line->InPPDirective, Encoding, Style));
9902c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    } else {
9912c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko      return 0;
9922c2f729d10cb10324bf2e7871867f7bbc19ad358Alexander Kornienko    }
9936b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  } else if (Current.Type == TT_BlockComment && Current.isTrailingComment()) {
994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (CommentPragmasRegex.match(Current.TokenText.substr(2)))
995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return 0;
9966b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    Token.reset(new BreakableBlockComment(
9973d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko        Current, State.Line->Level, StartColumn, Current.OriginalColumn,
9983d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko        !Current.Previous, State.Line->InPPDirective, Encoding, Style));
9996b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  } else if (Current.Type == TT_LineComment &&
10006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             (Current.Previous == nullptr ||
10016b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper              Current.Previous->Type != TT_ImplicitStringLiteral)) {
1002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (CommentPragmasRegex.match(Current.TokenText.substr(2)))
1003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return 0;
10043d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko    Token.reset(new BreakableLineComment(Current, State.Line->Level,
10055486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko                                         StartColumn, /*InPPDirective=*/false,
10063d9ffcf3aa0ed84fa297e3c461bb84e48221aa2dAlexander Kornienko                                         Encoding, Style));
10075486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko    // We don't insert backslashes when breaking line comments.
10085486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko    ColumnLimit = Style.ColumnLimit;
10096b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  } else {
10106b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return 0;
10116b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
10125486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko  if (Current.UnbreakableTailLength >= ColumnLimit)
10136b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    return 0;
10146b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
10155486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko  unsigned RemainingSpace = ColumnLimit - Current.UnbreakableTailLength;
10166b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  bool BreakInserted = false;
10176b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  unsigned Penalty = 0;
10186b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  unsigned RemainingTokenColumns = 0;
10196b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  for (unsigned LineIndex = 0, EndIndex = Token->getLineCount();
10206b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper       LineIndex != EndIndex; ++LineIndex) {
10216b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (!DryRun)
10226b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      Token->replaceWhitespaceBefore(LineIndex, Whitespaces);
10236b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    unsigned TailOffset = 0;
10246b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    RemainingTokenColumns =
10256b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        Token->getLineLengthAfterSplit(LineIndex, TailOffset, StringRef::npos);
10266b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    while (RemainingTokenColumns > RemainingSpace) {
10276b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      BreakableToken::Split Split =
10285486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko          Token->getSplit(LineIndex, TailOffset, ColumnLimit);
10296b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      if (Split.first == StringRef::npos) {
10306b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        // The last line's penalty is handled in addNextStateToQueue().
10316b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        if (LineIndex < EndIndex - 1)
10326b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper          Penalty += Style.PenaltyExcessCharacter *
10336b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper                     (RemainingTokenColumns - RemainingSpace);
10346b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        break;
10356b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      }
10366b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      assert(Split.first != 0);
10376b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      unsigned NewRemainingTokenColumns = Token->getLineLengthAfterSplit(
10386b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper          LineIndex, TailOffset + Split.first + Split.second, StringRef::npos);
1039a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko
1040a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko      // We can remove extra whitespace instead of breaking the line.
1041a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko      if (RemainingTokenColumns + 1 - Split.second <= RemainingSpace) {
1042a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko        RemainingTokenColumns = 0;
1043a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko        if (!DryRun)
1044a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko          Token->replaceWhitespace(LineIndex, TailOffset, Split, Whitespaces);
1045a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko        break;
1046a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko      }
1047a7462b8ce22a3f754bf51eeeb01adafc42b32ceaAlexander Kornienko
10486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // When breaking before a tab character, it may be moved by a few columns,
10496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // but will still be expanded to the next tab stop, so we don't save any
10506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // columns.
10516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (NewRemainingTokenColumns == RemainingTokenColumns)
10526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        break;
10536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
10546b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      assert(NewRemainingTokenColumns < RemainingTokenColumns);
10556b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      if (!DryRun)
10566b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        Token->insertBreak(LineIndex, TailOffset, Split, Whitespaces);
1057f54617858a0df936746b7f521a8ffb032289d02fDaniel Jasper      Penalty += Current.SplitPenalty;
10586b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      unsigned ColumnsUsed =
10596b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper          Token->getLineLengthAfterSplit(LineIndex, TailOffset, Split.first);
10605486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko      if (ColumnsUsed > ColumnLimit) {
10615486a421a47a8922337aa83ac3b0fbb098dc1fe4Alexander Kornienko        Penalty += Style.PenaltyExcessCharacter * (ColumnsUsed - ColumnLimit);
10626b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      }
10636b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      TailOffset += Split.first + Split.second;
10646b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      RemainingTokenColumns = NewRemainingTokenColumns;
10656b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      BreakInserted = true;
10666b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    }
10676b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
10686b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
10696b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  State.Column = RemainingTokenColumns;
10706b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
10716b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  if (BreakInserted) {
10726b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // If we break the token inside a parameter list, we need to break before
10736b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // the next parameter on all levels, so that the next parameter is clearly
10746b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    // visible. Line comments already introduce a break.
10756b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    if (Current.Type != TT_LineComment) {
10766b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper      for (unsigned i = 0, e = State.Stack.size(); i != e; ++i)
10776b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper        State.Stack[i].BreakBeforeParameter = true;
10786b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    }
10796b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
1080651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Penalty += Current.isStringLiteral() ? Style.PenaltyBreakString
1081651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         : Style.PenaltyBreakComment;
1082f54617858a0df936746b7f521a8ffb032289d02fDaniel Jasper
10836b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper    State.Stack.back().LastSpace = StartColumn;
10846b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  }
10856b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  return Penalty;
10866b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
10876b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
1088567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasperunsigned ContinuationIndenter::getColumnLimit(const LineState &State) const {
10896b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper  // In preprocessor directives reserve two chars for trailing " \"
1090567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  return Style.ColumnLimit - (State.Line->InPPDirective ? 2 : 0);
10916b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper}
10926b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper
1093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool ContinuationIndenter::nextIsMultilineString(const LineState &State) {
10944df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper  const FormatToken &Current = *State.NextToken;
10956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Current.isStringLiteral() || Current.Type == TT_ImplicitStringLiteral)
10964df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper    return false;
1097dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko  // We never consider raw string literals "multiline" for the purpose of
1098651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // AlwaysBreakBeforeMultilineStrings implementation as they are special-cased
1099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // (see TokenAnnotator::mustBreakBefore().
1100dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko  if (Current.TokenText.startswith("R\""))
1101dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko    return false;
110283a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko  if (Current.IsMultiline)
1103dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko    return true;
11044df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper  if (Current.getNextNonComment() &&
1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Current.getNextNonComment()->isStringLiteral())
11064df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper    return true; // Implicit concatenation.
110783a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko  if (State.Column + Current.ColumnWidth + Current.UnbreakableTailLength >
11084df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper      Style.ColumnLimit)
11094df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper    return true; // String will be split.
1110dcc0c5bb7ce9a731ecbc0b8e8477979cd9e730c0Alexander Kornienko  return false;
11114df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper}
11124df1ff96262b8bde75c6801ef42659f352aa2422Daniel Jasper
11136b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper} // namespace format
11146b2afe445b3cfba4b8ae898f85f3540211bd65f8Daniel Jasper} // namespace clang
1115