132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper//===--- TokenAnnotator.cpp - Format C++ code -----------------------------===// 232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper// 332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper// The LLVM Compiler Infrastructure 432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper// 532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper// This file is distributed under the University of Illinois Open Source 632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper// License. See LICENSE.TXT for details. 732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper// 832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper//===----------------------------------------------------------------------===// 932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// 1032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// \file 1132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// \brief This file implements a token annotator, i.e. creates 1232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// \c AnnotatedTokens out of \c FormatTokens with required extra information. 1332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// 1432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper//===----------------------------------------------------------------------===// 1532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper#include "TokenAnnotator.h" 1732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper#include "clang/Basic/SourceManager.h" 18bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper#include "llvm/Support/Debug.h" 1932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEBUG_TYPE "format-token-annotator" 216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jaspernamespace clang { 2332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jaspernamespace format { 2432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 2514e66498781b7d81639bdc48716e09700552ac21Craig Toppernamespace { 2614e66498781b7d81639bdc48716e09700552ac21Craig Topper 2732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// \brief A parser that gathers additional information about tokens. 2832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// 293fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko/// The \c TokenAnnotator tries to match parenthesis and square brakets and 3032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// store a parenthesis levels. It also tries to resolve matching "<" and ">" 3132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// into template parameter lists. 3232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasperclass AnnotatingParser { 3332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasperpublic: 34d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper AnnotatingParser(const FormatStyle &Style, AnnotatedLine &Line, 35d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper IdentifierInfo &Ident_in) 36d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper : Style(Style), Line(Line), CurrentToken(Line.First), 3759875ac81b97de87ac6c4c7cb256ab71b75114f2Daniel Jasper KeywordVirtualFound(false), AutoFound(false), Ident_in(Ident_in) { 382726877196b41b922f10f794801b313980e1a8adNico Weber Contexts.push_back(Context(tok::unknown, 1, /*IsExpression=*/false)); 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines resetTokenMetadata(CurrentToken); 4032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 4132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 4295e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weberprivate: 4332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseAngle() { 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!CurrentToken) 4532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 46923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator ContextCreator(*this, tok::less, 10); 47b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 484e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().IsExpression = false; 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If there's a template keyword before the opening angle bracket, this is a 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // template parameter, not an argument. 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().InTemplateArgument = 526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left->Previous && Left->Previous->Tok.isNot(tok::kw_template); 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 5532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::greater)) { 5632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->MatchingParen = CurrentToken; 5732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->MatchingParen = Left; 5832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_TemplateCloser; 5932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 6032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 6132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 62e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::r_paren, tok::r_square, tok::r_brace, 635d823e3a00a3e21a0823288e6dee26a93758332bDaniel Jasper tok::question, tok::colon)) 645d823e3a00a3e21a0823288e6dee26a93758332bDaniel Jasper return false; 650348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // If a && or || is found and interpreted as a binary operator, this set 6615f33f03e742fb6567e4789996fa0391a8e18068Daniel Jasper // of angles is likely part of something like "a < b && c > d". If the 670348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // angles are inside an expression, the ||/&& might also be a binary 680348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // operator that was misinterpreted because we are parsing template 690348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // parameters. 700348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // FIXME: This is getting out of hand, write a decent parser. 71b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->Previous->isOneOf(tok::pipepipe, tok::ampamp) && 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ((CurrentToken->Previous->Type == TT_BinaryOperator && 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Toplevel bool expressions do not make lots of sense; 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we're on the top level, it contains only the base context and 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // the context for the current opening angle bracket. 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.size() > 2) || 770348be0c78781c5ddb8c271976812705410c731aDaniel Jasper Contexts[Contexts.size() - 2].IsExpression) && 78b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->isNot(tok::kw_template)) 7932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 809fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper updateParameterCount(Left, CurrentToken); 8132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 8232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 8332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 8432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 8532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 8632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 8732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseParens(bool LookForDecls = false) { 886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!CurrentToken) 8932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 90923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator ContextCreator(*this, tok::l_paren, 1); 914e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 924e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper // FIXME: This is a bit of a hack. Do better. 934e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsForRangeExpr = 944e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.size() == 2 && Contexts[0].ColonIsForRangeExpr; 954e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 9632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool StartsObjCMethodExpr = false; 97b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 9832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::caret)) { 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // (^ can start a block type. 10032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->Type = TT_ObjCBlockLParen; 101b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek } else if (FormatToken *MaybeSel = Left->Previous) { 10232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // @selector( starts a selector. 103b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (MaybeSel->isObjCAtKeyword(tok::objc_selector) && MaybeSel->Previous && 104b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek MaybeSel->Previous->is(tok::at)) { 10532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper StartsObjCMethodExpr = true; 10632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 10732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 10832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left->Previous && 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Left->Previous->isOneOf(tok::kw_static_assert, tok::kw_if, 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines tok::kw_while, tok::l_paren, tok::comma) || 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left->Previous->Type == TT_BinaryOperator)) { 113363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper // static_assert, if and while usually contain expressions. 114b7000ca629da16164f0073f5a7f9459ddf5ba281Daniel Jasper Contexts.back().IsExpression = true; 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (Line.InPPDirective && 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (!Left->Previous || 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Left->Previous->isNot(tok::identifier) && 1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left->Previous->Type != TT_OverloadedOperator))) { 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Contexts.back().IsExpression = true; 120363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper } else if (Left->Previous && Left->Previous->is(tok::r_square) && 121363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper Left->Previous->MatchingParen && 122363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper Left->Previous->MatchingParen->Type == TT_LambdaLSquare) { 123363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper // This is a parameter list of a lambda expression. 124363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper Contexts.back().IsExpression = false; 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Contexts[Contexts.size() - 2].CaretFound) { 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // This is the parameter list of an ObjC block. 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression = false; 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Left->Previous && Left->Previous->is(tok::kw___attribute)) { 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left->Type = TT_AttributeParen; 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Left->Previous && Left->Previous->IsForEachMacro) { 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // The first argument to a foreach macro is a declaration. 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsForEachMacro = true; 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression = false; 134363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper } 135b7000ca629da16164f0073f5a7f9459ddf5ba281Daniel Jasper 1364e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (StartsObjCMethodExpr) { 1374e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsObjCMethodExpr = true; 1384e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Left->Type = TT_ObjCMethodExpr; 1394e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } 14032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 141431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper bool MightBeFunctionType = CurrentToken->is(tok::star); 142c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper bool HasMultipleLines = false; 143c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper bool HasMultipleParametersOnALine = false; 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 14532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // LookForDecls is set when "if (" has been seen. Check for 14632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // 'identifier' '*' 'identifier' followed by not '=' -- this 14732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // '*' has to be a binary operator but determineStarAmpUsage() will 14832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // categorize it as an unary operator, so set the right type here. 149b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (LookForDecls && CurrentToken->Next) { 1500bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *Prev = CurrentToken->getPreviousNonComment(); 1512785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko if (Prev) { 1520bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *PrevPrev = Prev->getPreviousNonComment(); 1532785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko FormatToken *Next = CurrentToken->Next; 1542785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko if (PrevPrev && PrevPrev->is(tok::identifier) && 1552785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko Prev->isOneOf(tok::star, tok::amp, tok::ampamp) && 1562785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko CurrentToken->is(tok::identifier) && Next->isNot(tok::equal)) { 1572785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko Prev->Type = TT_BinaryOperator; 1582785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko LookForDecls = false; 1592785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko } 16032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 16132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 16232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 16353352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper if (CurrentToken->Previous->Type == TT_PointerOrReference && 16453352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper CurrentToken->Previous->Previous->isOneOf(tok::l_paren, 16553352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper tok::coloncolon)) 16653352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper MightBeFunctionType = true; 167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (CurrentToken->Previous->Type == TT_BinaryOperator) 168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Contexts.back().IsExpression = true; 16932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::r_paren)) { 170b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (MightBeFunctionType && CurrentToken->Next && 171e7d3bff31e3ef4fea1e2a5a7cd5441b6b0752e3fDaniel Jasper (CurrentToken->Next->is(tok::l_paren) || 172e7d3bff31e3ef4fea1e2a5a7cd5441b6b0752e3fDaniel Jasper (CurrentToken->Next->is(tok::l_square) && 173e7d3bff31e3ef4fea1e2a5a7cd5441b6b0752e3fDaniel Jasper !Contexts.back().IsExpression))) 174431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper Left->Type = TT_FunctionTypeLParen; 17532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->MatchingParen = CurrentToken; 17632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->MatchingParen = Left; 17732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 17863d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper if (StartsObjCMethodExpr) { 1794e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper CurrentToken->Type = TT_ObjCMethodExpr; 1806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Contexts.back().FirstObjCSelectorName) { 1814e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 1824e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().LongestObjCSelectorName; 18363d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 18463d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 18532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left->Type == TT_AttributeParen) 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Type = TT_AttributeParen; 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 189c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (!HasMultipleLines) 190c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper Left->PackingKind = PPK_Inconclusive; 191c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper else if (HasMultipleParametersOnALine) 192c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper Left->PackingKind = PPK_BinPacked; 193c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper else 194c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper Left->PackingKind = PPK_OnePerLine; 195c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper 19632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 19732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 19832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 199e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::r_square, tok::r_brace)) 20032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (CurrentToken->is(tok::l_brace)) 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left->Type = TT_Unknown; // Not TT_ObjCBlockLParen 203c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (CurrentToken->is(tok::comma) && CurrentToken->Next && 204c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper !CurrentToken->Next->HasUnescapedNewline && 205c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper !CurrentToken->Next->isTrailingComment()) 206c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper HasMultipleParametersOnALine = true; 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CurrentToken->isOneOf(tok::kw_const, tok::kw_auto) || 208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->isSimpleTypeSpecifier()) 209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression = false; 210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines FormatToken *Tok = CurrentToken; 21132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 21232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines updateParameterCount(Left, Tok); 214c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (CurrentToken && CurrentToken->HasUnescapedNewline) 215c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper HasMultipleLines = true; 21632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 21732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 21832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 21932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 22032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseSquare() { 22132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!CurrentToken) 22232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 22332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 224d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko // A '[' could be an index subscript (after an identifier or after 225051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber // ')' or ']'), it could be the start of an Objective-C method 226051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber // expression, or it could the the start of an Objective-C array literal. 227b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 2280bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *Parent = Left->getPreviousNonComment(); 22932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool StartsObjCMethodExpr = 230567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Contexts.back().CanBeExpression && Left->Type != TT_LambdaLSquare && 2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurrentToken->isNot(tok::l_brace) && 232e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko (!Parent || Parent->isOneOf(tok::colon, tok::l_square, tok::l_paren, 233e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::kw_return, tok::kw_throw) || 234ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper Parent->isUnaryOperator() || Parent->Type == TT_ObjCForIn || 235e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Parent->Type == TT_CastRParen || 236b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek getBinOpPrecedence(Parent->Tok.getKind(), true, true) > prec::Unknown); 237923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator ContextCreator(*this, tok::l_square, 10); 2386f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper Contexts.back().IsExpression = true; 2398f54d881723ca7058807eee871913c812618bfdaDaniel Jasper bool ColonFound = false; 24032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 2414e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (StartsObjCMethodExpr) { 2424e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsObjCMethodExpr = true; 2434e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Left->Type = TT_ObjCMethodExpr; 244a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper } else if (Parent && Parent->is(tok::at)) { 245a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Left->Type = TT_ArrayInitializerLSquare; 246a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper } else if (Left->Type == TT_Unknown) { 247a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Left->Type = TT_ArraySubscriptLSquare; 2484e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } 24932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 25132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::r_square)) { 252ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (CurrentToken->Next && CurrentToken->Next->is(tok::l_paren) && 253ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper Left->Type == TT_ObjCMethodExpr) { 254e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // An ObjC method call is rarely followed by an open parenthesis. 25532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // FIXME: Do we incorrectly label ":" with this? 25632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper StartsObjCMethodExpr = false; 25732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->Type = TT_Unknown; 25832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (StartsObjCMethodExpr && CurrentToken->Previous != Left) { 2604e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper CurrentToken->Type = TT_ObjCMethodExpr; 261e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // determineStarAmpUsage() thinks that '*' '[' is allocating an 262e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // array of pointers, but if '[' starts a selector then '*' is a 263e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // binary operator. 2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Parent && Parent->Type == TT_PointerOrReference) 2654ed7f3e003c906d9fdb92a9484feeb8ac6e28e2fNico Weber Parent->Type = TT_BinaryOperator; 2660178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 26732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->MatchingParen = CurrentToken; 26832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->MatchingParen = Left; 2696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Contexts.back().FirstObjCSelectorName) { 2704e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 2714e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().LongestObjCSelectorName; 272ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Left->BlockParameterCount > 1) 273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 0; 274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 27532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 27632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 27732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 278e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::r_paren, tok::r_brace)) 27932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 2808f54d881723ca7058807eee871913c812618bfdaDaniel Jasper if (CurrentToken->is(tok::colon)) 2818f54d881723ca7058807eee871913c812618bfdaDaniel Jasper ColonFound = true; 282a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper if (CurrentToken->is(tok::comma) && 283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Style.Language != FormatStyle::LK_Proto && 2843c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper (Left->Type == TT_ArraySubscriptLSquare || 2858f54d881723ca7058807eee871913c812618bfdaDaniel Jasper (Left->Type == TT_ObjCMethodExpr && !ColonFound))) 286a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Left->Type = TT_ArrayInitializerLSquare; 287ef8225444452a1486bd721f3285301fe84643b00Stephen Hines FormatToken* Tok = CurrentToken; 28832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 28932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 290ef8225444452a1486bd721f3285301fe84643b00Stephen Hines updateParameterCount(Left, Tok); 29132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 29232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 29332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 29432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 29532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseBrace() { 2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentToken) { 297b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Contexts.back().CaretFound) 300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left->Type = TT_ObjCBlockLBrace; 301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().CaretFound = false; 302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 3033c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper ScopedContextCreator ContextCreator(*this, tok::l_brace, 1); 3043c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper Contexts.back().ColonIsDictLiteral = true; 3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left->BlockKind == BK_BracedInit) 3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Contexts.back().IsExpression = true; 307f2ff8126e9e9df368f31b1f968d8fc80f99809b3Nico Weber 3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 30953e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (CurrentToken->is(tok::r_brace)) { 31053e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper Left->MatchingParen = CurrentToken; 31153e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper CurrentToken->MatchingParen = Left; 31253e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper next(); 31353e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper return true; 31453e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper } 31553e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (CurrentToken->isOneOf(tok::r_paren, tok::r_square)) 31653e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper return false; 31753e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper updateParameterCount(Left, CurrentToken); 318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CurrentToken->is(tok::colon) && 319ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Style.Language != FormatStyle::LK_Proto) { 320ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (CurrentToken->getPreviousNonComment()->is(tok::identifier)) 321ef8225444452a1486bd721f3285301fe84643b00Stephen Hines CurrentToken->getPreviousNonComment()->Type = TT_SelectorName; 3223c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper Left->Type = TT_DictLiteral; 323ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 32453e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (!consumeToken()) 32553e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper return false; 32632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 32732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 32832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 32932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 330c4615b7aaf97e303a4fc675956f7f5572d492885Daniel Jasper 331b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek void updateParameterCount(FormatToken *Left, FormatToken *Current) { 332ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Current->Type == TT_LambdaLSquare || 333ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (Current->is(tok::caret) && Current->Type == TT_UnaryOperator) || 334ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (Style.Language == FormatStyle::LK_JavaScript && 335ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Current->TokenText == "function")) { 336ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ++Left->BlockParameterCount; 337ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 338c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (Current->is(tok::comma)) { 3399fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper ++Left->ParameterCount; 340d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper if (!Left->Role) 341d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper Left->Role.reset(new CommaSeparatedList(Style)); 342d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper Left->Role->CommaFound(Current); 343c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper } else if (Left->ParameterCount == 0 && Current->isNot(tok::comment)) { 3449fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper Left->ParameterCount = 1; 345c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper } 3469fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper } 34732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 34832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseConditional() { 3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 35032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::colon)) { 35132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_ConditionalExpr; 35232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 35332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 35432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 35532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 35632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 35732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 35832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 35932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 36032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 36132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseTemplateDeclaration() { 3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentToken && CurrentToken->is(tok::less)) { 36332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_TemplateOpener; 36432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 36532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseAngle()) 36632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 3676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentToken) 368b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek CurrentToken->Previous->ClosesTemplateDeclaration = true; 36932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 37032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 37132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 37232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 37332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 37432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool consumeToken() { 375b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Tok = CurrentToken; 37632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 377b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (Tok->Tok.getKind()) { 37832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::plus: 37932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::minus: 3806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Tok->Previous && Line.MustBeDeclaration) 38132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_ObjCMethodSpecifier; 38232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 38332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::colon: 3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Tok->Previous) 385cf6d76af806f7e1ba97be7b72b31bc78b919e0f0Daniel Jasper return false; 38632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Colons from ?: are handled in parseConditional(). 3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok->Previous->is(tok::r_paren) && Contexts.size() == 1 && 3886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Line.First->isNot(tok::kw_case)) { 38932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_CtorInitializerColon; 3903c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper } else if (Contexts.back().ColonIsDictLiteral) { 3913c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper Tok->Type = TT_DictLiteral; 3924e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } else if (Contexts.back().ColonIsObjCMethodExpr || 393b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->Type == TT_ObjCMethodSpecifier) { 39432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_ObjCMethodExpr; 395ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Tok->Previous->Type = TT_SelectorName; 39683a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko if (Tok->Previous->ColumnWidth > 39700895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko Contexts.back().LongestObjCSelectorName) { 39801fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko Contexts.back().LongestObjCSelectorName = Tok->Previous->ColumnWidth; 39900895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko } 4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Contexts.back().FirstObjCSelectorName) 401b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Contexts.back().FirstObjCSelectorName = Tok->Previous; 4024e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } else if (Contexts.back().ColonIsForRangeExpr) { 40332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_RangeBasedForLoopColon; 4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (CurrentToken && CurrentToken->is(tok::numeric_constant)) { 40501fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko Tok->Type = TT_BitFieldColon; 406ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (Contexts.size() == 1 && 407ef8225444452a1486bd721f3285301fe84643b00Stephen Hines !Line.First->isOneOf(tok::kw_enum, tok::kw_case)) { 4086cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper Tok->Type = TT_InheritanceColon; 409923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper } else if (Contexts.back().ContextKind == tok::l_paren) { 410923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper Tok->Type = TT_InlineASMColon; 41163d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 41232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 41332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_if: 41432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_while: 4156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentToken && CurrentToken->is(tok::l_paren)) { 41632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 4172726877196b41b922f10f794801b313980e1a8adNico Weber if (!parseParens(/*LookForDecls=*/true)) 41832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 41932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 42032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 42132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_for: 4224e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsForRangeExpr = true; 42332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 42432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseParens()) 42532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 42632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 42732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::l_paren: 42832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseParens()) 42932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 43059875ac81b97de87ac6c4c7cb256ab71b75114f2Daniel Jasper if (Line.MustBeDeclaration && Contexts.size() == 1 && 4316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !Contexts.back().IsExpression && 4326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Line.First->Type != TT_ObjCProperty && 4336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (!Tok->Previous || Tok->Previous->isNot(tok::kw_decltype))) 4343c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper Line.MightBeFunctionDecl = true; 43532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 43632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::l_square: 43732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseSquare()) 43832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 43932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 44032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::l_brace: 44132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseBrace()) 44232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 44332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 44432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::less: 4450236dd09c040f2e6124654d620dde94a595c5ab0Daniel Jasper if (Tok->Previous && !Tok->Previous->Tok.isLiteral() && parseAngle()) 44632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_TemplateOpener; 44732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper else { 44832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_BinaryOperator; 44932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken = Tok; 45032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 45132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 45232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 45332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::r_paren: 45432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::r_square: 45532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 45632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::r_brace: 45732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Lines can start with '}'. 4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok->Previous) 45932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 46032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 46132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::greater: 46232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_BinaryOperator; 46332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 46432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_operator: 465174f60f005167984d00682d1d38a2927b9c04684Daniel Jasper while (CurrentToken && 466174f60f005167984d00682d1d38a2927b9c04684Daniel Jasper !CurrentToken->isOneOf(tok::l_paren, tok::semi, tok::r_paren)) { 467e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::star, tok::amp)) 4682b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper CurrentToken->Type = TT_PointerOrReference; 4692b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper consumeToken(); 470174f60f005167984d00682d1d38a2927b9c04684Daniel Jasper if (CurrentToken && CurrentToken->Previous->Type == TT_BinaryOperator) 471c476ea976badd316e3afd0f34afe1f030a710117Daniel Jasper CurrentToken->Previous->Type = TT_OverloadedOperator; 47232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 4736ea933c7e8f6988d5647af4a0eafd393a4c3685aDaniel Jasper if (CurrentToken) { 4742b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper CurrentToken->Type = TT_OverloadedOperatorLParen; 475b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->Previous->Type == TT_BinaryOperator) 476b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek CurrentToken->Previous->Type = TT_OverloadedOperator; 4776ea933c7e8f6988d5647af4a0eafd393a4c3685aDaniel Jasper } 47832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 47932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::question: 48032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseConditional(); 48132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 48232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_template: 48332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseTemplateDeclaration(); 48432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 485c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber case tok::identifier: 486b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->is(tok::kw_for) && 487b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok->Tok.getIdentifierInfo() == &Ident_in) 488c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber Tok->Type = TT_ObjCForIn; 489c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber break; 4908ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::comma: 4918ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper if (Contexts.back().FirstStartOfName) 4928ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true; 493e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper if (Contexts.back().InCtorInitializer) 494e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper Tok->Type = TT_CtorInitializerComma; 495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Contexts.back().IsForEachMacro) 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression = true; 4978ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper break; 49832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper default: 49932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 50032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 50132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 50232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 50332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 50432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void parseIncludeDirective() { 50532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentToken && CurrentToken->is(tok::less)) { 50732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 5086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 509b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->isNot(tok::comment) || CurrentToken->Next) 51032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_ImplicitStringLiteral; 51132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 51232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 51332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } else { 5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 5153a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper if (CurrentToken->is(tok::string_literal)) 5163a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper // Mark these string literals as "implicit" literals, too, so that 5173a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper // they are not split or line-wrapped. 5183a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper CurrentToken->Type = TT_ImplicitStringLiteral; 51932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 52032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 52132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 52232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 52332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 52432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void parseWarningOrError() { 52532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 52632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // We still want to format the whitespace left of the first token of the 52732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // warning or error. 52832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 53032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_ImplicitStringLiteral; 53132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 53232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 53332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 53432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void parsePragma() { 536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines next(); // Consume "pragma". 537651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CurrentToken && CurrentToken->TokenText == "mark") { 538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines next(); // Consume "mark". 539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines next(); // Consume first token (so we fix leading whitespace). 5406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Type = TT_ImplicitStringLiteral; 542651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines next(); 543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 54732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void parsePreprocessorDirective() { 54832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 5496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!CurrentToken) 55032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return; 551b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko if (CurrentToken->Tok.is(tok::numeric_constant)) { 552b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko CurrentToken->SpacesRequiredBefore = 1; 553b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko return; 554b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko } 55532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Hashes in the middle of a line can lead to any strange token 55632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // sequence. 5576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!CurrentToken->Tok.getIdentifierInfo()) 55832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return; 559b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (CurrentToken->Tok.getIdentifierInfo()->getPPKeywordID()) { 56032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_include: 56132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_import: 56232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseIncludeDirective(); 56332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 56432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_error: 56532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_warning: 56632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseWarningOrError(); 56732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case tok::pp_pragma: 569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parsePragma(); 570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 571aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper case tok::pp_if: 572aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper case tok::pp_elif: 573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression = true; 574aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper parseLine(); 575aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper break; 57632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper default: 57732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 57832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 5796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) 5805b7e7b0ec77f49c1b24deffc9b7032ca16ca9f0dDaniel Jasper next(); 58132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 58232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 58395e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weberpublic: 58432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper LineType parseLine() { 58532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::hash)) { 58632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parsePreprocessorDirective(); 58732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_PreprocessorDirective; 58832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Directly allow to 'import <string-literal>' to support protocol buffer 591651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // definitions (code.google.com/p/protobuf) or missing "#" (either way we 592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // should not break the line). 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IdentifierInfo *Info = CurrentToken->Tok.getIdentifierInfo(); 594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Info && Info->getPPKeywordID() == tok::pp_import && 595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Next && CurrentToken->Next->is(tok::string_literal)) 596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines parseIncludeDirective(); 597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 5986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (CurrentToken) { 59932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::kw_virtual)) 60032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper KeywordVirtualFound = true; 60132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 60232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_Invalid; 60332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 60432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (KeywordVirtualFound) 60532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_VirtualFunctionDecl; 60632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 607b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->Type == TT_ObjCMethodSpecifier) { 6086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Contexts.back().FirstObjCSelectorName) 6094e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 6104e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().LongestObjCSelectorName; 61163d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper return LT_ObjCMethodDecl; 61263d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 61363d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper 61432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_Other; 61532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 61632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 61795e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weberprivate: 618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void resetTokenMetadata(FormatToken *Token) { 6196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Token) 6206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return; 621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Reset token type in case we have already looked at it and then 623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // recovered from an error (e.g. failure to find the matching >). 624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CurrentToken->Type != TT_LambdaLSquare && 625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Type != TT_FunctionLBrace && 626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Type != TT_ImplicitStringLiteral && 6276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurrentToken->Type != TT_RegexLiteral && 628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Type != TT_TrailingReturnArrow) 629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->Type = TT_Unknown; 630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (CurrentToken->Role) 6316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CurrentToken->Role.reset(nullptr); 632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->FakeLParens.clear(); 633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->FakeRParens = 0; 634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 63632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void next() { 6376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentToken) { 6380178673f541685cf5067814dfeee2644078e39a9Daniel Jasper determineTokenType(*CurrentToken); 6394e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper CurrentToken->BindingStrength = Contexts.back().BindingStrength; 640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CurrentToken->NestingLevel = Contexts.size() - 1; 641b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek CurrentToken = CurrentToken->Next; 6426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 643d0f349be1422a123fdb28d6dd556f7300e6d51e9Daniel Jasper 644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines resetTokenMetadata(CurrentToken); 64532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 64632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 6474e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// \brief A struct to hold information valid in a specific context, e.g. 6484e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// a pair of parenthesis. 6494e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper struct Context { 650923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper Context(tok::TokenKind ContextKind, unsigned BindingStrength, 651923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper bool IsExpression) 652923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper : ContextKind(ContextKind), BindingStrength(BindingStrength), 653ef8225444452a1486bd721f3285301fe84643b00Stephen Hines LongestObjCSelectorName(0), ColonIsForRangeExpr(false), 654ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ColonIsDictLiteral(false), ColonIsObjCMethodExpr(false), 655ef8225444452a1486bd721f3285301fe84643b00Stephen Hines FirstObjCSelectorName(nullptr), FirstStartOfName(nullptr), 656ef8225444452a1486bd721f3285301fe84643b00Stephen Hines IsExpression(IsExpression), CanBeExpression(true), 657ef8225444452a1486bd721f3285301fe84643b00Stephen Hines InTemplateArgument(false), InCtorInitializer(false), 658ef8225444452a1486bd721f3285301fe84643b00Stephen Hines CaretFound(false), IsForEachMacro(false) {} 659923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper 660923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper tok::TokenKind ContextKind; 6614e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper unsigned BindingStrength; 6624e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper unsigned LongestObjCSelectorName; 6634e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool ColonIsForRangeExpr; 6643c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper bool ColonIsDictLiteral; 6654e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool ColonIsObjCMethodExpr; 666b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *FirstObjCSelectorName; 667b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *FirstStartOfName; 6684e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool IsExpression; 6696f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper bool CanBeExpression; 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InTemplateArgument; 671e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper bool InCtorInitializer; 672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool CaretFound; 673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsForEachMacro; 6744e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper }; 6754e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 6764e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// \brief Puts a new \c Context onto the stack \c Contexts for the lifetime 6774e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// of each instance. 6784e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper struct ScopedContextCreator { 6794e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper AnnotatingParser &P; 6804e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 681923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator(AnnotatingParser &P, tok::TokenKind ContextKind, 682923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper unsigned Increase) 683923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper : P(P) { 6842a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper P.Contexts.push_back(Context(ContextKind, 6852a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper P.Contexts.back().BindingStrength + Increase, 6862a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper P.Contexts.back().IsExpression)); 6874e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } 6884e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 6894e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper ~ScopedContextCreator() { P.Contexts.pop_back(); } 6904e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper }; 6910178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 692b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek void determineTokenType(FormatToken &Current) { 693b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Current.getPrecedence() == prec::Assignment && 69453352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper !Line.First->isOneOf(tok::kw_template, tok::kw_using) && 695b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek (!Current.Previous || Current.Previous->isNot(tok::kw_operator))) { 6964e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().IsExpression = true; 697b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek for (FormatToken *Previous = Current.Previous; 6987e27400c90e9e295bcf5857eebf2d60c4b32106eDaniel Jasper Previous && !Previous->isOneOf(tok::comma, tok::semi); 699b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Previous = Previous->Previous) { 7006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Previous->isOneOf(tok::r_square, tok::r_paren)) 7019c65b069821b7de79427e291b006293a0f55ff8fDaniel Jasper Previous = Previous->MatchingParen; 7020178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (Previous->Type == TT_BinaryOperator && 703e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Previous->isOneOf(tok::star, tok::amp)) { 7040178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Previous->Type = TT_PointerOrReference; 7050178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7060178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 707651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Current.isOneOf(tok::kw_return, tok::kw_throw)) { 7084e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().IsExpression = true; 709651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Current.is(tok::l_paren) && !Line.MustBeDeclaration && 7106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines !Line.InPPDirective && 7116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (!Current.Previous || 7126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Current.Previous->isNot(tok::kw_decltype))) { 713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool ParametersOfFunctionType = 714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current.Previous && Current.Previous->is(tok::r_paren) && 715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current.Previous->MatchingParen && 716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current.Previous->MatchingParen->Type == TT_FunctionTypeLParen; 717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsForOrCatch = Current.Previous && 718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current.Previous->isOneOf(tok::kw_for, tok::kw_catch); 719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression = !ParametersOfFunctionType && !IsForOrCatch; 720e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::r_paren, tok::greater, tok::comma)) { 721b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek for (FormatToken *Previous = Current.Previous; 722e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Previous && Previous->isOneOf(tok::star, tok::amp); 723b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Previous = Previous->Previous) 72495e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weber Previous->Type = TT_PointerOrReference; 725b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek } else if (Current.Previous && 726b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current.Previous->Type == TT_CtorInitializerColon) { 727d0f349be1422a123fdb28d6dd556f7300e6d51e9Daniel Jasper Contexts.back().IsExpression = true; 728e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper Contexts.back().InCtorInitializer = true; 7296f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper } else if (Current.is(tok::kw_new)) { 7306f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper Contexts.back().CanBeExpression = false; 731f9504aa0c3fc7169d137b32d311f6c8102471cb1Daniel Jasper } else if (Current.is(tok::semi) || Current.is(tok::exclaim)) { 73216a69ef481f4580c571b6c693a5d3dd64ea56b53Daniel Jasper // This should be the condition or increment in a for-loop. 73316a69ef481f4580c571b6c693a5d3dd64ea56b53Daniel Jasper Contexts.back().IsExpression = true; 73495e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weber } 7350178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 7360178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (Current.Type == TT_Unknown) { 7376b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper // Line.MightBeFunctionDecl can only be true after the parentheses of a 7386b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper // function declaration have been found. In this case, 'Current' is a 7396b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper // trailing token of this declaration and thus cannot be a name. 7406b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper if (isStartOfName(Current) && !Line.MightBeFunctionDecl) { 7418ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper Contexts.back().FirstStartOfName = &Current; 7423c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper Current.Type = TT_StartOfName; 7432ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper } else if (Current.is(tok::kw_auto)) { 7442ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper AutoFound = true; 7453262f4c10520cf11acea4cf590cfbf055924a41eDaniel Jasper } else if (Current.is(tok::arrow) && AutoFound && 7463262f4c10520cf11acea4cf590cfbf055924a41eDaniel Jasper Line.MustBeDeclaration) { 7472ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper Current.Type = TT_TrailingReturnArrow; 748e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::star, tok::amp, tok::ampamp)) { 7494e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Current.Type = 750d6104f6c34639ebe66f83d955c5f32ea4a50c266Daniel Jasper determineStarAmpUsage(Current, Contexts.back().CanBeExpression && 751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().IsExpression, 752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Contexts.back().InTemplateArgument); 753e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::minus, tok::plus, tok::caret)) { 7540178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = determinePlusMinusCaretUsage(Current); 755ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Current.Type == TT_UnaryOperator && Current.is(tok::caret)) 7566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Contexts.back().CaretFound = true; 757e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::minusminus, tok::plusplus)) { 7580178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = determineIncrementUsage(Current); 7590178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } else if (Current.is(tok::exclaim)) { 7600178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_UnaryOperator; 7616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (Current.is(tok::question)) { 7626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Current.Type = TT_ConditionalExpr; 76331e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek } else if (Current.isBinaryOperator() && 76431e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek (!Current.Previous || 76531e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek Current.Previous->isNot(tok::l_square))) { 7660178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_BinaryOperator; 7670178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } else if (Current.is(tok::comment)) { 76800895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko if (Current.TokenText.startswith("//")) 7690178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_LineComment; 7700178673f541685cf5067814dfeee2644078e39a9Daniel Jasper else 7710178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_BlockComment; 77237d693160eba22343e08d7bcf66cd132ace77e5cNico Weber } else if (Current.is(tok::r_paren)) { 7736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (rParenEndsCast(Current)) 77437d693160eba22343e08d7bcf66cd132ace77e5cNico Weber Current.Type = TT_CastRParen; 775b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek } else if (Current.is(tok::at) && Current.Next) { 776b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (Current.Next->Tok.getObjCKeywordID()) { 7770178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_interface: 7780178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_implementation: 7790178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_protocol: 7800178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_ObjCDecl; 7810178673f541685cf5067814dfeee2644078e39a9Daniel Jasper break; 7820178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_property: 7830178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_ObjCProperty; 7840178673f541685cf5067814dfeee2644078e39a9Daniel Jasper break; 7850178673f541685cf5067814dfeee2644078e39a9Daniel Jasper default: 7860178673f541685cf5067814dfeee2644078e39a9Daniel Jasper break; 7870178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7885ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper } else if (Current.is(tok::period)) { 7890bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *PreviousNoComment = Current.getPreviousNonComment(); 7905ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (PreviousNoComment && 7915ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper PreviousNoComment->isOneOf(tok::comma, tok::l_brace)) 7925ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper Current.Type = TT_DesignatedInitializerPeriod; 793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Current.isOneOf(tok::identifier, tok::kw_const) && 7946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Current.Previous && Current.Previous->isNot(tok::equal) && 795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Line.MightBeFunctionDecl && Contexts.size() == 1) { 796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Line.MightBeFunctionDecl can only be true after the parentheses of a 797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // function declaration have been found. 798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current.Type = TT_TrailingAnnotation; 7990178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 8000178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 8010178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 8020178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 8036ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// \brief Take a guess at whether \p Tok starts a name of a function or 8046ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// variable declaration. 8056ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// 8066ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// This is a heuristic based on whether \p Tok is an identifier following 8076ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// something that is likely a type. 8086ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper bool isStartOfName(const FormatToken &Tok) { 8096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok.isNot(tok::identifier) || !Tok.Previous) 8106ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper return false; 8116ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 8126ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper // Skip "const" as it does not have an influence on whether this is a name. 8136ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper FormatToken *PreviousNotConst = Tok.Previous; 8146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (PreviousNotConst && PreviousNotConst->is(tok::kw_const)) 8156ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper PreviousNotConst = PreviousNotConst->Previous; 8166ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 8176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!PreviousNotConst) 8186ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper return false; 8196ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 8202a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper bool IsPPKeyword = PreviousNotConst->is(tok::identifier) && 8212a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper PreviousNotConst->Previous && 8222a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper PreviousNotConst->Previous->is(tok::hash); 8236ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 82492495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper if (PreviousNotConst->Type == TT_TemplateCloser) 82592495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper return PreviousNotConst && PreviousNotConst->MatchingParen && 82692495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper PreviousNotConst->MatchingParen->Previous && 82792495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper PreviousNotConst->MatchingParen->Previous->isNot(tok::kw_template); 82892495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper 8296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (PreviousNotConst->is(tok::r_paren) && PreviousNotConst->MatchingParen && 8306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PreviousNotConst->MatchingParen->Previous && 8316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PreviousNotConst->MatchingParen->Previous->is(tok::kw_decltype)) 8326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 8336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8346ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper return (!IsPPKeyword && PreviousNotConst->is(tok::identifier)) || 8356ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper PreviousNotConst->Type == TT_PointerOrReference || 836651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PreviousNotConst->isSimpleTypeSpecifier(); 8376ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper } 8386ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /// \brief Determine whether ')' is ending a cast. 8406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool rParenEndsCast(const FormatToken &Tok) { 841ef8225444452a1486bd721f3285301fe84643b00Stephen Hines FormatToken *LeftOfParens = nullptr; 8426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok.MatchingParen) 8436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LeftOfParens = Tok.MatchingParen->getPreviousNonComment(); 8446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool IsCast = false; 8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool ParensAreEmpty = Tok.Previous == Tok.MatchingParen; 8466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool ParensAreType = !Tok.Previous || 8476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Previous->Type == TT_PointerOrReference || 8486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Previous->Type == TT_TemplateCloser || 8496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Previous->isSimpleTypeSpecifier(); 8506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool ParensCouldEndDecl = 8516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Next && Tok.Next->isOneOf(tok::equal, tok::semi, tok::l_brace); 8526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool IsSizeOfOrAlignOf = 8536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LeftOfParens && LeftOfParens->isOneOf(tok::kw_sizeof, tok::kw_alignof); 8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (ParensAreType && !ParensCouldEndDecl && !IsSizeOfOrAlignOf && 8556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ((Contexts.size() > 1 && Contexts[Contexts.size() - 2].IsExpression) || 8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Tok.Next && Tok.Next->isBinaryOperator()))) 8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IsCast = true; 8586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else if (Tok.Next && Tok.Next->isNot(tok::string_literal) && 8596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Tok.Next->Tok.isLiteral() || 8606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Next->isOneOf(tok::kw_sizeof, tok::kw_alignof))) 8616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IsCast = true; 8626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If there is an identifier after the (), it is likely a cast, unless 8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // there is also an identifier before the (). 864ef8225444452a1486bd721f3285301fe84643b00Stephen Hines else if (LeftOfParens && 865ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (LeftOfParens->Tok.getIdentifierInfo() == nullptr || 866ef8225444452a1486bd721f3285301fe84643b00Stephen Hines LeftOfParens->is(tok::kw_return)) && 8676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LeftOfParens->Type != TT_OverloadedOperator && 8686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LeftOfParens->isNot(tok::at) && 8696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LeftOfParens->Type != TT_TemplateCloser && Tok.Next) { 8706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok.Next->isOneOf(tok::identifier, tok::numeric_constant)) { 8716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IsCast = true; 8726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else { 8736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Use heuristics to recognize c style casting. 8746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatToken *Prev = Tok.Previous; 8756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Prev && Prev->isOneOf(tok::amp, tok::star)) 8766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Prev = Prev->Previous; 8776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Prev && Tok.Next && Tok.Next->Next) { 8796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool NextIsUnary = Tok.Next->isUnaryOperator() || 8806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Next->isOneOf(tok::amp, tok::star); 8816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IsCast = NextIsUnary && Tok.Next->Next->isOneOf( 8826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines tok::identifier, tok::numeric_constant); 8836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (; Prev != Tok.MatchingParen; Prev = Prev->Previous) { 8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Prev || !Prev->isOneOf(tok::kw_const, tok::identifier)) { 8876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines IsCast = false; 8886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 8896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return IsCast && !ParensAreEmpty; 8946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 8956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 8960178673f541685cf5067814dfeee2644078e39a9Daniel Jasper /// \brief Return the type of the given token assuming it is * or &. 897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TokenType determineStarAmpUsage(const FormatToken &Tok, bool IsExpression, 898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool InTemplateArgument) { 8990bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *PrevToken = Tok.getPreviousNonComment(); 9006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!PrevToken) 9010178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 9020178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9030bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *NextToken = Tok.getNextNonComment(); 904ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!NextToken || NextToken->is(tok::l_brace)) 9050178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_Unknown; 9060178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 907431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper if (PrevToken->is(tok::coloncolon) || 908431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper (PrevToken->is(tok::l_paren) && !IsExpression)) 9098a5d7cd100ebfb8c6b353ee4ad5b14ab4105d32dDaniel Jasper return TT_PointerOrReference; 9108a5d7cd100ebfb8c6b353ee4ad5b14ab4105d32dDaniel Jasper 911e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (PrevToken->isOneOf(tok::l_paren, tok::l_square, tok::l_brace, 912d3cf17b5f1fed43dbd0cd35c43d15139803c9c84Daniel Jasper tok::comma, tok::semi, tok::kw_return, tok::colon, 91365da8e952da32730202356290bb889c8839bbef5Daniel Jasper tok::equal, tok::kw_delete, tok::kw_sizeof) || 914e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko PrevToken->Type == TT_BinaryOperator || 9156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines PrevToken->Type == TT_ConditionalExpr || 9160178673f541685cf5067814dfeee2644078e39a9Daniel Jasper PrevToken->Type == TT_UnaryOperator || PrevToken->Type == TT_CastRParen) 9170178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 9180178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (NextToken->is(tok::l_square) && NextToken->Type != TT_LambdaLSquare) 920e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber return TT_PointerOrReference; 921ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (NextToken->is(tok::kw_operator)) 922ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return TT_PointerOrReference; 923e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber 924db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper if (PrevToken->is(tok::r_paren) && PrevToken->MatchingParen && 925db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper PrevToken->MatchingParen->Previous && 926ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrevToken->MatchingParen->Previous->isOneOf(tok::kw_typeof, 927ef8225444452a1486bd721f3285301fe84643b00Stephen Hines tok::kw_decltype)) 928db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper return TT_PointerOrReference; 929db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper 930b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (PrevToken->Tok.isLiteral() || 931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::kw_true, 932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines tok::kw_false) || 933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NextToken->Tok.isLiteral() || 934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NextToken->isOneOf(tok::kw_true, tok::kw_false) || 935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines NextToken->isUnaryOperator() || 936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we know we're in a template argument, there are no named 937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // declarations. Thus, having an identifier on the right-hand side 938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // indicates a binary operator. 939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (InTemplateArgument && NextToken->Tok.isAnyIdentifier())) 9400178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_BinaryOperator; 9410178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 942ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // This catches some cases where evaluation order is used as control flow: 943ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // aaa && aaa->f(); 944ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const FormatToken *NextNextToken = NextToken->getNextNonComment(); 945ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (NextNextToken && NextNextToken->is(tok::arrow)) 946ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return TT_BinaryOperator; 947ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 9480178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // It is very unlikely that we are going to find a pointer or reference type 9490178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // definition on the RHS of an assignment. 9500178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (IsExpression) 9510178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_BinaryOperator; 9520178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9530178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_PointerOrReference; 9540178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 9550178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 956b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek TokenType determinePlusMinusCaretUsage(const FormatToken &Tok) { 9570bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *PrevToken = Tok.getPreviousNonComment(); 9586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!PrevToken || PrevToken->Type == TT_CastRParen) 9590178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 9600178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9610178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // Use heuristics to recognize unary operators. 962e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (PrevToken->isOneOf(tok::equal, tok::l_paren, tok::comma, tok::l_square, 963e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::question, tok::colon, tok::kw_return, 964e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::kw_case, tok::at, tok::l_brace)) 9650178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 9660178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 967ee0feec7362053f22b6c01d12e1bfa06fb3ac93fNico Weber // There can't be two consecutive binary operators. 9680178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (PrevToken->Type == TT_BinaryOperator) 9690178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 9700178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9710178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // Fall back to marking the token as binary operator. 9720178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_BinaryOperator; 9730178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 9740178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9750178673f541685cf5067814dfeee2644078e39a9Daniel Jasper /// \brief Determine whether ++/-- are pre- or post-increments/-decrements. 976b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek TokenType determineIncrementUsage(const FormatToken &Tok) { 9770bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *PrevToken = Tok.getPreviousNonComment(); 9786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!PrevToken || PrevToken->Type == TT_CastRParen) 9790178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 980e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::identifier)) 9810178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_TrailingUnaryOperator; 9820178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 9830178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 9840178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 9854e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 9864e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper SmallVector<Context, 8> Contexts; 9874e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 988d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper const FormatStyle &Style; 9894e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper AnnotatedLine &Line; 990b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *CurrentToken; 9914e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool KeywordVirtualFound; 9922ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper bool AutoFound; 993c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber IdentifierInfo &Ident_in; 99432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper}; 99532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 996d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasperstatic int PrecedenceUnaryOperator = prec::PointerToMember + 1; 997d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasperstatic int PrecedenceArrowAndPeriod = prec::PointerToMember + 2; 998d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper 99929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper/// \brief Parses binary expressions by inserting fake parenthesis based on 100029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper/// operator precedence. 100129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasperclass ExpressionParser { 100229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasperpublic: 10039acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper ExpressionParser(AnnotatedLine &Line) : Current(Line.First) { 10049acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper // Skip leading "}", e.g. in "} else if (...) {". 10059acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper if (Current->is(tok::r_brace)) 10069acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper next(); 10079acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper } 100829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 100929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper /// \brief Parse expressions with the given operatore precedence. 1010237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper void parse(int Precedence = 0) { 1011966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper // Skip 'return' and ObjC selector colons as they are not part of a binary 1012966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper // expression. 1013966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper while (Current && 1014966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper (Current->is(tok::kw_return) || 1015ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (Current->is(tok::colon) && (Current->Type == TT_ObjCMethodExpr || 1016ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Current->Type == TT_DictLiteral)))) 1017f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper next(); 1018f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper 10196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Current || Precedence > PrecedenceArrowAndPeriod) 10203618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper return; 10213618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 1022c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper // Conditional expressions need to be parsed separately for proper nesting. 1023d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Precedence == prec::Conditional) { 1024c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper parseConditionalExpr(); 1025c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper return; 1026c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper } 10273618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 10283618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper // Parse unary operators, which all have a higher precedence than binary 10293618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper // operators. 1030d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Precedence == PrecedenceUnaryOperator) { 10313618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper parseUnaryOperator(); 103229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper return; 10333618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 103429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 1035b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Start = Current; 10366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatToken *LatestOperator = nullptr; 10376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned OperatorIndex = 0; 103829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 1039237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper while (Current) { 104029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // Consume operators with higher precedence. 1041bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper parse(Precedence + 1); 104229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 10433618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper int CurrentPrecedence = getCurrentPrecedence(); 10443618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 1045ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Current && Current->Type == TT_SelectorName && 1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Precedence == CurrentPrecedence) { 1047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (LatestOperator) 1048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines addFakeParenthesis(Start, prec::Level(Precedence)); 10493618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper Start = Current; 1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1051237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper 105229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // At the end of the line or when an operator with higher precedence is 105329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // found, insert fake parenthesis and return. 10546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Current || Current->closesScope() || 1055d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper (CurrentPrecedence != -1 && CurrentPrecedence < Precedence)) { 1056d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (LatestOperator) { 10576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines LatestOperator->LastOperator = true; 1058d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Precedence == PrecedenceArrowAndPeriod) { 1059d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper // Call expressions don't have a binary operator precedence. 1060d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper addFakeParenthesis(Start, prec::Unknown); 1061d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } else { 1062d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper addFakeParenthesis(Start, prec::Level(Precedence)); 1063d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } 1064d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } 106529f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper return; 106629f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 106729f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 106829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // Consume scopes: (), [], <> and {} 1069ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper if (Current->opensScope()) { 1070ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper while (Current && !Current->closesScope()) { 107129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper next(); 107229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper parse(); 107329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 107429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper next(); 107529f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } else { 107629f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // Operator found. 10776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (CurrentPrecedence == Precedence) { 1078d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper LatestOperator = Current; 10796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Current->OperatorIndex = OperatorIndex; 10806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ++OperatorIndex; 10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 108229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 108329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper next(); 108429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 108529f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 108629f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 108729f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 108829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasperprivate: 10893618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// \brief Gets the precedence (+1) of the given token for binary operators 10903618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// and other tokens that we treat like binary operators. 10913618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper int getCurrentPrecedence() { 10923618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper if (Current) { 10933618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper if (Current->Type == TT_ConditionalExpr) 1094d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return prec::Conditional; 1095966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper else if (Current->is(tok::semi) || Current->Type == TT_InlineASMColon || 1096ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Current->Type == TT_SelectorName) 1097d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return 0; 1098651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (Current->Type == TT_RangeBasedForLoopColon) 1099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return prec::Comma; 11003618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper else if (Current->Type == TT_BinaryOperator || Current->is(tok::comma)) 1101d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return Current->getPrecedence(); 1102d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper else if (Current->isOneOf(tok::period, tok::arrow)) 1103d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return PrecedenceArrowAndPeriod; 11043618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 1105d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return -1; 11063618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 11073618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 1108c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper void addFakeParenthesis(FormatToken *Start, prec::Level Precedence) { 1109c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper Start->FakeLParens.push_back(Precedence); 1110db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper if (Precedence > prec::Unknown) 1111db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper Start->StartsBinaryExpression = true; 1112db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper if (Current) { 1113c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper ++Current->Previous->FakeRParens; 1114db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper if (Precedence > prec::Unknown) 1115db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper Current->Previous->EndsBinaryExpression = true; 1116db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper } 1117c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper } 1118c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper 11193618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// \brief Parse unary operator expressions and surround them with fake 11203618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// parentheses if appropriate. 11213618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper void parseUnaryOperator() { 11226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Current || Current->Type != TT_UnaryOperator) { 1123d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parse(PrecedenceArrowAndPeriod); 11243618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper return; 1125d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } 11263618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 11273618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper FormatToken *Start = Current; 11283618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper next(); 1129d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parseUnaryOperator(); 11303618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 11313618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper // The actual precedence doesn't matter. 1132d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper addFakeParenthesis(Start, prec::Unknown); 11333618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 11343618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 1135c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper void parseConditionalExpr() { 1136c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper FormatToken *Start = Current; 1137d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parse(prec::LogicalOr); 1138c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper if (!Current || !Current->is(tok::question)) 1139c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper return; 1140c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper next(); 1141d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parse(prec::LogicalOr); 1142c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper if (!Current || Current->Type != TT_ConditionalExpr) 1143c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper return; 1144c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper next(); 1145c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper parseConditionalExpr(); 1146c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper addFakeParenthesis(Start, prec::Conditional); 1147c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper } 1148c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper 114929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper void next() { 1150d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko if (Current) 1151d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko Current = Current->Next; 1152d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko while (Current && Current->isTrailingComment()) 1153b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current = Current->Next; 115429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 115529f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 1156b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Current; 115729f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper}; 115829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 115914e66498781b7d81639bdc48716e09700552ac21Craig Topper} // end anonymous namespace 116014e66498781b7d81639bdc48716e09700552ac21Craig Topper 1161b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jaspervoid 1162b77d741691a2775b5c31e29f021203cc659c26dfDaniel JasperTokenAnnotator::setCommentLineLevels(SmallVectorImpl<AnnotatedLine *> &Lines) { 11636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const AnnotatedLine *NextNonCommentLine = nullptr; 11642a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper for (SmallVectorImpl<AnnotatedLine *>::reverse_iterator I = Lines.rbegin(), 11652a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper E = Lines.rend(); 11662a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper I != E; ++I) { 11672a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper if (NextNonCommentLine && (*I)->First->is(tok::comment) && 11686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (*I)->First->Next == nullptr) 11692a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper (*I)->Level = NextNonCommentLine->Level; 1170b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper else 11716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines NextNonCommentLine = (*I)->First->isNot(tok::r_brace) ? (*I) : nullptr; 11722a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper 11732a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper setCommentLineLevels((*I)->Children); 1174b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper } 1175b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper} 1176b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper 11778ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jaspervoid TokenAnnotator::annotate(AnnotatedLine &Line) { 1178b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper for (SmallVectorImpl<AnnotatedLine *>::iterator I = Line.Children.begin(), 1179b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper E = Line.Children.end(); 1180567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I != E; ++I) { 1181567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper annotate(**I); 1182567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper } 1183d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper AnnotatingParser Parser(Style, Line, Ident_in); 118432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = Parser.parseLine(); 118532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Line.Type == LT_Invalid) 118632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return; 118732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 118829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper ExpressionParser ExprParser(Line); 118929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper ExprParser.parse(); 119029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 1191b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->Type == TT_ObjCMethodSpecifier) 119232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = LT_ObjCMethodDecl; 1193b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek else if (Line.First->Type == TT_ObjCDecl) 119432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = LT_ObjCDecl; 1195b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek else if (Line.First->Type == TT_ObjCProperty) 119632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = LT_ObjCProperty; 119732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1198b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->SpacesRequiredBefore = 1; 1199b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->CanBreakBefore = Line.First->MustBreakBefore; 120032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 120132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// This function heuristically determines whether 'Current' starts the name of a 1203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// function declaration. 1204ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic bool isFunctionDeclarationName(const FormatToken &Current) { 1205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Current.Type != TT_StartOfName || 1206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Current.NestingLevel != 0 || 1207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Current.Previous->Type == TT_StartOfName) 1208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines const FormatToken *Next = Current.Next; 1210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (; Next; Next = Next->Next) { 1211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Next->Type == TT_TemplateOpener) { 1212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Next = Next->MatchingParen; 1213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (Next->is(tok::coloncolon)) { 1214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Next = Next->Next; 1215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Next || !Next->is(tok::identifier)) 1216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (Next->is(tok::l_paren)) { 1218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines break; 1219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else { 1220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Next) 1224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines assert(Next->is(tok::l_paren)); 1226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Next->Next == Next->MatchingParen) 1227ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 1228ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (const FormatToken *Tok = Next->Next; Tok != Next->MatchingParen; 1229ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Tok = Tok->Next) { 1230ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Tok->is(tok::kw_const) || Tok->isSimpleTypeSpecifier() || 1231ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Tok->Type == TT_PointerOrReference || Tok->Type == TT_StartOfName) 1232ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 1233ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Tok->isOneOf(tok::l_brace, tok::string_literal) || Tok->Tok.isLiteral()) 1234ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1235ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 1236ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1237ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 1238ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 12398ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jaspervoid TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { 12406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (SmallVectorImpl<AnnotatedLine *>::iterator I = Line.Children.begin(), 12416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines E = Line.Children.end(); 12426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines I != E; ++I) { 12436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines calculateFormattingInformation(**I); 12446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 12456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 124683a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Line.First->TotalLength = 124783a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Line.First->IsMultiline ? Style.ColumnLimit : Line.First->ColumnWidth; 1248b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (!Line.First->Next) 12498ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper return; 1250b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Current = Line.First->Next; 1251dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper bool InFunctionDecl = Line.MightBeFunctionDecl; 12526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (Current) { 1253ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (isFunctionDeclarationName(*Current)) 1254ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Current->Type = TT_FunctionDeclarationName; 1255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Current->Type == TT_LineComment) { 1256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Current->Previous->BlockKind == BK_BracedInit && 1257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current->Previous->opensScope()) 1258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current->SpacesRequiredBefore = Style.Cpp11BracedListStyle ? 0 : 1; 1259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else 1260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Current->SpacesRequiredBefore = Style.SpacesBeforeTrailingComments; 1261651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we find a trailing comment, iterate backwards to determine whether 1263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // it seems to relate to a specific parameter. If so, break before that 1264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // parameter to avoid changing the comment's meaning. E.g. don't move 'b' 1265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // to the previous line in: 1266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // SomeFunction(a, 1267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // b, // comment 1268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // c); 1269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Current->HasUnescapedNewline) { 1270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (FormatToken *Parameter = Current->Previous; Parameter; 1271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Parameter = Parameter->Previous) { 1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Parameter->isOneOf(tok::comment, tok::r_brace)) 1273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Parameter->Previous && Parameter->Previous->is(tok::comma)) { 1275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Parameter->Previous->Type != TT_CtorInitializerComma && 1276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Parameter->HasUnescapedNewline) 1277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Parameter->MustBreakBefore = true; 1278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 1279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Current->SpacesRequiredBefore == 0 && 12836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines spaceRequiredBefore(Line, *Current)) { 1284b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko Current->SpacesRequiredBefore = 1; 1285651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 12868ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper 1287ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Current->MustBreakBefore = 1288ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Current->MustBreakBefore || mustBreakBefore(Line, *Current); 1289ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper 12908ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper Current->CanBreakBefore = 12918ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper Current->MustBreakBefore || canBreakBefore(Line, *Current); 12926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ChildSize = 0; 12936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Current->Previous->Children.size() == 1) { 12946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FormatToken &LastOfChild = *Current->Previous->Children[0]->Last; 12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ChildSize = LastOfChild.isTrailingComment() ? Style.ColumnLimit 12966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : LastOfChild.TotalLength + 1; 12976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 12986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Current->MustBreakBefore || Current->Previous->Children.size() > 1 || 129983a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Current->IsMultiline) 1300b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current->TotalLength = Current->Previous->TotalLength + Style.ColumnLimit; 13018ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper else 13022a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper Current->TotalLength = Current->Previous->TotalLength + 13036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Current->ColumnWidth + ChildSize + 13042a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper Current->SpacesRequiredBefore; 1305dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper 1306dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper if (Current->Type == TT_CtorInitializerColon) 1307dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper InFunctionDecl = false; 1308dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper 13098ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper // FIXME: Only calculate this if CanBreakBefore is true once static 13108ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper // initializers etc. are sorted out. 13118ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper // FIXME: Move magic numbers to a better place. 1312dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper Current->SplitPenalty = 20 * Current->BindingStrength + 1313dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper splitPenalty(Line, *Current, InFunctionDecl); 13148ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper 1315b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current = Current->Next; 131632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 1317bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper 1318e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek calculateUnbreakableTailLengths(Line); 13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (Current = Line.First; Current != nullptr; Current = Current->Next) { 1320d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper if (Current->Role) 1321d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper Current->Role->precomputeFormattingInfos(Current); 1322d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper } 1323d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper 1324567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper DEBUG({ printDebugInfo(Line); }); 132532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 132632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1327e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimekvoid TokenAnnotator::calculateUnbreakableTailLengths(AnnotatedLine &Line) { 1328e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek unsigned UnbreakableTailLength = 0; 1329b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Current = Line.Last; 13306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines while (Current) { 1331e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek Current->UnbreakableTailLength = UnbreakableTailLength; 1332e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek if (Current->CanBreakBefore || 1333e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek Current->isOneOf(tok::comment, tok::string_literal)) { 1334e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek UnbreakableTailLength = 0; 1335e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek } else { 1336e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek UnbreakableTailLength += 133783a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Current->ColumnWidth + Current->SpacesRequiredBefore; 1338e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek } 1339b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current = Current->Previous; 1340e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek } 1341e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek} 1342e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek 13438ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperunsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, 1344dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper const FormatToken &Tok, 1345dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper bool InFunctionDecl) { 1346b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Left = *Tok.Previous; 1347b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Right = Tok; 134832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 13495ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (Left.is(tok::semi)) 13505ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper return 0; 13516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.is(tok::comma) || (Right.is(tok::identifier) && Right.Next && 13526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Right.Next->Type == TT_DictLiteral)) 13535ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper return 1; 1354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Right.is(tok::l_square)) { 1355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Style.Language == FormatStyle::LK_Proto) 1356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 1; 1357ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.Type != TT_ObjCMethodExpr && Right.Type != TT_LambdaLSquare) 1358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return 500; 1359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 1360ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.Type == TT_StartOfName || 1361ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Right.Type == TT_FunctionDeclarationName || Right.is(tok::kw_operator)) { 1362b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->is(tok::kw_for) && Right.PartOfMultiVariableDeclStmt) 13633c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper return 3; 1364c18cff311118fc6a30929468fc82b2b35cbd7fbfDaniel Jasper if (Left.Type == TT_StartOfName) 1365c18cff311118fc6a30929468fc82b2b35cbd7fbfDaniel Jasper return 20; 1366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (InFunctionDecl && Right.NestingLevel == 0) 13673c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper return Style.PenaltyReturnTypeOnItsOwnLine; 136892495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper return 200; 13693c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper } 137032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::equal) && Right.is(tok::l_brace)) 137132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 150; 1372198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper if (Left.Type == TT_CastRParen) 1373198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper return 100; 1374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::coloncolon) || 1375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Right.is(tok::period) && Style.Language == FormatStyle::LK_Proto)) 137632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 500; 13776b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper if (Left.isOneOf(tok::kw_class, tok::kw_struct)) 13786b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper return 5000; 137932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 13806cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper if (Left.Type == TT_RangeBasedForLoopColon || 13816cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper Left.Type == TT_InheritanceColon) 138284a1a63b034744b68a27ec171dca5b1b7cf303f0Daniel Jasper return 2; 138332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1384d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper if (Right.isMemberAccess()) { 1385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::r_paren) && Left.MatchingParen && 13862f0a020d29286805e48b74b127fbf153af2c4ce7Daniel Jasper Left.MatchingParen->ParameterCount > 0) 1387518ee34467c0722e253a58efea20456e96aa5802Daniel Jasper return 20; // Should be smaller than breaking at a nested comma. 138832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 150; 138932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 139032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1391ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.Type == TT_TrailingAnnotation && 1392ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (!Right.Next || Right.Next->isNot(tok::l_paren))) { 1393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Generally, breaking before a trailing annotation is bad unless it is 1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // function-like. It seems to be especially preferable to keep standard 1395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // annotations (i.e. "const", "final" and "override") on the same line. 1396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Use a slightly higher penalty after ")" so that annotations like 1397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // "const override" are kept together. 13986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines bool is_short_annotation = Right.TokenText.size() < 10; 13996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return (Left.is(tok::r_paren) ? 100 : 120) + (is_short_annotation ? 50 : 0); 1400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 14015ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper 140232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // In for-loops, prefer breaking at ',' and ';'. 1403b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->is(tok::kw_for) && Left.is(tok::equal)) 14047d81281fc39f6d40d86be6600adba13c05b4a639Daniel Jasper return 4; 140532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 140632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // In Objective-C method expressions, prefer breaking before "param:" over 140732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // breaking after it. 1408ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.Type == TT_SelectorName) 140932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 0; 141063d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper if (Left.is(tok::colon) && Left.Type == TT_ObjCMethodExpr) 1411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Line.MightBeFunctionDecl ? 50 : 500; 141232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1413dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper if (Left.is(tok::l_paren) && InFunctionDecl) 14141407bee187d7b964d5293ac8bf4f7a490c78cec6Daniel Jasper return 100; 1415651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::equal) && InFunctionDecl) 1416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return 110; 1417ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper if (Left.opensScope()) 141847066e46b9ce4f830ead3c7b9a4cb5bf0ac2c857Daniel Jasper return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter 141947066e46b9ce4f830ead3c7b9a4cb5bf0ac2c857Daniel Jasper : 19; 142032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 14214e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper if (Right.is(tok::lessless)) { 14224e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper if (Left.is(tok::string_literal)) { 142300895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko StringRef Content = Left.TokenText; 142420376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper if (Content.startswith("\"")) 142520376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper Content = Content.drop_front(1); 142620376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper if (Content.endswith("\"")) 142720376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper Content = Content.drop_back(1); 142820376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper Content = Content.trim(); 1429bfa1edd8247b80e951a570ff2486fe5fa9898c41Daniel Jasper if (Content.size() > 1 && 1430bfa1edd8247b80e951a570ff2486fe5fa9898c41Daniel Jasper (Content.back() == ':' || Content.back() == '=')) 14319637dda705e39110bfff66742542a58dd2470ad2Daniel Jasper return 25; 14324e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper } 14330c368787d9d1f92a3408b71b3f074a06edaa6bdeDaniel Jasper return 1; // Breaking at a << is really cheap. 14344e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper } 143532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.Type == TT_ConditionalExpr) 1436518ee34467c0722e253a58efea20456e96aa5802Daniel Jasper return prec::Conditional; 1437b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek prec::Level Level = Left.getPrecedence(); 143832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 143932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Level != prec::Unknown) 144032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Level; 1441248497199bc56e86d1c089beb9529f3b3d77abb1Daniel Jasper 144232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 3; 144332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 144432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 14458ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperbool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, 1446b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Left, 1447b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Right) { 1448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Style.Language == FormatStyle::LK_Proto) { 1449ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.is(tok::period) && 1450ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (Left.TokenText == "optional" || Left.TokenText == "required" || 1451ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Left.TokenText == "repeated")) 1452ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 1453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Right.is(tok::l_paren) && 1454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Left.TokenText == "returns" || Left.TokenText == "option")) 1455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 14566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } else if (Style.Language == FormatStyle::LK_JavaScript) { 14576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.TokenText == "var") 14586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 14606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.is(tok::kw_return) && Right.isNot(tok::semi)) 14616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 1462651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Style.ObjCSpaceAfterProperty && Line.Type == LT_ObjCProperty && 1463651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left.Tok.getObjCKeywordID() == tok::objc_property) 1464651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 146532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::hashhash)) 146632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Left.is(tok::hash); 1467e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (Left.isOneOf(tok::hashhash, tok::hash)) 146832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Right.is(tok::hash); 14697df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper if (Left.is(tok::l_paren) && Right.is(tok::r_paren)) 14707df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper return Style.SpaceInEmptyParentheses; 14717df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper if (Left.is(tok::l_paren) || Right.is(tok::r_paren)) 147234f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper return (Right.Type == TT_CastRParen || 147334f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper (Left.MatchingParen && Left.MatchingParen->Type == TT_CastRParen)) 14747df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper ? Style.SpacesInCStyleCastParentheses 14757df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper : Style.SpacesInParentheses; 1476d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper if (Style.SpacesInAngles && 1477d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper ((Left.Type == TT_TemplateOpener) != (Right.Type == TT_TemplateCloser))) 1478d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper return true; 14797df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper if (Right.isOneOf(tok::semi, tok::comma)) 148032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 148132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::less) && 148232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper (Left.is(tok::kw_template) || 148332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper (Line.Type == LT_ObjCDecl && Style.ObjCSpaceBeforeProtocolList))) 148432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 148532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::arrow) || Right.is(tok::arrow)) 148632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1487e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (Left.isOneOf(tok::exclaim, tok::tilde)) 148832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 148932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::at) && 1490e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Right.isOneOf(tok::identifier, tok::string_literal, tok::char_constant, 1491e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::numeric_constant, tok::l_paren, tok::l_brace, 1492e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::kw_true, tok::kw_false)) 149332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 149432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::coloncolon)) 149532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Right.is(tok::coloncolon) && Left.isNot(tok::l_brace)) 149778a4e619e775b0dbaa10c9feaea0adf1d3dfe507Daniel Jasper return (Left.is(tok::less) && Style.Standard == FormatStyle::LS_Cpp03) || 149878a4e619e775b0dbaa10c9feaea0adf1d3dfe507Daniel Jasper !Left.isOneOf(tok::identifier, tok::greater, tok::l_paren, 149978a4e619e775b0dbaa10c9feaea0adf1d3dfe507Daniel Jasper tok::r_paren, tok::less); 1500e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (Left.is(tok::less) || Right.isOneOf(tok::greater, tok::less)) 150132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1502c47d7f1237b022eabbbdcebf77506e8a81aa54bdDaniel Jasper if (Right.is(tok::ellipsis)) 1503b3c887dcb70220eced72935725cd94d7e8325912Daniel Jasper return Left.Tok.isLiteral(); 150431e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek if (Left.is(tok::l_square) && Right.is(tok::amp)) 150531e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek return false; 15063fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko if (Right.Type == TT_PointerOrReference) 1507b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek return Left.Tok.isLiteral() || 15083fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko ((Left.Type != TT_PointerOrReference) && Left.isNot(tok::l_paren) && 1509ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Style.PointerAlignment != FormatStyle::PAS_Left); 15103ff4a2fea4aa6e5182b7799ccb4352e56961a212Daniel Jasper if (Right.Type == TT_FunctionTypeLParen && Left.isNot(tok::l_paren) && 1511ef8225444452a1486bd721f3285301fe84643b00Stephen Hines (Left.Type != TT_PointerOrReference || Style.PointerAlignment != FormatStyle::PAS_Right)) 1512395228fdc343df39c2507e414dc1406a185c6d37Daniel Jasper return true; 15133fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko if (Left.Type == TT_PointerOrReference) 15143a1847e0a1810a0b1b963182abc59114cc5ff53dDaniel Jasper return Right.Tok.isLiteral() || Right.Type == TT_BlockComment || 15159322aaee900b872c98f8fc10b38a231cb1e9b57aDaniel Jasper ((Right.Type != TT_PointerOrReference) && 1516ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Right.isNot(tok::l_paren) && Style.PointerAlignment != FormatStyle::PAS_Right && 1517b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Left.Previous && 1518b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek !Left.Previous->isOneOf(tok::l_paren, tok::coloncolon)); 151932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::star) && Left.is(tok::l_paren)) 152032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1521051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber if (Left.is(tok::l_square)) 1522a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper return Left.Type == TT_ArrayInitializerLSquare && 1523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Style.SpacesInContainerLiterals && Right.isNot(tok::r_square); 1524051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber if (Right.is(tok::r_square)) 1525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Right.MatchingParen && Style.SpacesInContainerLiterals && 1526a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Right.MatchingParen->Type == TT_ArrayInitializerLSquare; 1527ec17226e82979592c16c7815d2368240201d18feDaniel Jasper if (Right.is(tok::l_square) && Right.Type != TT_ObjCMethodExpr && 15286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Right.Type != TT_LambdaLSquare && Left.isNot(tok::numeric_constant) && 15296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left.Type != TT_DictLiteral) 153032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 153132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::colon)) 153232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Left.Type != TT_ObjCMethodExpr; 15336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.Type == TT_BlockComment) 15346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return !Left.TokenText.endswith("=*/"); 153532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::l_paren)) { 1536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::r_paren) && Left.Type == TT_AttributeParen) 1537e0fa4c55a4bc6d2bbe0d9d657287c037158d5357Daniel Jasper return true; 1538e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko return Line.Type == LT_ObjCDecl || 15396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left.isOneOf(tok::kw_new, tok::kw_delete, tok::semi) || 1540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Style.SpaceBeforeParens != FormatStyle::SBPO_Never && 1541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Left.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, 15426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines tok::kw_switch, tok::kw_catch, tok::kw_case) || 1543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left.IsForEachMacro)) || 1544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Style.SpaceBeforeParens == FormatStyle::SBPO_Always && 1545651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Left.isOneOf(tok::identifier, tok::kw___attribute) && 1546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Line.Type != LT_PreprocessorDirective); 154732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 1548b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Left.is(tok::at) && Right.Tok.getObjCKeywordID() != tok::objc_not_keyword) 154932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 155032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::l_brace) && Right.is(tok::r_brace)) 1551567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper return !Left.Children.empty(); // No spaces in "{}". 1552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if ((Left.is(tok::l_brace) && Left.BlockKind != BK_Block) || 1553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Right.is(tok::r_brace) && Right.MatchingParen && 1554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Right.MatchingParen->BlockKind != BK_Block)) 1555b5dc3f4f53981b681a565cdf1d49f18e817541ffDaniel Jasper return !Style.Cpp11BracedListStyle; 15561bee0738b67b784f08d5e2f8351920260c9cfb1dDaniel Jasper if (Right.Type == TT_UnaryOperator) 15571bee0738b67b784f08d5e2f8351920260c9cfb1dDaniel Jasper return !Left.isOneOf(tok::l_paren, tok::l_square, tok::at) && 15581bee0738b67b784f08d5e2f8351920260c9cfb1dDaniel Jasper (Left.isNot(tok::colon) || Left.Type != TT_ObjCMethodExpr); 1559ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if ((Left.isOneOf(tok::identifier, tok::greater, tok::r_square, 1560ef8225444452a1486bd721f3285301fe84643b00Stephen Hines tok::r_paren) || 15616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left.isSimpleTypeSpecifier()) && 156231e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek Right.is(tok::l_brace) && Right.getNextNonComment() && 156331e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek Right.BlockKind != BK_Block) 156432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 15655ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (Left.is(tok::period) || Right.is(tok::period)) 15665ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper return false; 1567daa07e9ee76d438efa3c7e2c54b4d3d3ed19ea27Alexander Kornienko if (Right.is(tok::hash) && Left.is(tok::identifier) && Left.TokenText == "L") 1568daa07e9ee76d438efa3c7e2c54b4d3d3ed19ea27Alexander Kornienko return false; 156932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 157032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 157132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 15728ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperbool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, 1573b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Tok) { 1574b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Tok.getIdentifierInfo() && Tok.Previous->Tok.getIdentifierInfo()) 15752b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper return true; // Never ever merge two identifiers. 15761d82b1a33bcfe85f4834fb6920517ed07e9355d3Daniel Jasper if (Tok.Previous->Type == TT_ImplicitStringLiteral) 15771d82b1a33bcfe85f4834fb6920517ed07e9355d3Daniel Jasper return Tok.WhitespaceRange.getBegin() != Tok.WhitespaceRange.getEnd(); 157832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Line.Type == LT_ObjCMethodDecl) { 1579b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Type == TT_ObjCMethodSpecifier) 158032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1581b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->is(tok::r_paren) && Tok.is(tok::identifier)) 158232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Don't space between ')' and <id> 158332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 158432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 158532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Line.Type == LT_ObjCProperty && 1586b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek (Tok.is(tok::equal) || Tok.Previous->is(tok::equal))) 158732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 158832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 15892ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper if (Tok.Type == TT_TrailingReturnArrow || 15902ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper Tok.Previous->Type == TT_TrailingReturnArrow) 15912ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper return true; 1592b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->is(tok::comma)) 159332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 15949c3c7b3130bc72b3f50703c11b85152b1264fc90Daniel Jasper if (Tok.is(tok::comma)) 15959c3c7b3130bc72b3f50703c11b85152b1264fc90Daniel Jasper return false; 159632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Tok.Type == TT_CtorInitializerColon || Tok.Type == TT_ObjCBlockLParen) 159732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1598b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Tok.is(tok::kw_operator)) 159952af94453e30d2e9d0f4b6a208c8d4c3ff7c85a9Daniel Jasper return Tok.is(tok::coloncolon); 16002b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper if (Tok.Type == TT_OverloadedOperatorLParen) 160132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 160232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Tok.is(tok::colon)) 1603b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek return !Line.First->isOneOf(tok::kw_case, tok::kw_default) && 16046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.getNextNonComment() && Tok.Type != TT_ObjCMethodExpr && 1605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines !Tok.Previous->is(tok::question) && 1606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Tok.Type != TT_DictLiteral || Style.SpacesInContainerLiterals); 1607b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Type == TT_UnaryOperator || 1608b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok.Previous->Type == TT_CastRParen) 1609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Tok.Type == TT_BinaryOperator; 1610b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->is(tok::greater) && Tok.is(tok::greater)) { 161129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper return Tok.Type == TT_TemplateCloser && 1612b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok.Previous->Type == TT_TemplateCloser && 1613d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper (Style.Standard != FormatStyle::LS_Cpp11 || Style.SpacesInAngles); 161432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 161554a38bd5cf243310290f34b43fc940a498a00f90Alexander Kornienko if (Tok.isOneOf(tok::arrowstar, tok::periodstar) || 1616b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok.Previous->isOneOf(tok::arrowstar, tok::periodstar)) 16179c3c7b3130bc72b3f50703c11b85152b1264fc90Daniel Jasper return false; 16189b4de85e2f47a01974f451d21fed0276ff912e32Daniel Jasper if (!Style.SpaceBeforeAssignmentOperators && 16199b4de85e2f47a01974f451d21fed0276ff912e32Daniel Jasper Tok.getPrecedence() == prec::Assignment) 16209b4de85e2f47a01974f451d21fed0276ff912e32Daniel Jasper return false; 16211dc6f745eb19c94527503012d798dc9b9b5ba6daDaniel Jasper if ((Tok.Type == TT_BinaryOperator && !Tok.Previous->is(tok::l_paren)) || 16226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Previous->Type == TT_BinaryOperator || 16236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Tok.Previous->Type == TT_ConditionalExpr) 162432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1625b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Type == TT_TemplateCloser && Tok.is(tok::l_paren)) 162632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1627a4dd982805e89a37a080350bf8de9069135c5a60Daniel Jasper if (Tok.is(tok::less) && Tok.Previous->isNot(tok::l_paren) && 1628a4dd982805e89a37a080350bf8de9069135c5a60Daniel Jasper Line.First->is(tok::hash)) 162932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 163032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Tok.Type == TT_TrailingUnaryOperator) 163132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 16326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Tok.Previous->Type == TT_RegexLiteral) 16336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 1634b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek return spaceRequiredBetween(Line, *Tok.Previous, Tok); 163532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 163632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1637ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Returns 'true' if 'Tok' is a brace we'd want to break before in Allman style. 1638ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic bool isAllmanBrace(const FormatToken &Tok) { 1639ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return Tok.is(tok::l_brace) && Tok.BlockKind == BK_Block && 1640ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Tok.Type != TT_ObjCBlockLBrace && Tok.Type != TT_DictLiteral; 1641ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 1642ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1643ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasperbool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, 1644ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper const FormatToken &Right) { 1645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const FormatToken &Left = *Right.Previous; 1646ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.NewlinesBefore > 1) 1647ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return true; 1648ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper if (Right.is(tok::comment)) { 1649651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Right.Previous->BlockKind != BK_BracedInit && 1650651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Right.Previous->Type != TT_CtorInitializerColon && 16516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (Right.NewlinesBefore > 0 && Right.HasUnescapedNewline); 1652ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->isTrailingComment() || 1653651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Right.isStringLiteral() && Right.Previous->isStringLiteral())) { 1654ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1655ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->IsUnterminatedLiteral) { 1656ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1657ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.is(tok::lessless) && Right.Next && 1658ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Previous->is(tok::string_literal) && 1659ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Next->is(tok::string_literal)) { 1660ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1661ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->ClosesTemplateDeclaration && 1662ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Previous->MatchingParen && 1663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Right.Previous->MatchingParen->NestingLevel == 0 && 1664ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Style.AlwaysBreakTemplateDeclarations) { 1665ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if ((Right.Type == TT_CtorInitializerComma || 1667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Right.Type == TT_CtorInitializerColon) && 166819ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper Style.BreakConstructorInitializersBeforeComma && 166919ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper !Style.ConstructorInitializerAllOnOneLineOrOnePerLine) { 1670ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Right.is(tok::string_literal) && 1672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Right.TokenText.startswith("R\"")) { 1673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Raw string literals are special wrt. line breaks. The author has made a 1674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // deliberate choice and might have aligned the contents of the string 1675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // literal accordingly. Thus, we try keep existing line breaks. 1676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Right.NewlinesBefore > 0; 1677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Right.Previous->is(tok::l_brace) && Right.NestingLevel == 1 && 1678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Style.Language == FormatStyle::LK_Proto) { 1679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Don't enums onto single lines in protocol buffers. 1680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1681ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else if (isAllmanBrace(Left) || isAllmanBrace(Right)) { 1682ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return Style.BreakBeforeBraces == FormatStyle::BS_Allman || 1683ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Style.BreakBeforeBraces == FormatStyle::BS_GNU; 16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 16856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // If the last token before a '}' is a comma or a comment, the intention is to 16876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // insert a line break after it in order to make shuffling around entries 16886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // easier. 16896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const FormatToken *BeforeClosingBrace = nullptr; 16906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.is(tok::l_brace) && Left.MatchingParen) 16916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines BeforeClosingBrace = Left.MatchingParen->Previous; 16926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else if (Right.is(tok::r_brace)) 16936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines BeforeClosingBrace = Right.Previous; 16946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (BeforeClosingBrace && 16956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines BeforeClosingBrace->isOneOf(tok::comma, tok::comment)) 1696651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 16976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 16986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Style.Language == FormatStyle::LK_JavaScript) { 16996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: This might apply to other languages and token kinds. 17006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Right.is(tok::char_constant) && Left.is(tok::plus) && Left.Previous && 17016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left.Previous->is(tok::char_constant)) 17026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 1703ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } 17046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1705ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return false; 1706ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper} 1707ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper 17088ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperbool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, 1709b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Right) { 1710b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Left = *Right.Previous; 1711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::at)) 1712651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 17136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.Tok.getObjCKeywordID() == tok::objc_interface) 17146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return false; 1715ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.Type == TT_StartOfName || 1716ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Right.Type == TT_FunctionDeclarationName || Right.is(tok::kw_operator)) 171732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 17181a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper if (Right.isTrailingComment()) 17191a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper // We rely on MustBreakBefore being set correctly here as we should not 17201a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper // change the "binding" behavior of a comment. 1721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // The first comment in a braced lists is always interpreted as belonging to 1722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // the first list element. Otherwise, it should be placed outside of the 1723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // list. 1724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Left.BlockKind == BK_BracedInit; 17251a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper if (Left.is(tok::question) && Right.is(tok::colon)) 17261a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper return false; 17271a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper if (Right.Type == TT_ConditionalExpr || Right.is(tok::question)) 17281a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper return Style.BreakBeforeTernaryOperators; 17291a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper if (Left.Type == TT_ConditionalExpr || Left.is(tok::question)) 17301a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper return !Style.BreakBeforeTernaryOperators; 1731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Right.Type == TT_InheritanceColon) 1732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return true; 1733ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.is(tok::colon) && (Right.Type != TT_CtorInitializerColon && 1734ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Right.Type != TT_InlineASMColon)) 1735ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return false; 1736f2ff8126e9e9df368f31b1f968d8fc80f99809b3Nico Weber if (Left.is(tok::colon) && 17373c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper (Left.Type == TT_DictLiteral || Left.Type == TT_ObjCMethodExpr)) 173832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1739ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Right.Type == TT_SelectorName) 174032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1741aa9e7b18a88d715b63e7b65d1b26a1759decc177Daniel Jasper if (Left.is(tok::r_paren) && Line.Type == LT_ObjCProperty) 1742aa9e7b18a88d715b63e7b65d1b26a1759decc177Daniel Jasper return true; 174332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.ClosesTemplateDeclaration) 174432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 17456cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper if (Right.Type == TT_RangeBasedForLoopColon || 1746c476ea976badd316e3afd0f34afe1f030a710117Daniel Jasper Right.Type == TT_OverloadedOperatorLParen || 1747c476ea976badd316e3afd0f34afe1f030a710117Daniel Jasper Right.Type == TT_OverloadedOperator) 17486cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper return false; 1749c194c95036b7bf1281a6f2ed683f7c85ee5d2c20Daniel Jasper if (Left.Type == TT_RangeBasedForLoopColon) 175032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 17517d81281fc39f6d40d86be6600adba13c05b4a639Daniel Jasper if (Right.Type == TT_RangeBasedForLoopColon) 17527d81281fc39f6d40d86be6600adba13c05b4a639Daniel Jasper return false; 175332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.Type == TT_PointerOrReference || Left.Type == TT_TemplateCloser || 17541a896a5a72d9af0259afe636535254c95dc6b355Daniel Jasper Left.Type == TT_UnaryOperator || Left.is(tok::kw_operator)) 175532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 175632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::equal) && Line.Type == LT_VirtualFunctionDecl) 175732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::l_paren) && Left.Type == TT_AttributeParen) 1759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Left.is(tok::l_paren) && Left.Previous && 1761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines (Left.Previous->Type == TT_BinaryOperator || 17626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Left.Previous->Type == TT_CastRParen || Left.Previous->is(tok::kw_if))) 1763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 17648437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper if (Right.Type == TT_ImplicitStringLiteral) 17658437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper return false; 176632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1767567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (Right.is(tok::r_paren) || Right.Type == TT_TemplateCloser) 1768567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper return false; 1769567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper 17705ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper // We only break before r_brace if there was a corresponding break before 17715ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper // the l_brace, which is tracked by BreakBeforeClosingBrace. 1772567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (Right.is(tok::r_brace)) 1773567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper return Right.MatchingParen && Right.MatchingParen->BlockKind == BK_Block; 17745ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper 17756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Allow breaking after a trailing annotation, e.g. after a method 17766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // declaration. 17776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Left.Type == TT_TrailingAnnotation) 17786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return !Right.isOneOf(tok::l_brace, tok::semi, tok::equal, tok::l_paren, 17796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines tok::less, tok::coloncolon); 178032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 17818ef19a22956defa392df46c79e2d499ab7b16647Daniel Jasper if (Right.is(tok::kw___attribute)) 17828ef19a22956defa392df46c79e2d499ab7b16647Daniel Jasper return true; 17838ef19a22956defa392df46c79e2d499ab7b16647Daniel Jasper 17843a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper if (Left.is(tok::identifier) && Right.is(tok::string_literal)) 17853a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper return true; 1786e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper 17876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Right.is(tok::identifier) && Right.Next && 17886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Right.Next->Type == TT_DictLiteral) 17896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 17906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1791e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper if (Left.Type == TT_CtorInitializerComma && 1792e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper Style.BreakConstructorInitializersBeforeComma) 1793e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper return false; 179419ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper if (Right.Type == TT_CtorInitializerComma && 179519ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper Style.BreakConstructorInitializersBeforeComma) 179619ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper return true; 179726356ccf00f813cf358d420b55939fc737eb2cfaDaniel Jasper if (Left.is(tok::greater) && Right.is(tok::greater) && 179826356ccf00f813cf358d420b55939fc737eb2cfaDaniel Jasper Left.Type != TT_TemplateCloser) 179926356ccf00f813cf358d420b55939fc737eb2cfaDaniel Jasper return false; 18006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Right.Type == TT_BinaryOperator && Style.BreakBeforeBinaryOperators) 18016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return true; 1802a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper if (Left.Type == TT_ArrayInitializerLSquare) 1803a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper return true; 1804ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return (Left.isBinaryOperator() && 1805ef8225444452a1486bd721f3285301fe84643b00Stephen Hines !Left.isOneOf(tok::arrowstar, tok::lessless) && 1806e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper !Style.BreakBeforeBinaryOperators) || 18076b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper Left.isOneOf(tok::comma, tok::coloncolon, tok::semi, tok::l_brace, 18086b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper tok::kw_class, tok::kw_struct) || 1809ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Right.isMemberAccess() || 1810ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Right.isOneOf(tok::lessless, tok::colon, tok::l_square, tok::at) || 1811198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper (Left.is(tok::r_paren) && 1812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Right.isOneOf(tok::identifier, tok::kw_const)) || 1813a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper (Left.is(tok::l_paren) && !Right.is(tok::r_paren)); 181432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 181532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1816bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jaspervoid TokenAnnotator::printDebugInfo(const AnnotatedLine &Line) { 1817bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << "AnnotatedTokens:\n"; 1818b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken *Tok = Line.First; 1819bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper while (Tok) { 1820b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek llvm::errs() << " M=" << Tok->MustBreakBefore 1821c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper << " C=" << Tok->CanBreakBefore << " T=" << Tok->Type 1822c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper << " S=" << Tok->SpacesRequiredBefore 1823ef8225444452a1486bd721f3285301fe84643b00Stephen Hines << " B=" << Tok->BlockParameterCount 1824c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper << " P=" << Tok->SplitPenalty << " Name=" << Tok->Tok.getName() 1825ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek << " L=" << Tok->TotalLength << " PPK=" << Tok->PackingKind 1826ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek << " FakeLParens="; 1827bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper for (unsigned i = 0, e = Tok->FakeLParens.size(); i != e; ++i) 1828bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << Tok->FakeLParens[i] << "/"; 1829bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << " FakeRParens=" << Tok->FakeRParens << "\n"; 18306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Tok->Next) 1831ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(Tok == Line.Last); 1832b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok = Tok->Next; 1833bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper } 1834bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << "----\n"; 1835bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper} 1836bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper 183732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} // namespace format 183832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} // namespace clang 1839