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