TokenAnnotator.cpp revision 966e6d3a174856ff3fe3d6cfe294ebae832f6c09
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 2032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jaspernamespace clang { 2132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jaspernamespace format { 2232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 2314e66498781b7d81639bdc48716e09700552ac21Craig Toppernamespace { 2414e66498781b7d81639bdc48716e09700552ac21Craig Topper 2532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// \brief A parser that gathers additional information about tokens. 2632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// 273fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko/// The \c TokenAnnotator tries to match parenthesis and square brakets and 2832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// store a parenthesis levels. It also tries to resolve matching "<" and ">" 2932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper/// into template parameter lists. 3032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasperclass AnnotatingParser { 3132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasperpublic: 32d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper AnnotatingParser(const FormatStyle &Style, AnnotatedLine &Line, 33d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper IdentifierInfo &Ident_in) 34d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper : Style(Style), Line(Line), CurrentToken(Line.First), 3559875ac81b97de87ac6c4c7cb256ab71b75114f2Daniel Jasper KeywordVirtualFound(false), AutoFound(false), Ident_in(Ident_in) { 362726877196b41b922f10f794801b313980e1a8adNico Weber Contexts.push_back(Context(tok::unknown, 1, /*IsExpression=*/false)); 3732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 3832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 3995e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weberprivate: 4032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseAngle() { 4132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken == NULL) 4232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 43923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator ContextCreator(*this, tok::less, 10); 44b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 454e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().IsExpression = false; 4632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 4732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::greater)) { 4832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->MatchingParen = CurrentToken; 4932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->MatchingParen = Left; 5032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_TemplateCloser; 5132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 5232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 5332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 54e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::r_paren, tok::r_square, tok::r_brace, 555d823e3a00a3e21a0823288e6dee26a93758332bDaniel Jasper tok::question, tok::colon)) 565d823e3a00a3e21a0823288e6dee26a93758332bDaniel Jasper return false; 570348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // If a && or || is found and interpreted as a binary operator, this set 5815f33f03e742fb6567e4789996fa0391a8e18068Daniel Jasper // of angles is likely part of something like "a < b && c > d". If the 590348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // angles are inside an expression, the ||/&& might also be a binary 600348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // operator that was misinterpreted because we are parsing template 610348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // parameters. 620348be0c78781c5ddb8c271976812705410c731aDaniel Jasper // FIXME: This is getting out of hand, write a decent parser. 63b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->Previous->isOneOf(tok::pipepipe, tok::ampamp) && 640348be0c78781c5ddb8c271976812705410c731aDaniel Jasper (CurrentToken->Previous->Type == TT_BinaryOperator || 650348be0c78781c5ddb8c271976812705410c731aDaniel Jasper Contexts[Contexts.size() - 2].IsExpression) && 66b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->isNot(tok::kw_template)) 6732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 689fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper updateParameterCount(Left, CurrentToken); 6932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 7032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 7132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 7232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 7332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 7432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 7532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseParens(bool LookForDecls = false) { 7632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken == NULL) 7732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 78923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator ContextCreator(*this, tok::l_paren, 1); 794e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 804e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper // FIXME: This is a bit of a hack. Do better. 814e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsForRangeExpr = 824e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.size() == 2 && Contexts[0].ColonIsForRangeExpr; 834e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 8432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool StartsObjCMethodExpr = false; 85b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 8632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::caret)) { 8732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // ^( starts a block. 8832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->Type = TT_ObjCBlockLParen; 89b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek } else if (FormatToken *MaybeSel = Left->Previous) { 9032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // @selector( starts a selector. 91b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (MaybeSel->isObjCAtKeyword(tok::objc_selector) && MaybeSel->Previous && 92b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek MaybeSel->Previous->is(tok::at)) { 9332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper StartsObjCMethodExpr = true; 9432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 9532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 9632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 97b644dd68d3d7261ceb8823595290439dc65530b1Daniel Jasper if (Left->Previous && Left->Previous->isOneOf(tok::kw_static_assert, 98363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper tok::kw_if, tok::kw_while)) { 99363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper // static_assert, if and while usually contain expressions. 100b7000ca629da16164f0073f5a7f9459ddf5ba281Daniel Jasper Contexts.back().IsExpression = true; 101363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper } else if (Left->Previous && Left->Previous->is(tok::r_square) && 102363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper Left->Previous->MatchingParen && 103363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper Left->Previous->MatchingParen->Type == TT_LambdaLSquare) { 104363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper // This is a parameter list of a lambda expression. 105363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper Contexts.back().IsExpression = false; 106363193b1bd4d9e0f07d361113157b9d4f229f212Daniel Jasper } 107b7000ca629da16164f0073f5a7f9459ddf5ba281Daniel Jasper 1084e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (StartsObjCMethodExpr) { 1094e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsObjCMethodExpr = true; 1104e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Left->Type = TT_ObjCMethodExpr; 1114e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } 11232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 113431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper bool MightBeFunctionType = CurrentToken->is(tok::star); 114c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper bool HasMultipleLines = false; 115c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper bool HasMultipleParametersOnALine = false; 11632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 11732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // LookForDecls is set when "if (" has been seen. Check for 11832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // 'identifier' '*' 'identifier' followed by not '=' -- this 11932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // '*' has to be a binary operator but determineStarAmpUsage() will 12032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // categorize it as an unary operator, so set the right type here. 121b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (LookForDecls && CurrentToken->Next) { 1220bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *Prev = CurrentToken->getPreviousNonComment(); 1232785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko if (Prev) { 1240bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *PrevPrev = Prev->getPreviousNonComment(); 1252785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko FormatToken *Next = CurrentToken->Next; 1262785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko if (PrevPrev && PrevPrev->is(tok::identifier) && 1272785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko Prev->isOneOf(tok::star, tok::amp, tok::ampamp) && 1282785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko CurrentToken->is(tok::identifier) && Next->isNot(tok::equal)) { 1292785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko Prev->Type = TT_BinaryOperator; 1302785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko LookForDecls = false; 1312785b9aabcb2c3fd6f7dd8b63d3cd3d4b9bca284Alexander Kornienko } 13232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 13332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 13432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 13553352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper if (CurrentToken->Previous->Type == TT_PointerOrReference && 13653352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper CurrentToken->Previous->Previous->isOneOf(tok::l_paren, 13753352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper tok::coloncolon)) 13853352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper MightBeFunctionType = true; 13932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::r_paren)) { 140b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (MightBeFunctionType && CurrentToken->Next && 141e7d3bff31e3ef4fea1e2a5a7cd5441b6b0752e3fDaniel Jasper (CurrentToken->Next->is(tok::l_paren) || 142e7d3bff31e3ef4fea1e2a5a7cd5441b6b0752e3fDaniel Jasper (CurrentToken->Next->is(tok::l_square) && 143e7d3bff31e3ef4fea1e2a5a7cd5441b6b0752e3fDaniel Jasper !Contexts.back().IsExpression))) 144431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper Left->Type = TT_FunctionTypeLParen; 14532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->MatchingParen = CurrentToken; 14632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->MatchingParen = Left; 14732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 14863d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper if (StartsObjCMethodExpr) { 1494e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper CurrentToken->Type = TT_ObjCMethodExpr; 1504e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (Contexts.back().FirstObjCSelectorName != NULL) { 1514e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 1524e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().LongestObjCSelectorName; 15363d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 15463d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 15532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 156c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (!HasMultipleLines) 157c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper Left->PackingKind = PPK_Inconclusive; 158c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper else if (HasMultipleParametersOnALine) 159c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper Left->PackingKind = PPK_BinPacked; 160c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper else 161c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper Left->PackingKind = PPK_OnePerLine; 162c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper 16332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 16432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 16532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 166e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::r_square, tok::r_brace)) 16732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1689fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper updateParameterCount(Left, CurrentToken); 169c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (CurrentToken->is(tok::comma) && CurrentToken->Next && 170c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper !CurrentToken->Next->HasUnescapedNewline && 171c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper !CurrentToken->Next->isTrailingComment()) 172c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper HasMultipleParametersOnALine = true; 17332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 17432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 175c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (CurrentToken && CurrentToken->HasUnescapedNewline) 176c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper HasMultipleLines = true; 17732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 17832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 17932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 18032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 18132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseSquare() { 18232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!CurrentToken) 18332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 18432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 185d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko // A '[' could be an index subscript (after an identifier or after 186051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber // ')' or ']'), it could be the start of an Objective-C method 187051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber // expression, or it could the the start of an Objective-C array literal. 188b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 1890bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *Parent = Left->getPreviousNonComment(); 19032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool StartsObjCMethodExpr = 191567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Contexts.back().CanBeExpression && Left->Type != TT_LambdaLSquare && 192e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko (!Parent || Parent->isOneOf(tok::colon, tok::l_square, tok::l_paren, 193e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::kw_return, tok::kw_throw) || 194ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper Parent->isUnaryOperator() || Parent->Type == TT_ObjCForIn || 195e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Parent->Type == TT_CastRParen || 196b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek getBinOpPrecedence(Parent->Tok.getKind(), true, true) > prec::Unknown); 197923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator ContextCreator(*this, tok::l_square, 10); 1986f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper Contexts.back().IsExpression = true; 1998f54d881723ca7058807eee871913c812618bfdaDaniel Jasper bool ColonFound = false; 20032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 2014e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (StartsObjCMethodExpr) { 2024e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsObjCMethodExpr = true; 2034e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Left->Type = TT_ObjCMethodExpr; 204a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper } else if (Parent && Parent->is(tok::at)) { 205a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Left->Type = TT_ArrayInitializerLSquare; 206a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper } else if (Left->Type == TT_Unknown) { 207a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Left->Type = TT_ArraySubscriptLSquare; 2084e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } 20932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 21032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 21132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::r_square)) { 212ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper if (CurrentToken->Next && CurrentToken->Next->is(tok::l_paren) && 213ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper Left->Type == TT_ObjCMethodExpr) { 214e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // An ObjC method call is rarely followed by an open parenthesis. 21532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // FIXME: Do we incorrectly label ":" with this? 21632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper StartsObjCMethodExpr = false; 21732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->Type = TT_Unknown; 21832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 2190178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (StartsObjCMethodExpr) { 2204e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper CurrentToken->Type = TT_ObjCMethodExpr; 221e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // determineStarAmpUsage() thinks that '*' '[' is allocating an 222e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // array of pointers, but if '[' starts a selector then '*' is a 223e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber // binary operator. 2243fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko if (Parent != NULL && Parent->Type == TT_PointerOrReference) 2254ed7f3e003c906d9fdb92a9484feeb8ac6e28e2fNico Weber Parent->Type = TT_BinaryOperator; 2260178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 22732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left->MatchingParen = CurrentToken; 22832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->MatchingParen = Left; 2294e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (Contexts.back().FirstObjCSelectorName != NULL) 2304e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 2314e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().LongestObjCSelectorName; 23232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 23332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 23432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 235e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::r_paren, tok::r_brace)) 23632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 2378f54d881723ca7058807eee871913c812618bfdaDaniel Jasper if (CurrentToken->is(tok::colon)) 2388f54d881723ca7058807eee871913c812618bfdaDaniel Jasper ColonFound = true; 239a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper if (CurrentToken->is(tok::comma) && 2403c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper (Left->Type == TT_ArraySubscriptLSquare || 2418f54d881723ca7058807eee871913c812618bfdaDaniel Jasper (Left->Type == TT_ObjCMethodExpr && !ColonFound))) 242a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Left->Type = TT_ArrayInitializerLSquare; 2439fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper updateParameterCount(Left, CurrentToken); 24432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 24532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 24632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 24732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 24832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 24932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 25032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseBrace() { 25153e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (CurrentToken != NULL) { 252b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Left = CurrentToken->Previous; 2533c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper ScopedContextCreator ContextCreator(*this, tok::l_brace, 1); 2543c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper Contexts.back().ColonIsDictLiteral = true; 255f2ff8126e9e9df368f31b1f968d8fc80f99809b3Nico Weber 25653e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper while (CurrentToken != NULL) { 25753e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (CurrentToken->is(tok::r_brace)) { 25853e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper Left->MatchingParen = CurrentToken; 25953e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper CurrentToken->MatchingParen = Left; 26053e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper next(); 26153e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper return true; 26253e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper } 26353e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (CurrentToken->isOneOf(tok::r_paren, tok::r_square)) 26453e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper return false; 26553e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper updateParameterCount(Left, CurrentToken); 2663c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper if (CurrentToken->is(tok::colon)) 2673c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper Left->Type = TT_DictLiteral; 26853e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper if (!consumeToken()) 26953e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper return false; 27032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 27132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 27253e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper // No closing "}" found, this probably starts a definition. 27353e72cdcc0bc217cab33fa56858a0fe5b94ca453Daniel Jasper Line.StartsDefinition = true; 27432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 27532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 276c4615b7aaf97e303a4fc675956f7f5572d492885Daniel Jasper 277b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek void updateParameterCount(FormatToken *Left, FormatToken *Current) { 278c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper if (Current->is(tok::comma)) { 2799fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper ++Left->ParameterCount; 280d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper if (!Left->Role) 281d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper Left->Role.reset(new CommaSeparatedList(Style)); 282d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper Left->Role->CommaFound(Current); 283c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper } else if (Left->ParameterCount == 0 && Current->isNot(tok::comment)) { 2849fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper Left->ParameterCount = 1; 285c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper } 2869fc56f2636137fcde8acb38865555ed6c7b84dfdDaniel Jasper } 28732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 28832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseConditional() { 28932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 29032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::colon)) { 29132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_ConditionalExpr; 29232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 29332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 29432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 29532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 29632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 29732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 29832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 29932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 30032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 30132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool parseTemplateDeclaration() { 30232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken != NULL && CurrentToken->is(tok::less)) { 30332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_TemplateOpener; 30432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 30532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseAngle()) 30632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 30734511fb79201ba9ed39c97f3a7ea0f157a79436dDaniel Jasper if (CurrentToken != NULL) 308b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek CurrentToken->Previous->ClosesTemplateDeclaration = true; 30932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 31032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 31132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 31232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 31332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 31432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper bool consumeToken() { 315b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Tok = CurrentToken; 31632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 317b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (Tok->Tok.getKind()) { 31832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::plus: 31932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::minus: 320b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok->Previous == NULL && Line.MustBeDeclaration) 32132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_ObjCMethodSpecifier; 32232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 32332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::colon: 324b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok->Previous == NULL) 325cf6d76af806f7e1ba97be7b72b31bc78b919e0f0Daniel Jasper return false; 32632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Colons from ?: are handled in parseConditional(). 327b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok->Previous->is(tok::r_paren) && Contexts.size() == 1) { 32832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_CtorInitializerColon; 3293c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper } else if (Contexts.back().ColonIsDictLiteral) { 3303c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper Tok->Type = TT_DictLiteral; 3314e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } else if (Contexts.back().ColonIsObjCMethodExpr || 332b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->Type == TT_ObjCMethodSpecifier) { 33332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_ObjCMethodExpr; 334b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok->Previous->Type = TT_ObjCSelectorName; 33583a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko if (Tok->Previous->ColumnWidth > 33600895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko Contexts.back().LongestObjCSelectorName) { 33701fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko Contexts.back().LongestObjCSelectorName = Tok->Previous->ColumnWidth; 33800895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko } 3394e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (Contexts.back().FirstObjCSelectorName == NULL) 340b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Contexts.back().FirstObjCSelectorName = Tok->Previous; 3414e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } else if (Contexts.back().ColonIsForRangeExpr) { 34232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_RangeBasedForLoopColon; 34301fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko } else if (CurrentToken != NULL && 34401fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko CurrentToken->is(tok::numeric_constant)) { 34501fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko Tok->Type = TT_BitFieldColon; 346cea014bd8d280070caeb27e4e6e33e5723b4226fDaniel Jasper } else if (Contexts.size() == 1 && Line.First->isNot(tok::kw_enum)) { 3476cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper Tok->Type = TT_InheritanceColon; 348923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper } else if (Contexts.back().ContextKind == tok::l_paren) { 349923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper Tok->Type = TT_InlineASMColon; 35063d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 35132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 35232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_if: 35332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_while: 35432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken != NULL && CurrentToken->is(tok::l_paren)) { 35532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 3562726877196b41b922f10f794801b313980e1a8adNico Weber if (!parseParens(/*LookForDecls=*/true)) 35732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 35832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 35932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 36032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_for: 3614e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().ColonIsForRangeExpr = true; 36232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 36332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseParens()) 36432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 36532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 36632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::l_paren: 36732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseParens()) 36832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 36959875ac81b97de87ac6c4c7cb256ab71b75114f2Daniel Jasper if (Line.MustBeDeclaration && Contexts.size() == 1 && 37059875ac81b97de87ac6c4c7cb256ab71b75114f2Daniel Jasper !Contexts.back().IsExpression) 3713c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper Line.MightBeFunctionDecl = true; 37232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 37332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::l_square: 37432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseSquare()) 37532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 37632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 37732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::l_brace: 37832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!parseBrace()) 37932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 38032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 38132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::less: 3820236dd09c040f2e6124654d620dde94a595c5ab0Daniel Jasper if (Tok->Previous && !Tok->Previous->Tok.isLiteral() && parseAngle()) 38332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_TemplateOpener; 38432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper else { 38532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_BinaryOperator; 38632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken = Tok; 38732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 38832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 38932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 39032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::r_paren: 39132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::r_square: 39232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 39332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::r_brace: 39432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Lines can start with '}'. 395b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok->Previous != NULL) 39632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 39732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 39832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::greater: 39932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Tok->Type = TT_BinaryOperator; 40032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 40132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_operator: 402174f60f005167984d00682d1d38a2927b9c04684Daniel Jasper while (CurrentToken && 403174f60f005167984d00682d1d38a2927b9c04684Daniel Jasper !CurrentToken->isOneOf(tok::l_paren, tok::semi, tok::r_paren)) { 404e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (CurrentToken->isOneOf(tok::star, tok::amp)) 4052b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper CurrentToken->Type = TT_PointerOrReference; 4062b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper consumeToken(); 407174f60f005167984d00682d1d38a2927b9c04684Daniel Jasper if (CurrentToken && CurrentToken->Previous->Type == TT_BinaryOperator) 408c476ea976badd316e3afd0f34afe1f030a710117Daniel Jasper CurrentToken->Previous->Type = TT_OverloadedOperator; 40932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 4106ea933c7e8f6988d5647af4a0eafd393a4c3685aDaniel Jasper if (CurrentToken) { 4112b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper CurrentToken->Type = TT_OverloadedOperatorLParen; 412b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->Previous->Type == TT_BinaryOperator) 413b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek CurrentToken->Previous->Type = TT_OverloadedOperator; 4146ea933c7e8f6988d5647af4a0eafd393a4c3685aDaniel Jasper } 41532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 41632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::question: 41732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseConditional(); 41832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 41932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::kw_template: 42032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseTemplateDeclaration(); 42132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 422c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber case tok::identifier: 423b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->is(tok::kw_for) && 424b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok->Tok.getIdentifierInfo() == &Ident_in) 425c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber Tok->Type = TT_ObjCForIn; 426c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber break; 4278ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::comma: 4288ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper if (Contexts.back().FirstStartOfName) 4298ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true; 430e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper if (Contexts.back().InCtorInitializer) 431e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper Tok->Type = TT_CtorInitializerComma; 4328ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper break; 43332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper default: 43432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 43532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 43632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 43732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 43832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 43932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void parseIncludeDirective() { 44032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 44132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken != NULL && CurrentToken->is(tok::less)) { 44232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 44332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 444b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->isNot(tok::comment) || CurrentToken->Next) 44532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_ImplicitStringLiteral; 44632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 44732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 44832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } else { 44932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 4503a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper if (CurrentToken->is(tok::string_literal)) 4513a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper // Mark these string literals as "implicit" literals, too, so that 4523a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper // they are not split or line-wrapped. 4533a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper CurrentToken->Type = TT_ImplicitStringLiteral; 45432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 45532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 45632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 45732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 45832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 45932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void parseWarningOrError() { 46032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 46132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // We still want to format the whitespace left of the first token of the 46232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // warning or error. 46332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 46432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 46532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper CurrentToken->Type = TT_ImplicitStringLiteral; 46632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 46732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 46832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 46932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 47032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void parsePreprocessorDirective() { 47132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper next(); 47232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken == NULL) 47332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return; 474b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko if (CurrentToken->Tok.is(tok::numeric_constant)) { 475b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko CurrentToken->SpacesRequiredBefore = 1; 476b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko return; 477b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko } 47832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Hashes in the middle of a line can lead to any strange token 47932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // sequence. 480b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken->Tok.getIdentifierInfo() == NULL) 48132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return; 482b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (CurrentToken->Tok.getIdentifierInfo()->getPPKeywordID()) { 48332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_include: 48432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_import: 48532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseIncludeDirective(); 48632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 48732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_error: 48832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper case tok::pp_warning: 48932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parseWarningOrError(); 49032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 491aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper case tok::pp_if: 492aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper case tok::pp_elif: 493aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper parseLine(); 494aae7bad5cdd804cb88e918e9defbf5faf69f4cfdDaniel Jasper break; 49532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper default: 49632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper break; 49732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 4985b7e7b0ec77f49c1b24deffc9b7032ca16ca9f0dDaniel Jasper while (CurrentToken != NULL) 4995b7e7b0ec77f49c1b24deffc9b7032ca16ca9f0dDaniel Jasper next(); 50032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 50132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 50295e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weberpublic: 50332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper LineType parseLine() { 50432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::hash)) { 50532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper parsePreprocessorDirective(); 50632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_PreprocessorDirective; 50732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 50832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper while (CurrentToken != NULL) { 50932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (CurrentToken->is(tok::kw_virtual)) 51032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper KeywordVirtualFound = true; 51132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (!consumeToken()) 51232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_Invalid; 51332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 51432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (KeywordVirtualFound) 51532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_VirtualFunctionDecl; 51632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 517b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->Type == TT_ObjCMethodSpecifier) { 5184e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper if (Contexts.back().FirstObjCSelectorName != NULL) 5194e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 5204e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().LongestObjCSelectorName; 52163d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper return LT_ObjCMethodDecl; 52263d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper } 52363d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper 52432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return LT_Other; 52532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 52632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 52795e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weberprivate: 52832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper void next() { 5290178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (CurrentToken != NULL) { 5300178673f541685cf5067814dfeee2644078e39a9Daniel Jasper determineTokenType(*CurrentToken); 5314e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper CurrentToken->BindingStrength = Contexts.back().BindingStrength; 5320178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 5330178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 534b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (CurrentToken != NULL) 535b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek CurrentToken = CurrentToken->Next; 536d0f349be1422a123fdb28d6dd556f7300e6d51e9Daniel Jasper 537ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (CurrentToken != NULL) { 538ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek // Reset token type in case we have already looked at it and then 539ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek // recovered from an error (e.g. failure to find the matching >). 540ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (CurrentToken->Type != TT_LambdaLSquare && 541ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CurrentToken->Type != TT_ImplicitStringLiteral) 542ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CurrentToken->Type = TT_Unknown; 543ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (CurrentToken->Role) 544ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CurrentToken->Role.reset(NULL); 545ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CurrentToken->FakeLParens.clear(); 546ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek CurrentToken->FakeRParens = 0; 547ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek } 54832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 54932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 5504e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// \brief A struct to hold information valid in a specific context, e.g. 5514e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// a pair of parenthesis. 5524e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper struct Context { 553923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper Context(tok::TokenKind ContextKind, unsigned BindingStrength, 554923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper bool IsExpression) 555923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper : ContextKind(ContextKind), BindingStrength(BindingStrength), 556923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper LongestObjCSelectorName(0), ColonIsForRangeExpr(false), 5573c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper ColonIsDictLiteral(false), ColonIsObjCMethodExpr(false), 558f2ff8126e9e9df368f31b1f968d8fc80f99809b3Nico Weber FirstObjCSelectorName(NULL), FirstStartOfName(NULL), 559e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper IsExpression(IsExpression), CanBeExpression(true), 560e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper InCtorInitializer(false) {} 561923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper 562923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper tok::TokenKind ContextKind; 5634e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper unsigned BindingStrength; 5644e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper unsigned LongestObjCSelectorName; 5654e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool ColonIsForRangeExpr; 5663c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper bool ColonIsDictLiteral; 5674e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool ColonIsObjCMethodExpr; 568b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *FirstObjCSelectorName; 569b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *FirstStartOfName; 5704e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool IsExpression; 5716f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper bool CanBeExpression; 572e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper bool InCtorInitializer; 5734e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper }; 5744e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 5754e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// \brief Puts a new \c Context onto the stack \c Contexts for the lifetime 5764e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper /// of each instance. 5774e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper struct ScopedContextCreator { 5784e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper AnnotatingParser &P; 5794e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 580923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper ScopedContextCreator(AnnotatingParser &P, tok::TokenKind ContextKind, 581923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper unsigned Increase) 582923ebef120a37122ce50722a85cbe42c0c2dab53Daniel Jasper : P(P) { 5832a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper P.Contexts.push_back(Context(ContextKind, 5842a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper P.Contexts.back().BindingStrength + Increase, 5852a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper P.Contexts.back().IsExpression)); 5864e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper } 5874e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 5884e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper ~ScopedContextCreator() { P.Contexts.pop_back(); } 5894e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper }; 5900178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 591b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek void determineTokenType(FormatToken &Current) { 592b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Current.getPrecedence() == prec::Assignment && 59353352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper !Line.First->isOneOf(tok::kw_template, tok::kw_using) && 594b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek (!Current.Previous || Current.Previous->isNot(tok::kw_operator))) { 5954e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().IsExpression = true; 596b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek for (FormatToken *Previous = Current.Previous; 5977e27400c90e9e295bcf5857eebf2d60c4b32106eDaniel Jasper Previous && !Previous->isOneOf(tok::comma, tok::semi); 598b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Previous = Previous->Previous) { 5999c65b069821b7de79427e291b006293a0f55ff8fDaniel Jasper if (Previous->is(tok::r_square)) 6009c65b069821b7de79427e291b006293a0f55ff8fDaniel Jasper Previous = Previous->MatchingParen; 6010178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (Previous->Type == TT_BinaryOperator && 602e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Previous->isOneOf(tok::star, tok::amp)) { 6030178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Previous->Type = TT_PointerOrReference; 6040178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 6050178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 606e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::kw_return, tok::kw_throw) || 60795e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weber (Current.is(tok::l_paren) && !Line.MustBeDeclaration && 608378d93dcf7ec80661efc65642dc6266c9e13780aDaniel Jasper !Line.InPPDirective && 6092530fd5a235c1e57f8ebef2eae9b365042501009Manuel Klimek (!Current.Previous || 61053352600b7370b1d33b9fde1adda207fd9d7dcd1Daniel Jasper !Current.Previous->isOneOf(tok::kw_for, tok::kw_catch)))) { 6114e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Contexts.back().IsExpression = true; 612e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::r_paren, tok::greater, tok::comma)) { 613b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek for (FormatToken *Previous = Current.Previous; 614e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Previous && Previous->isOneOf(tok::star, tok::amp); 615b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Previous = Previous->Previous) 61695e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weber Previous->Type = TT_PointerOrReference; 617b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek } else if (Current.Previous && 618b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current.Previous->Type == TT_CtorInitializerColon) { 619d0f349be1422a123fdb28d6dd556f7300e6d51e9Daniel Jasper Contexts.back().IsExpression = true; 620e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper Contexts.back().InCtorInitializer = true; 6216f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper } else if (Current.is(tok::kw_new)) { 6226f21a988990ff5872822dcb049bd8fc65ce3d236Daniel Jasper Contexts.back().CanBeExpression = false; 62316a69ef481f4580c571b6c693a5d3dd64ea56b53Daniel Jasper } else if (Current.is(tok::semi)) { 62416a69ef481f4580c571b6c693a5d3dd64ea56b53Daniel Jasper // This should be the condition or increment in a for-loop. 62516a69ef481f4580c571b6c693a5d3dd64ea56b53Daniel Jasper Contexts.back().IsExpression = true; 62695e8e468af284afb11ec1f994d0b5076fc7423d9Nico Weber } 6270178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 6280178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (Current.Type == TT_Unknown) { 6296b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper // Line.MightBeFunctionDecl can only be true after the parentheses of a 6306b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper // function declaration have been found. In this case, 'Current' is a 6316b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper // trailing token of this declaration and thus cannot be a name. 6326b3ff8c4caaa6782289a780e096fe56ad6434bb7Daniel Jasper if (isStartOfName(Current) && !Line.MightBeFunctionDecl) { 6338ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper Contexts.back().FirstStartOfName = &Current; 6343c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper Current.Type = TT_StartOfName; 6352ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper } else if (Current.is(tok::kw_auto)) { 6362ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper AutoFound = true; 6373262f4c10520cf11acea4cf590cfbf055924a41eDaniel Jasper } else if (Current.is(tok::arrow) && AutoFound && 6383262f4c10520cf11acea4cf590cfbf055924a41eDaniel Jasper Line.MustBeDeclaration) { 6392ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper Current.Type = TT_TrailingReturnArrow; 640e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::star, tok::amp, tok::ampamp)) { 6414e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper Current.Type = 642d6104f6c34639ebe66f83d955c5f32ea4a50c266Daniel Jasper determineStarAmpUsage(Current, Contexts.back().CanBeExpression && 643d6104f6c34639ebe66f83d955c5f32ea4a50c266Daniel Jasper Contexts.back().IsExpression); 644e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::minus, tok::plus, tok::caret)) { 6450178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = determinePlusMinusCaretUsage(Current); 646e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko } else if (Current.isOneOf(tok::minusminus, tok::plusplus)) { 6470178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = determineIncrementUsage(Current); 6480178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } else if (Current.is(tok::exclaim)) { 6490178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_UnaryOperator; 65031e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek } else if (Current.isBinaryOperator() && 65131e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek (!Current.Previous || 65231e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek Current.Previous->isNot(tok::l_square))) { 6530178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_BinaryOperator; 6540178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } else if (Current.is(tok::comment)) { 65500895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko if (Current.TokenText.startswith("//")) 6560178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_LineComment; 6570178673f541685cf5067814dfeee2644078e39a9Daniel Jasper else 6580178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_BlockComment; 65937d693160eba22343e08d7bcf66cd132ace77e5cNico Weber } else if (Current.is(tok::r_paren)) { 660b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper FormatToken *LeftOfParens = NULL; 661b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper if (Current.MatchingParen) 6620bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko LeftOfParens = Current.MatchingParen->getPreviousNonComment(); 663b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper bool IsCast = false; 664b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper bool ParensAreEmpty = Current.Previous == Current.MatchingParen; 665b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper bool ParensAreType = !Current.Previous || 666b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current.Previous->Type == TT_PointerOrReference || 667b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper Current.Previous->Type == TT_TemplateCloser || 668b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper isSimpleTypeSpecifier(*Current.Previous); 66937d693160eba22343e08d7bcf66cd132ace77e5cNico Weber bool ParensCouldEndDecl = 670b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current.Next && 671b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current.Next->isOneOf(tok::equal, tok::semi, tok::l_brace); 6726a365aaa057a8c445d25344c0433726c752b3e7dDaniel Jasper bool IsSizeOfOrAlignOf = 673b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper LeftOfParens && 674b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper LeftOfParens->isOneOf(tok::kw_sizeof, tok::kw_alignof); 675b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper if (ParensAreType && !ParensCouldEndDecl && !IsSizeOfOrAlignOf && 6760c368787d9d1f92a3408b71b3f074a06edaa6bdeDaniel Jasper (Contexts.back().IsExpression || 6770c368787d9d1f92a3408b71b3f074a06edaa6bdeDaniel Jasper (Current.Next && Current.Next->isBinaryOperator()))) 678b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper IsCast = true; 6792a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper if (Current.Next && Current.Next->isNot(tok::string_literal) && 680b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper (Current.Next->Tok.isLiteral() || 681b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper Current.Next->isOneOf(tok::kw_sizeof, tok::kw_alignof))) 682b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper IsCast = true; 683b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper // If there is an identifier after the (), it is likely a cast, unless 684b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper // there is also an identifier before the (). 685ff1a2e519ebcd6d7a060eac7ba8aca37b2bf89d0Daniel Jasper if (LeftOfParens && (LeftOfParens->Tok.getIdentifierInfo() == NULL || 686ff1a2e519ebcd6d7a060eac7ba8aca37b2bf89d0Daniel Jasper LeftOfParens->is(tok::kw_return)) && 687526df0f3a8d436e9084bd12118a2e119aa0bd724Daniel Jasper LeftOfParens->Type != TT_OverloadedOperator && 688465e8615a153ebd70eb27785af79f7e82e4a81d4Nico Weber LeftOfParens->Type != TT_TemplateCloser && Current.Next && 689465e8615a153ebd70eb27785af79f7e82e4a81d4Nico Weber Current.Next->is(tok::identifier)) 690b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper IsCast = true; 691b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper if (IsCast && !ParensAreEmpty) 69237d693160eba22343e08d7bcf66cd132ace77e5cNico Weber Current.Type = TT_CastRParen; 693b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek } else if (Current.is(tok::at) && Current.Next) { 694b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (Current.Next->Tok.getObjCKeywordID()) { 6950178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_interface: 6960178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_implementation: 6970178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_protocol: 6980178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_ObjCDecl; 6990178673f541685cf5067814dfeee2644078e39a9Daniel Jasper break; 7000178673f541685cf5067814dfeee2644078e39a9Daniel Jasper case tok::objc_property: 7010178673f541685cf5067814dfeee2644078e39a9Daniel Jasper Current.Type = TT_ObjCProperty; 7020178673f541685cf5067814dfeee2644078e39a9Daniel Jasper break; 7030178673f541685cf5067814dfeee2644078e39a9Daniel Jasper default: 7040178673f541685cf5067814dfeee2644078e39a9Daniel Jasper break; 7050178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7065ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper } else if (Current.is(tok::period)) { 7070bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko FormatToken *PreviousNoComment = Current.getPreviousNonComment(); 7085ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (PreviousNoComment && 7095ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper PreviousNoComment->isOneOf(tok::comma, tok::l_brace)) 7105ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper Current.Type = TT_DesignatedInitializerPeriod; 7110178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7120178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7130178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7140178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 7156ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// \brief Take a guess at whether \p Tok starts a name of a function or 7166ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// variable declaration. 7176ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// 7186ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// This is a heuristic based on whether \p Tok is an identifier following 7196ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper /// something that is likely a type. 7206ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper bool isStartOfName(const FormatToken &Tok) { 7216ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper if (Tok.isNot(tok::identifier) || Tok.Previous == NULL) 7226ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper return false; 7236ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 7246ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper // Skip "const" as it does not have an influence on whether this is a name. 7256ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper FormatToken *PreviousNotConst = Tok.Previous; 7266ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper while (PreviousNotConst != NULL && PreviousNotConst->is(tok::kw_const)) 7276ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper PreviousNotConst = PreviousNotConst->Previous; 7286ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 7296ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper if (PreviousNotConst == NULL) 7306ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper return false; 7316ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 7322a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper bool IsPPKeyword = PreviousNotConst->is(tok::identifier) && 7332a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper PreviousNotConst->Previous && 7342a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper PreviousNotConst->Previous->is(tok::hash); 7356ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 73692495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper if (PreviousNotConst->Type == TT_TemplateCloser) 73792495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper return PreviousNotConst && PreviousNotConst->MatchingParen && 73892495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper PreviousNotConst->MatchingParen->Previous && 73992495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper PreviousNotConst->MatchingParen->Previous->isNot(tok::kw_template); 74092495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper 7416ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper return (!IsPPKeyword && PreviousNotConst->is(tok::identifier)) || 7426ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper PreviousNotConst->Type == TT_PointerOrReference || 7436ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper isSimpleTypeSpecifier(*PreviousNotConst); 7446ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper } 7456ac431c7bae27a42351d2c2ad03dddd5b005ffd5Daniel Jasper 7460178673f541685cf5067814dfeee2644078e39a9Daniel Jasper /// \brief Return the type of the given token assuming it is * or &. 747b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek TokenType determineStarAmpUsage(const FormatToken &Tok, bool IsExpression) { 7480bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *PrevToken = Tok.getPreviousNonComment(); 7490178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (PrevToken == NULL) 7500178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 7510178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 7520bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *NextToken = Tok.getNextNonComment(); 7530178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (NextToken == NULL) 7540178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_Unknown; 7550178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 756431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper if (PrevToken->is(tok::coloncolon) || 757431f5918281dd1f178bf838b7a47ab1d11c52961Daniel Jasper (PrevToken->is(tok::l_paren) && !IsExpression)) 7588a5d7cd100ebfb8c6b353ee4ad5b14ab4105d32dDaniel Jasper return TT_PointerOrReference; 7598a5d7cd100ebfb8c6b353ee4ad5b14ab4105d32dDaniel Jasper 760e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (PrevToken->isOneOf(tok::l_paren, tok::l_square, tok::l_brace, 761d3cf17b5f1fed43dbd0cd35c43d15139803c9c84Daniel Jasper tok::comma, tok::semi, tok::kw_return, tok::colon, 76265da8e952da32730202356290bb889c8839bbef5Daniel Jasper tok::equal, tok::kw_delete, tok::kw_sizeof) || 763e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko PrevToken->Type == TT_BinaryOperator || 7640178673f541685cf5067814dfeee2644078e39a9Daniel Jasper PrevToken->Type == TT_UnaryOperator || PrevToken->Type == TT_CastRParen) 7650178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 7660178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 767e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber if (NextToken->is(tok::l_square)) 768e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber return TT_PointerOrReference; 769e8a97985f72b4e11435ff2107c0f11e925fb6d96Nico Weber 770db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper if (PrevToken->is(tok::r_paren) && PrevToken->MatchingParen && 771db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper PrevToken->MatchingParen->Previous && 772db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper PrevToken->MatchingParen->Previous->is(tok::kw_typeof)) 773db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper return TT_PointerOrReference; 774db8afe424991b34884afb13ecf97ac458e41da9eDaniel Jasper 775b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (PrevToken->Tok.isLiteral() || 776e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko PrevToken->isOneOf(tok::r_paren, tok::r_square) || 777b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek NextToken->Tok.isLiteral() || NextToken->isUnaryOperator()) 7780178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_BinaryOperator; 7790178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 7800178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // It is very unlikely that we are going to find a pointer or reference type 7810178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // definition on the RHS of an assignment. 7820178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (IsExpression) 7830178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_BinaryOperator; 7840178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 7850178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_PointerOrReference; 7860178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 7870178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 788b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek TokenType determinePlusMinusCaretUsage(const FormatToken &Tok) { 7890bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *PrevToken = Tok.getPreviousNonComment(); 790b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper if (PrevToken == NULL || PrevToken->Type == TT_CastRParen) 7910178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 7920178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 7930178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // Use heuristics to recognize unary operators. 794e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (PrevToken->isOneOf(tok::equal, tok::l_paren, tok::comma, tok::l_square, 795e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::question, tok::colon, tok::kw_return, 796e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::kw_case, tok::at, tok::l_brace)) 7970178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 7980178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 799ee0feec7362053f22b6c01d12e1bfa06fb3ac93fNico Weber // There can't be two consecutive binary operators. 8000178673f541685cf5067814dfeee2644078e39a9Daniel Jasper if (PrevToken->Type == TT_BinaryOperator) 8010178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 8020178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 8030178673f541685cf5067814dfeee2644078e39a9Daniel Jasper // Fall back to marking the token as binary operator. 8040178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_BinaryOperator; 8050178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 8060178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 8070178673f541685cf5067814dfeee2644078e39a9Daniel Jasper /// \brief Determine whether ++/-- are pre- or post-increments/-decrements. 808b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek TokenType determineIncrementUsage(const FormatToken &Tok) { 8090bdc6434fa0fea933b6ab566eff751afdba40a2aAlexander Kornienko const FormatToken *PrevToken = Tok.getPreviousNonComment(); 810b8b4295b4ee161bfb76ff7b0ec1007bfd959553bDaniel Jasper if (PrevToken == NULL || PrevToken->Type == TT_CastRParen) 8110178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 812e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::identifier)) 8130178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_TrailingUnaryOperator; 8140178673f541685cf5067814dfeee2644078e39a9Daniel Jasper 8150178673f541685cf5067814dfeee2644078e39a9Daniel Jasper return TT_UnaryOperator; 8160178673f541685cf5067814dfeee2644078e39a9Daniel Jasper } 8174e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 8188ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper // FIXME: This is copy&pasted from Sema. Put it in a common place and remove 8198ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper // duplication. 8208ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper /// \brief Determine whether the token kind starts a simple-type-specifier. 821b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek bool isSimpleTypeSpecifier(const FormatToken &Tok) const { 822b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek switch (Tok.Tok.getKind()) { 8238ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_short: 8248ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_long: 8258ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw___int64: 8268ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw___int128: 8278ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_signed: 8288ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_unsigned: 8298ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_void: 8308ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_char: 8318ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_int: 8328ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_half: 8338ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_float: 8348ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_double: 8358ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_wchar_t: 8368ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_bool: 8378ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw___underlying_type: 8388ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::annot_typename: 8398ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_char16_t: 8408ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_char32_t: 8418ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_typeof: 8428ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper case tok::kw_decltype: 84300895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko return true; 8448ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper default: 84500895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko return false; 8468ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper } 8478ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper } 8488ed9f2b25f082a1643ab5310f9eec33cf31a7577Daniel Jasper 8494e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper SmallVector<Context, 8> Contexts; 8504e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper 851d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper const FormatStyle &Style; 8524e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper AnnotatedLine &Line; 853b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *CurrentToken; 8544e778091b0ff42895644ca8bef30f1a91ba6b32bDaniel Jasper bool KeywordVirtualFound; 8552ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper bool AutoFound; 856c2e6d2a4a7fe9dfa7d52a38c6048b7b18e6b591aNico Weber IdentifierInfo &Ident_in; 85732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper}; 85832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 859d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasperstatic int PrecedenceUnaryOperator = prec::PointerToMember + 1; 860d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasperstatic int PrecedenceArrowAndPeriod = prec::PointerToMember + 2; 861d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper 86229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper/// \brief Parses binary expressions by inserting fake parenthesis based on 86329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper/// operator precedence. 86429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasperclass ExpressionParser { 86529f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasperpublic: 8669acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper ExpressionParser(AnnotatedLine &Line) : Current(Line.First) { 8679acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper // Skip leading "}", e.g. in "} else if (...) {". 8689acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper if (Current->is(tok::r_brace)) 8699acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper next(); 8709acb8b4355028887e8cc4aa8f683aceee021a62bDaniel Jasper } 87129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 87229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper /// \brief Parse expressions with the given operatore precedence. 873237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper void parse(int Precedence = 0) { 874966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper // Skip 'return' and ObjC selector colons as they are not part of a binary 875966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper // expression. 876966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper while (Current && 877966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper (Current->is(tok::kw_return) || 878966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper (Current->is(tok::colon) && Current->Type == TT_ObjCMethodExpr))) 879f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper next(); 880f78bf4a0132a3ea366ba3baadd9d6af26c617d11Daniel Jasper 881d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Current == NULL || Precedence > PrecedenceArrowAndPeriod) 8823618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper return; 8833618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 884c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper // Conditional expressions need to be parsed separately for proper nesting. 885d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Precedence == prec::Conditional) { 886c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper parseConditionalExpr(); 887c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper return; 888c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper } 8893618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 8903618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper // Parse unary operators, which all have a higher precedence than binary 8913618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper // operators. 892d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Precedence == PrecedenceUnaryOperator) { 8933618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper parseUnaryOperator(); 89429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper return; 8953618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 89629f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 897b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Start = Current; 898d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper FormatToken *LatestOperator = NULL; 89929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 900237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper while (Current) { 90129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // Consume operators with higher precedence. 902bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper parse(Precedence + 1); 90329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 9043618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper int CurrentPrecedence = getCurrentPrecedence(); 9053618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 9063618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper if (Current && Current->Type == TT_ObjCSelectorName && 9073618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper Precedence == CurrentPrecedence) 9083618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper Start = Current; 909237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper 91029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // At the end of the line or when an operator with higher precedence is 91129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // found, insert fake parenthesis and return. 912ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper if (Current == NULL || Current->closesScope() || 913d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper (CurrentPrecedence != -1 && CurrentPrecedence < Precedence)) { 914d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (LatestOperator) { 915d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Precedence == PrecedenceArrowAndPeriod) { 916d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper LatestOperator->LastInChainOfCalls = true; 917d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper // Call expressions don't have a binary operator precedence. 918d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper addFakeParenthesis(Start, prec::Unknown); 919d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } else { 920d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper addFakeParenthesis(Start, prec::Level(Precedence)); 921d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } 922d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } 92329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper return; 92429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 92529f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 92629f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // Consume scopes: (), [], <> and {} 927ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper if (Current->opensScope()) { 928ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper while (Current && !Current->closesScope()) { 92929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper next(); 93029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper parse(); 93129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 93229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper next(); 93329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } else { 93429f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper // Operator found. 935237d4c1c785be13656bff6c09e5b7ccd066ff5baDaniel Jasper if (CurrentPrecedence == Precedence) 936d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper LatestOperator = Current; 93729f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 93829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper next(); 93929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 94029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 94129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 94229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 94329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasperprivate: 9443618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// \brief Gets the precedence (+1) of the given token for binary operators 9453618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// and other tokens that we treat like binary operators. 9463618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper int getCurrentPrecedence() { 9473618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper if (Current) { 9483618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper if (Current->Type == TT_ConditionalExpr) 949d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return prec::Conditional; 950966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper else if (Current->is(tok::semi) || Current->Type == TT_InlineASMColon || 951966e6d3a174856ff3fe3d6cfe294ebae832f6c09Daniel Jasper Current->Type == TT_ObjCSelectorName) 952d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return 0; 9533618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper else if (Current->Type == TT_BinaryOperator || Current->is(tok::comma)) 954d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return Current->getPrecedence(); 955d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper else if (Current->isOneOf(tok::period, tok::arrow)) 956d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return PrecedenceArrowAndPeriod; 9573618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 958d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper return -1; 9593618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 9603618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 961c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper void addFakeParenthesis(FormatToken *Start, prec::Level Precedence) { 962c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper Start->FakeLParens.push_back(Precedence); 963db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper if (Precedence > prec::Unknown) 964db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper Start->StartsBinaryExpression = true; 965db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper if (Current) { 966c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper ++Current->Previous->FakeRParens; 967db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper if (Precedence > prec::Unknown) 968db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper Current->Previous->EndsBinaryExpression = true; 969db4813a3997fcf3864d1190f8021ef68e42cc057Daniel Jasper } 970c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper } 971c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper 9723618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// \brief Parse unary operator expressions and surround them with fake 9733618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper /// parentheses if appropriate. 9743618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper void parseUnaryOperator() { 975d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper if (Current == NULL || Current->Type != TT_UnaryOperator) { 976d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parse(PrecedenceArrowAndPeriod); 9773618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper return; 978d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper } 9793618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 9803618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper FormatToken *Start = Current; 9813618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper next(); 982d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parseUnaryOperator(); 9833618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 9843618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper // The actual precedence doesn't matter. 985d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper addFakeParenthesis(Start, prec::Unknown); 9863618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper } 9873618e6fae8b734ad94221d941417c12d4bd1e3a8Daniel Jasper 988c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper void parseConditionalExpr() { 989c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper FormatToken *Start = Current; 990d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parse(prec::LogicalOr); 991c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper if (!Current || !Current->is(tok::question)) 992c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper return; 993c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper next(); 994d489f8ceb735458b0e1f814e3f952b154f49c025Daniel Jasper parse(prec::LogicalOr); 995c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper if (!Current || Current->Type != TT_ConditionalExpr) 996c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper return; 997c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper next(); 998c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper parseConditionalExpr(); 999c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper addFakeParenthesis(Start, prec::Conditional); 1000c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper } 1001c01897c3f6139304ed25e3f673bef77be209617fDaniel Jasper 100229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper void next() { 1003d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko if (Current) 1004d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko Current = Current->Next; 1005d71b15badeecdc049440103ef044f9cdf5e1359cAlexander Kornienko while (Current && Current->isTrailingComment()) 1006b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current = Current->Next; 100729f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper } 100829f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 1009b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Current; 101029f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper}; 101129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 101214e66498781b7d81639bdc48716e09700552ac21Craig Topper} // end anonymous namespace 101314e66498781b7d81639bdc48716e09700552ac21Craig Topper 1014b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jaspervoid 1015b77d741691a2775b5c31e29f021203cc659c26dfDaniel JasperTokenAnnotator::setCommentLineLevels(SmallVectorImpl<AnnotatedLine *> &Lines) { 1016b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper const AnnotatedLine *NextNonCommentLine = NULL; 10172a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper for (SmallVectorImpl<AnnotatedLine *>::reverse_iterator I = Lines.rbegin(), 10182a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper E = Lines.rend(); 10192a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper I != E; ++I) { 10202a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper if (NextNonCommentLine && (*I)->First->is(tok::comment) && 10212a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper (*I)->First->Next == NULL) 10222a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper (*I)->Level = NextNonCommentLine->Level; 1023b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper else 10242a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper NextNonCommentLine = (*I)->First->isNot(tok::r_brace) ? (*I) : NULL; 10252a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper 10262a80ad6fe7aa506b1df2bb638bc367d9e760f707Daniel Jasper setCommentLineLevels((*I)->Children); 1027b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper } 1028b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper} 1029b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper 10308ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jaspervoid TokenAnnotator::annotate(AnnotatedLine &Line) { 1031b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper for (SmallVectorImpl<AnnotatedLine *>::iterator I = Line.Children.begin(), 1032b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper E = Line.Children.end(); 1033567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I != E; ++I) { 1034567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper annotate(**I); 1035567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper } 1036d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper AnnotatingParser Parser(Style, Line, Ident_in); 103732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = Parser.parseLine(); 103832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Line.Type == LT_Invalid) 103932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return; 104032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 104129f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper ExpressionParser ExprParser(Line); 104229f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper ExprParser.parse(); 104329f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper 1044b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->Type == TT_ObjCMethodSpecifier) 104532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = LT_ObjCMethodDecl; 1046b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek else if (Line.First->Type == TT_ObjCDecl) 104732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = LT_ObjCDecl; 1048b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek else if (Line.First->Type == TT_ObjCProperty) 104932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Line.Type = LT_ObjCProperty; 105032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1051b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->SpacesRequiredBefore = 1; 1052b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Line.First->CanBreakBefore = Line.First->MustBreakBefore; 105332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 105432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 10558ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jaspervoid TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { 105683a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Line.First->TotalLength = 105783a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Line.First->IsMultiline ? Style.ColumnLimit : Line.First->ColumnWidth; 1058b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (!Line.First->Next) 10598ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper return; 1060b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Current = Line.First->Next; 1061dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper bool InFunctionDecl = Line.MightBeFunctionDecl; 10628ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper while (Current != NULL) { 1063729a743b317d877df3978e88a4a247d2edbf2090Daniel Jasper if (Current->Type == TT_LineComment) 1064729a743b317d877df3978e88a4a247d2edbf2090Daniel Jasper Current->SpacesRequiredBefore = Style.SpacesBeforeTrailingComments; 1065b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko else if (Current->SpacesRequiredBefore == 0 && 1066b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko spaceRequiredBefore(Line, *Current)) 1067b18c258390f794d8803ef5ebbb56fb77bfea7ba4Alexander Kornienko Current->SpacesRequiredBefore = 1; 10688ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper 1069ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Current->MustBreakBefore = 1070ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Current->MustBreakBefore || mustBreakBefore(Line, *Current); 1071ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper 10728ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper Current->CanBreakBefore = 10738ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper Current->MustBreakBefore || canBreakBefore(Line, *Current); 1074567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (Current->MustBreakBefore || !Current->Children.empty() || 107583a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Current->IsMultiline) 1076b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current->TotalLength = Current->Previous->TotalLength + Style.ColumnLimit; 10778ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper else 10782a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper Current->TotalLength = Current->Previous->TotalLength + 107983a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Current->ColumnWidth + 10802a409b62126d8f0b8f5749d5ed435ad2b394b526Daniel Jasper Current->SpacesRequiredBefore; 1081dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper 1082dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper if (Current->Type == TT_CtorInitializerColon) 1083dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper InFunctionDecl = false; 1084dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper 10858ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper // FIXME: Only calculate this if CanBreakBefore is true once static 10868ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper // initializers etc. are sorted out. 10878ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper // FIXME: Move magic numbers to a better place. 1088dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper Current->SplitPenalty = 20 * Current->BindingStrength + 1089dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper splitPenalty(Line, *Current, InFunctionDecl); 10908ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasper 1091b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current = Current->Next; 109232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 1093bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper 1094e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek calculateUnbreakableTailLengths(Line); 1095d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper for (Current = Line.First; Current != NULL; Current = Current->Next) { 1096d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper if (Current->Role) 1097d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper Current->Role->precomputeFormattingInfos(Current); 1098d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper } 1099d4a03dbb0bdbd4908375306283cb61813bd8f454Daniel Jasper 1100567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper DEBUG({ printDebugInfo(Line); }); 1101567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper 1102b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper for (SmallVectorImpl<AnnotatedLine *>::iterator I = Line.Children.begin(), 1103b77d741691a2775b5c31e29f021203cc659c26dfDaniel Jasper E = Line.Children.end(); 1104567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper I != E; ++I) { 1105567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper calculateFormattingInformation(**I); 1106567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper } 110732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 110832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1109e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimekvoid TokenAnnotator::calculateUnbreakableTailLengths(AnnotatedLine &Line) { 1110e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek unsigned UnbreakableTailLength = 0; 1111b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek FormatToken *Current = Line.Last; 1112e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek while (Current != NULL) { 1113e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek Current->UnbreakableTailLength = UnbreakableTailLength; 1114e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek if (Current->CanBreakBefore || 1115e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek Current->isOneOf(tok::comment, tok::string_literal)) { 1116e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek UnbreakableTailLength = 0; 1117e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek } else { 1118e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek UnbreakableTailLength += 111983a7dcdf5fce1bdf74ce985419d77a41a51abfa2Alexander Kornienko Current->ColumnWidth + Current->SpacesRequiredBefore; 1120e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek } 1121b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Current = Current->Previous; 1122e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek } 1123e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek} 1124e573c3f7fc40e813559ab4ff1e7eec4f66f1a50fManuel Klimek 11258ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperunsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, 1126dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper const FormatToken &Tok, 1127dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper bool InFunctionDecl) { 1128b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Left = *Tok.Previous; 1129b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Right = Tok; 113032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 11315ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (Left.is(tok::semi)) 11325ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper return 0; 11335ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (Left.is(tok::comma)) 11345ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper return 1; 1135011c35dabb4c8abcb7389d8fbc6316f8f23576abDaniel Jasper if (Right.is(tok::l_square)) 1136011c35dabb4c8abcb7389d8fbc6316f8f23576abDaniel Jasper return 150; 11375ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper 11386561f6a13b79ed752748ede590792191edf78ce8Daniel Jasper if (Right.Type == TT_StartOfName || Right.is(tok::kw_operator)) { 1139b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->is(tok::kw_for) && Right.PartOfMultiVariableDeclStmt) 11403c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper return 3; 1141c18cff311118fc6a30929468fc82b2b35cbd7fbfDaniel Jasper if (Left.Type == TT_StartOfName) 1142c18cff311118fc6a30929468fc82b2b35cbd7fbfDaniel Jasper return 20; 1143dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper if (InFunctionDecl && Right.BindingStrength == 1) 11443c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper // FIXME: Clean up hack of using BindingStrength to find top-level names. 11453c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper return Style.PenaltyReturnTypeOnItsOwnLine; 114692495a8032d8624495a0ce769d5a6cdeba2dc8d8Daniel Jasper return 200; 11473c08a818a6ac9115fe8880af9bbf5a0a87bdffaaDaniel Jasper } 114832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::equal) && Right.is(tok::l_brace)) 114932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 150; 1150198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper if (Left.Type == TT_CastRParen) 1151198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper return 100; 115232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::coloncolon)) 115332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 500; 11546b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper if (Left.isOneOf(tok::kw_class, tok::kw_struct)) 11556b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper return 5000; 115632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 11576cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper if (Left.Type == TT_RangeBasedForLoopColon || 11586cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper Left.Type == TT_InheritanceColon) 115984a1a63b034744b68a27ec171dca5b1b7cf303f0Daniel Jasper return 2; 116032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1161d3fef0fe26da19685bdec6a1bd844505f604d593Daniel Jasper if (Right.isMemberAccess()) { 11622f0a020d29286805e48b74b127fbf153af2c4ce7Daniel Jasper if (Left.isOneOf(tok::r_paren, tok::r_square) && Left.MatchingParen && 11632f0a020d29286805e48b74b127fbf153af2c4ce7Daniel Jasper Left.MatchingParen->ParameterCount > 0) 1164518ee34467c0722e253a58efea20456e96aa5802Daniel Jasper return 20; // Should be smaller than breaking at a nested comma. 116532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 150; 116632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 116732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 116820a0f8cff96505abb65233a2eaf3af3cd8536cd2Daniel Jasper // Breaking before a trailing 'const' or not-function-like annotation is bad. 1169aa9e7b18a88d715b63e7b65d1b26a1759decc177Daniel Jasper if (Left.is(tok::r_paren) && Line.Type != LT_ObjCProperty && 117020a0f8cff96505abb65233a2eaf3af3cd8536cd2Daniel Jasper (Right.is(tok::kw_const) || (Right.is(tok::identifier) && Right.Next && 117120a0f8cff96505abb65233a2eaf3af3cd8536cd2Daniel Jasper Right.Next->isNot(tok::l_paren)))) 117253eb05ac6a00b95baf5680d9378ae8819dd09471Daniel Jasper return 100; 11735ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper 117432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // In for-loops, prefer breaking at ',' and ';'. 1175b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Line.First->is(tok::kw_for) && Left.is(tok::equal)) 11767d81281fc39f6d40d86be6600adba13c05b4a639Daniel Jasper return 4; 117732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 117832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // In Objective-C method expressions, prefer breaking before "param:" over 117932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // breaking after it. 118063d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper if (Right.Type == TT_ObjCSelectorName) 118132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 0; 118263d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper if (Left.is(tok::colon) && Left.Type == TT_ObjCMethodExpr) 118332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 20; 118432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1185dbfb5f37f4d003ae6935b87a103b7827d5069690Daniel Jasper if (Left.is(tok::l_paren) && InFunctionDecl) 11861407bee187d7b964d5293ac8bf4f7a490c78cec6Daniel Jasper return 100; 1187ac3223e45e7d17c65b143439313800eef4fdf71dDaniel Jasper if (Left.opensScope()) 118847066e46b9ce4f830ead3c7b9a4cb5bf0ac2c857Daniel Jasper return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter 118947066e46b9ce4f830ead3c7b9a4cb5bf0ac2c857Daniel Jasper : 19; 119032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 11914e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper if (Right.is(tok::lessless)) { 11924e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper if (Left.is(tok::string_literal)) { 119300895106f9ed602af67984ec4d225a0cdc8c12afAlexander Kornienko StringRef Content = Left.TokenText; 119420376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper if (Content.startswith("\"")) 119520376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper Content = Content.drop_front(1); 119620376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper if (Content.endswith("\"")) 119720376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper Content = Content.drop_back(1); 119820376989402fb187c0bc48209f46560b9e402ea2Daniel Jasper Content = Content.trim(); 1199bfa1edd8247b80e951a570ff2486fe5fa9898c41Daniel Jasper if (Content.size() > 1 && 1200bfa1edd8247b80e951a570ff2486fe5fa9898c41Daniel Jasper (Content.back() == ':' || Content.back() == '=')) 12019637dda705e39110bfff66742542a58dd2470ad2Daniel Jasper return 25; 12024e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper } 12030c368787d9d1f92a3408b71b3f074a06edaa6bdeDaniel Jasper return 1; // Breaking at a << is really cheap. 12044e8a7b4a95962f63a938c0d21c9aca0a51b78345Daniel Jasper } 120532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.Type == TT_ConditionalExpr) 1206518ee34467c0722e253a58efea20456e96aa5802Daniel Jasper return prec::Conditional; 1207b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek prec::Level Level = Left.getPrecedence(); 120832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 120932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Level != prec::Unknown) 121032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Level; 1211248497199bc56e86d1c089beb9529f3b3d77abb1Daniel Jasper 121232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return 3; 121332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 121432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 12158ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperbool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, 1216b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Left, 1217b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Right) { 121832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::hashhash)) 121932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Left.is(tok::hash); 1220e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (Left.isOneOf(tok::hashhash, tok::hash)) 122132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Right.is(tok::hash); 12227df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper if (Left.is(tok::l_paren) && Right.is(tok::r_paren)) 12237df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper return Style.SpaceInEmptyParentheses; 12247df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper if (Left.is(tok::l_paren) || Right.is(tok::r_paren)) 122534f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper return (Right.Type == TT_CastRParen || 122634f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper (Left.MatchingParen && Left.MatchingParen->Type == TT_CastRParen)) 12277df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper ? Style.SpacesInCStyleCastParentheses 12287df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper : Style.SpacesInParentheses; 1229d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper if (Style.SpacesInAngles && 1230d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper ((Left.Type == TT_TemplateOpener) != (Right.Type == TT_TemplateCloser))) 1231d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper return true; 12327df56bfcf7186f73c99564cd54216f07a8db7352Daniel Jasper if (Right.isOneOf(tok::semi, tok::comma)) 123332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 123432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::less) && 123532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper (Left.is(tok::kw_template) || 123632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper (Line.Type == LT_ObjCDecl && Style.ObjCSpaceBeforeProtocolList))) 123732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 123832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::arrow) || Right.is(tok::arrow)) 123932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1240e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (Left.isOneOf(tok::exclaim, tok::tilde)) 124132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 124232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::at) && 1243e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Right.isOneOf(tok::identifier, tok::string_literal, tok::char_constant, 1244e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::numeric_constant, tok::l_paren, tok::l_brace, 1245e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko tok::kw_true, tok::kw_false)) 124632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 124732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::coloncolon)) 124832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 124932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::coloncolon)) 125078a4e619e775b0dbaa10c9feaea0adf1d3dfe507Daniel Jasper return (Left.is(tok::less) && Style.Standard == FormatStyle::LS_Cpp03) || 125178a4e619e775b0dbaa10c9feaea0adf1d3dfe507Daniel Jasper !Left.isOneOf(tok::identifier, tok::greater, tok::l_paren, 125278a4e619e775b0dbaa10c9feaea0adf1d3dfe507Daniel Jasper tok::r_paren, tok::less); 1253e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko if (Left.is(tok::less) || Right.isOneOf(tok::greater, tok::less)) 125432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1255c47d7f1237b022eabbbdcebf77506e8a81aa54bdDaniel Jasper if (Right.is(tok::ellipsis)) 1256b3c887dcb70220eced72935725cd94d7e8325912Daniel Jasper return Left.Tok.isLiteral(); 125731e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek if (Left.is(tok::l_square) && Right.is(tok::amp)) 125831e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek return false; 12593fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko if (Right.Type == TT_PointerOrReference) 1260b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek return Left.Tok.isLiteral() || 12613fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko ((Left.Type != TT_PointerOrReference) && Left.isNot(tok::l_paren) && 12623fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko !Style.PointerBindsToType); 12633ff4a2fea4aa6e5182b7799ccb4352e56961a212Daniel Jasper if (Right.Type == TT_FunctionTypeLParen && Left.isNot(tok::l_paren) && 1264395228fdc343df39c2507e414dc1406a185c6d37Daniel Jasper (Left.Type != TT_PointerOrReference || Style.PointerBindsToType)) 1265395228fdc343df39c2507e414dc1406a185c6d37Daniel Jasper return true; 12663fd9ccdd9f8d259bcf518e7056cfd419d992e984Alexander Kornienko if (Left.Type == TT_PointerOrReference) 12673a1847e0a1810a0b1b963182abc59114cc5ff53dDaniel Jasper return Right.Tok.isLiteral() || Right.Type == TT_BlockComment || 12689322aaee900b872c98f8fc10b38a231cb1e9b57aDaniel Jasper ((Right.Type != TT_PointerOrReference) && 126981d2d38d2d774a2550fa0d2efffa707e7a53b39cDaniel Jasper Right.isNot(tok::l_paren) && Style.PointerBindsToType && 1270b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Left.Previous && 1271b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek !Left.Previous->isOneOf(tok::l_paren, tok::coloncolon)); 127232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::star) && Left.is(tok::l_paren)) 127332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1274051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber if (Left.is(tok::l_square)) 1275a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper return Left.Type == TT_ArrayInitializerLSquare && 1276a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Right.isNot(tok::r_square); 1277051860ee770bf83c3e66ab893be3642bb8bc2680Nico Weber if (Right.is(tok::r_square)) 1278a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper return Right.MatchingParen && 1279a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Right.MatchingParen->Type == TT_ArrayInitializerLSquare; 1280ec17226e82979592c16c7815d2368240201d18feDaniel Jasper if (Right.is(tok::l_square) && Right.Type != TT_ObjCMethodExpr && 1281567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper Right.Type != TT_LambdaLSquare && Left.isNot(tok::numeric_constant)) 128232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 128332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::colon)) 128432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return Left.Type != TT_ObjCMethodExpr; 128532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::colon)) 1286ab3ce592d027e3a10fb21e703cab1507f8d9bb03Daniel Jasper return Right.Type != TT_ObjCMethodExpr && !Left.is(tok::question); 128732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Right.is(tok::l_paren)) { 1288e0fa4c55a4bc6d2bbe0d9d657287c037158d5357Daniel Jasper if (Left.is(tok::r_paren) && Left.MatchingParen && 1289e0fa4c55a4bc6d2bbe0d9d657287c037158d5357Daniel Jasper Left.MatchingParen->Previous && 1290e0fa4c55a4bc6d2bbe0d9d657287c037158d5357Daniel Jasper Left.MatchingParen->Previous->is(tok::kw___attribute)) 1291e0fa4c55a4bc6d2bbe0d9d657287c037158d5357Daniel Jasper return true; 1292e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko return Line.Type == LT_ObjCDecl || 129334f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper Left.isOneOf(tok::kw_return, tok::kw_new, tok::kw_delete, 129434f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper tok::semi) || 129534f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper (Style.SpaceAfterControlStatementKeyword && 129634f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper Left.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch, 129734f3d05d0ee625dfcac951e2851f212c4c1a8b83Daniel Jasper tok::kw_catch)); 129832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 1299b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Left.is(tok::at) && Right.Tok.getObjCKeywordID() != tok::objc_not_keyword) 130032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 130132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::l_brace) && Right.is(tok::r_brace)) 1302567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper return !Left.Children.empty(); // No spaces in "{}". 13032424eefa6936ec2dc35188e19c99e2f85428b52eDaniel Jasper if (Left.is(tok::l_brace) || Right.is(tok::r_brace)) 1304b5dc3f4f53981b681a565cdf1d49f18e817541ffDaniel Jasper return !Style.Cpp11BracedListStyle; 13051bee0738b67b784f08d5e2f8351920260c9cfb1dDaniel Jasper if (Right.Type == TT_UnaryOperator) 13061bee0738b67b784f08d5e2f8351920260c9cfb1dDaniel Jasper return !Left.isOneOf(tok::l_paren, tok::l_square, tok::at) && 13071bee0738b67b784f08d5e2f8351920260c9cfb1dDaniel Jasper (Left.isNot(tok::colon) || Left.Type != TT_ObjCMethodExpr); 1308ce93356e2719d2992763ea747b65beada99f4c9bDaniel Jasper if (Left.isOneOf(tok::identifier, tok::greater, tok::r_square) && 130931e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek Right.is(tok::l_brace) && Right.getNextNonComment() && 131031e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek Right.BlockKind != BK_Block) 131132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 13125ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper if (Left.is(tok::period) || Right.is(tok::period)) 13135ad390d27f8f7cb6628bc2c32beba4d25bc2718bDaniel Jasper return false; 1314861576b8019392f15c803ac14a4bc31fbd93aab2Nico Weber if (Left.Type == TT_BlockComment && Left.TokenText.endswith("=*/")) 1315861576b8019392f15c803ac14a4bc31fbd93aab2Nico Weber return false; 1316daa07e9ee76d438efa3c7e2c54b4d3d3ed19ea27Alexander Kornienko if (Right.is(tok::hash) && Left.is(tok::identifier) && Left.TokenText == "L") 1317daa07e9ee76d438efa3c7e2c54b4d3d3ed19ea27Alexander Kornienko return false; 131832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 131932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 132032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 13218ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperbool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, 1322b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Tok) { 1323b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Tok.getIdentifierInfo() && Tok.Previous->Tok.getIdentifierInfo()) 13242b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper return true; // Never ever merge two identifiers. 13251d82b1a33bcfe85f4834fb6920517ed07e9355d3Daniel Jasper if (Tok.Previous->Type == TT_ImplicitStringLiteral) 13261d82b1a33bcfe85f4834fb6920517ed07e9355d3Daniel Jasper return Tok.WhitespaceRange.getBegin() != Tok.WhitespaceRange.getEnd(); 132732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Line.Type == LT_ObjCMethodDecl) { 1328b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Type == TT_ObjCMethodSpecifier) 132932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1330b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->is(tok::r_paren) && Tok.is(tok::identifier)) 133132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Don't space between ')' and <id> 133232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 133332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 133432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Line.Type == LT_ObjCProperty && 1335b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek (Tok.is(tok::equal) || Tok.Previous->is(tok::equal))) 133632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 133732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 13382ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper if (Tok.Type == TT_TrailingReturnArrow || 13392ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper Tok.Previous->Type == TT_TrailingReturnArrow) 13402ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper return true; 1341b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->is(tok::comma)) 134232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 13439c3c7b3130bc72b3f50703c11b85152b1264fc90Daniel Jasper if (Tok.is(tok::comma)) 13449c3c7b3130bc72b3f50703c11b85152b1264fc90Daniel Jasper return false; 134532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Tok.Type == TT_CtorInitializerColon || Tok.Type == TT_ObjCBlockLParen) 134632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1347b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Tok.is(tok::kw_operator)) 134852af94453e30d2e9d0f4b6a208c8d4c3ff7c85a9Daniel Jasper return Tok.is(tok::coloncolon); 13492b4c924f85e156d66c01b3f16c850892c47dcc7aDaniel Jasper if (Tok.Type == TT_OverloadedOperatorLParen) 135032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 135132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Tok.is(tok::colon)) 1352b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek return !Line.First->isOneOf(tok::kw_case, tok::kw_default) && 1353ab3ce592d027e3a10fb21e703cab1507f8d9bb03Daniel Jasper Tok.getNextNonComment() != NULL && Tok.Type != TT_ObjCMethodExpr && 1354ab3ce592d027e3a10fb21e703cab1507f8d9bb03Daniel Jasper !Tok.Previous->is(tok::question); 1355b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Type == TT_UnaryOperator || 1356b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok.Previous->Type == TT_CastRParen) 135732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1358b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->is(tok::greater) && Tok.is(tok::greater)) { 135929f123b2fa0435bb1962f0d9e9a2e660f35fbb2fDaniel Jasper return Tok.Type == TT_TemplateCloser && 1360b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok.Previous->Type == TT_TemplateCloser && 1361d8ee5c1c8709c5fc060a48b598112f6eadb35d96Daniel Jasper (Style.Standard != FormatStyle::LS_Cpp11 || Style.SpacesInAngles); 136232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper } 136354a38bd5cf243310290f34b43fc940a498a00f90Alexander Kornienko if (Tok.isOneOf(tok::arrowstar, tok::periodstar) || 1364b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok.Previous->isOneOf(tok::arrowstar, tok::periodstar)) 13659c3c7b3130bc72b3f50703c11b85152b1264fc90Daniel Jasper return false; 13669b4de85e2f47a01974f451d21fed0276ff912e32Daniel Jasper if (!Style.SpaceBeforeAssignmentOperators && 13679b4de85e2f47a01974f451d21fed0276ff912e32Daniel Jasper Tok.getPrecedence() == prec::Assignment) 13689b4de85e2f47a01974f451d21fed0276ff912e32Daniel Jasper return false; 13691dc6f745eb19c94527503012d798dc9b9b5ba6daDaniel Jasper if ((Tok.Type == TT_BinaryOperator && !Tok.Previous->is(tok::l_paren)) || 13701dc6f745eb19c94527503012d798dc9b9b5ba6daDaniel Jasper Tok.Previous->Type == TT_BinaryOperator) 137132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1372b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Tok.Previous->Type == TT_TemplateCloser && Tok.is(tok::l_paren)) 137332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1374a4dd982805e89a37a080350bf8de9069135c5a60Daniel Jasper if (Tok.is(tok::less) && Tok.Previous->isNot(tok::l_paren) && 1375a4dd982805e89a37a080350bf8de9069135c5a60Daniel Jasper Line.First->is(tok::hash)) 137632d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 137732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Tok.Type == TT_TrailingUnaryOperator) 137832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1379b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek return spaceRequiredBetween(Line, *Tok.Previous, Tok); 138032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 138132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1382ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasperbool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, 1383ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper const FormatToken &Right) { 1384ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper if (Right.is(tok::comment)) { 1385ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return Right.NewlinesBefore > 0; 1386ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->isTrailingComment() || 1387ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper (Right.is(tok::string_literal) && 1388ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Previous->is(tok::string_literal))) { 1389ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1390ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->IsUnterminatedLiteral) { 1391ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1392ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.is(tok::lessless) && Right.Next && 1393ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Previous->is(tok::string_literal) && 1394ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Next->is(tok::string_literal)) { 1395ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1396ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->ClosesTemplateDeclaration && 1397ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Previous->MatchingParen && 1398ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Right.Previous->MatchingParen->BindingStrength == 1 && 1399ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper Style.AlwaysBreakTemplateDeclarations) { 1400ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper // FIXME: Fix horrible hack of using BindingStrength to find top-level <>. 1401ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1402ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Type == TT_CtorInitializerComma && 140319ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper Style.BreakConstructorInitializersBeforeComma && 140419ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper !Style.ConstructorInitializerAllOnOneLineOrOnePerLine) { 1405ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1406ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.Previous->BlockKind == BK_Block && 140701fe9f9f320dd4342664376f24eb1a0d004d03c8Alexander Kornienko Right.Previous->isNot(tok::r_brace) && Right.isNot(tok::r_brace)) { 1408ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return true; 1409ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } else if (Right.is(tok::l_brace) && (Right.BlockKind == BK_Block)) { 1410ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return Style.BreakBeforeBraces == FormatStyle::BS_Allman; 1411ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper } 1412ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper return false; 1413ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper} 1414ebaa1719fdd180e6dd9b4e6471e83500471a2f16Daniel Jasper 14158ff690ab478b33e0d830a6203de12d191d94f8ffDaniel Jasperbool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, 1416b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Right) { 1417b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken &Left = *Right.Previous; 14186561f6a13b79ed752748ede590792191edf78ce8Daniel Jasper if (Right.Type == TT_StartOfName || Right.is(tok::kw_operator)) 141932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1420f2ff8126e9e9df368f31b1f968d8fc80f99809b3Nico Weber if (Right.is(tok::colon) && 14213c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper (Right.Type == TT_DictLiteral || Right.Type == TT_ObjCMethodExpr)) 142232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1423f2ff8126e9e9df368f31b1f968d8fc80f99809b3Nico Weber if (Left.is(tok::colon) && 14243c6aea7ac63265c769b5fe09e213ab1c4cee111eDaniel Jasper (Left.Type == TT_DictLiteral || Left.Type == TT_ObjCMethodExpr)) 142532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 142663d7cedca8616921c1908c88c2f23fcd67bbab99Daniel Jasper if (Right.Type == TT_ObjCSelectorName) 142732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1428aa9e7b18a88d715b63e7b65d1b26a1759decc177Daniel Jasper if (Left.is(tok::r_paren) && Line.Type == LT_ObjCProperty) 1429aa9e7b18a88d715b63e7b65d1b26a1759decc177Daniel Jasper return true; 143032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.ClosesTemplateDeclaration) 143132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 1432ab3ce592d027e3a10fb21e703cab1507f8d9bb03Daniel Jasper if ((Right.Type == TT_ConditionalExpr && 1433ab3ce592d027e3a10fb21e703cab1507f8d9bb03Daniel Jasper !(Right.is(tok::colon) && Left.is(tok::question))) || 1434ab3ce592d027e3a10fb21e703cab1507f8d9bb03Daniel Jasper Right.is(tok::question)) 143532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 14366cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper if (Right.Type == TT_RangeBasedForLoopColon || 1437c476ea976badd316e3afd0f34afe1f030a710117Daniel Jasper Right.Type == TT_OverloadedOperatorLParen || 1438c476ea976badd316e3afd0f34afe1f030a710117Daniel Jasper Right.Type == TT_OverloadedOperator) 14396cabab48dacc1317821f8f078ed2d4c603b67affDaniel Jasper return false; 1440c194c95036b7bf1281a6f2ed683f7c85ee5d2c20Daniel Jasper if (Left.Type == TT_RangeBasedForLoopColon) 144132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return true; 14427d81281fc39f6d40d86be6600adba13c05b4a639Daniel Jasper if (Right.Type == TT_RangeBasedForLoopColon) 14437d81281fc39f6d40d86be6600adba13c05b4a639Daniel Jasper return false; 144432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.Type == TT_PointerOrReference || Left.Type == TT_TemplateCloser || 144532d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper Left.Type == TT_UnaryOperator || Left.Type == TT_ConditionalExpr || 1446e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko Left.isOneOf(tok::question, tok::kw_operator)) 144732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 144832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper if (Left.is(tok::equal) && Line.Type == LT_VirtualFunctionDecl) 144932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 1450198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper if (Left.Previous) { 1451198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper if (Left.is(tok::l_paren) && Right.is(tok::l_paren) && 1452198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper Left.Previous->is(tok::kw___attribute)) 1453198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper return false; 14542ca3741a962ded08866596577aaee2f4ab74c955Daniel Jasper if (Left.is(tok::l_paren) && (Left.Previous->Type == TT_BinaryOperator || 14555e2169f94fca20bbfda317c222b156751a431c13Daniel Jasper Left.Previous->Type == TT_CastRParen)) 1456198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper return false; 1457198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper } 14588437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper if (Right.Type == TT_ImplicitStringLiteral) 14598437957c9da906c24d4e385869c05d8e601c664dDaniel Jasper return false; 146065d2c3829494d254039683c73f95843c29c661b4Daniel Jasper if (Right.isTrailingComment()) 146132d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // We rely on MustBreakBefore being set correctly here as we should not 146232d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // change the "binding" behavior of a comment. 146332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper return false; 146432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1465567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (Right.is(tok::r_paren) || Right.Type == TT_TemplateCloser) 1466567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper return false; 1467567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper 14685ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper // We only break before r_brace if there was a corresponding break before 14695ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper // the l_brace, which is tracked by BreakBeforeClosingBrace. 1470567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper if (Right.is(tok::r_brace)) 1471567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper return Right.MatchingParen && Right.MatchingParen->BlockKind == BK_Block; 14725ad72bb8eb8e5cc4c061ccd28632295213d319dbDaniel Jasper 147332d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // Allow breaking after a trailing 'const', e.g. after a method declaration, 147432d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper // unless it is follow by ';', '{' or '='. 1475b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek if (Left.is(tok::kw_const) && Left.Previous != NULL && 1476b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Left.Previous->is(tok::r_paren)) 1477e74de28ec3692986f3467a7f160a0e293277fa7eAlexander Kornienko return !Right.isOneOf(tok::l_brace, tok::semi, tok::equal); 147832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 14798ef19a22956defa392df46c79e2d499ab7b16647Daniel Jasper if (Right.is(tok::kw___attribute)) 14808ef19a22956defa392df46c79e2d499ab7b16647Daniel Jasper return true; 14818ef19a22956defa392df46c79e2d499ab7b16647Daniel Jasper 14823a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper if (Left.is(tok::identifier) && Right.is(tok::string_literal)) 14833a204418482c9ae70ad482e781132c54306c3aa6Daniel Jasper return true; 1484e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper 1485e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper if (Left.Type == TT_CtorInitializerComma && 1486e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper Style.BreakConstructorInitializersBeforeComma) 1487e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper return false; 148819ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper if (Right.Type == TT_CtorInitializerComma && 148919ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper Style.BreakConstructorInitializersBeforeComma) 149019ccb1227f5dc338d4b2d9dbbaeaa973c293f8d0Daniel Jasper return true; 1491e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper if (Right.isBinaryOperator() && Style.BreakBeforeBinaryOperators) 1492e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper return true; 149326356ccf00f813cf358d420b55939fc737eb2cfaDaniel Jasper if (Left.is(tok::greater) && Right.is(tok::greater) && 149426356ccf00f813cf358d420b55939fc737eb2cfaDaniel Jasper Left.Type != TT_TemplateCloser) 149526356ccf00f813cf358d420b55939fc737eb2cfaDaniel Jasper return false; 1496a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper if (Left.Type == TT_ArrayInitializerLSquare) 1497a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper return true; 1498e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper return (Left.isBinaryOperator() && Left.isNot(tok::lessless) && 1499e8b10d3d5b90efaf60ad89e96f6500f971ceec41Daniel Jasper !Style.BreakBeforeBinaryOperators) || 15006b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper Left.isOneOf(tok::comma, tok::coloncolon, tok::semi, tok::l_brace, 15016b119d63f5036344acd4e00a6ff2b3c72f26966fDaniel Jasper tok::kw_class, tok::kw_struct) || 1502a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper Right.isOneOf(tok::lessless, tok::arrow, tok::period, tok::colon, 1503a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper tok::l_square, tok::at) || 1504198c8bfee0b33ab0ed0c54224f460868f1c18e95Daniel Jasper (Left.is(tok::r_paren) && 1505e033e87cbe77341777100093f8066167888d4440Daniel Jasper Right.isOneOf(tok::identifier, tok::kw_const, tok::kw___attribute)) || 1506a07aa665a12ab23bef7aa4aedfe113dd8b13da57Daniel Jasper (Left.is(tok::l_paren) && !Right.is(tok::r_paren)); 150732d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} 150832d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper 1509bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jaspervoid TokenAnnotator::printDebugInfo(const AnnotatedLine &Line) { 1510bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << "AnnotatedTokens:\n"; 1511b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek const FormatToken *Tok = Line.First; 1512bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper while (Tok) { 1513b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek llvm::errs() << " M=" << Tok->MustBreakBefore 1514c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper << " C=" << Tok->CanBreakBefore << " T=" << Tok->Type 1515c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper << " S=" << Tok->SpacesRequiredBefore 1516c7bd68f9edcbca95e882d0ab18d09371f0bdb82cDaniel Jasper << " P=" << Tok->SplitPenalty << " Name=" << Tok->Tok.getName() 1517ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek << " L=" << Tok->TotalLength << " PPK=" << Tok->PackingKind 1518ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek << " FakeLParens="; 1519bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper for (unsigned i = 0, e = Tok->FakeLParens.size(); i != e; ++i) 1520bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << Tok->FakeLParens[i] << "/"; 1521bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << " FakeRParens=" << Tok->FakeRParens << "\n"; 1522ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek if (Tok->Next == NULL) 1523ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek assert(Tok == Line.Last); 1524b398701e4cbb9a55d90a60e3f4f4bc577446d098Manuel Klimek Tok = Tok->Next; 1525bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper } 1526bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper llvm::errs() << "----\n"; 1527bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper} 1528bf71ba2988b34c45af968f0965e28ac952e4a15fDaniel Jasper 152932d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} // namespace format 153032d28ee6061930b2a9c170cbaaeea028c88a7b89Daniel Jasper} // namespace clang 1531