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