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