1bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//===--- UnwrappedLineParser.cpp - Format C++ code ------------------------===//
2bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//
3bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//                     The LLVM Compiler Infrastructure
4bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//
5bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// This file is distributed under the University of Illinois Open Source
6bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper// License. See LICENSE.TXT for details.
7bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//
8bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//===----------------------------------------------------------------------===//
9bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper///
10bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// \file
11bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// \brief This file contains the implementation of the UnwrappedLineParser,
12bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper/// which turns a stream of tokens into UnwrappedLines.
13bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper///
14bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper//===----------------------------------------------------------------------===//
15bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
16b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth#include "UnwrappedLineParser.h"
173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
188fa37999164844a926448ef4656bbf7c42070235Manuel Klimek#include "llvm/Support/Debug.h"
193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar#include "llvm/Support/raw_ostream.h"
20bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define DEBUG_TYPE "format-parser"
226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
23bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspernamespace clang {
24bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspernamespace format {
25bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
2696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekclass FormatTokenSource {
2796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekpublic:
2896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  virtual ~FormatTokenSource() {}
2996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  virtual FormatToken *getNextToken() = 0;
3096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek
3196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  virtual unsigned getPosition() = 0;
3296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  virtual FormatToken *setPosition(unsigned Position) = 0;
3396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek};
3496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek
35e50947fcb029475f87578fb40f94982cec46c0c0Craig Toppernamespace {
36e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper
3770b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimekclass ScopedDeclarationState {
3870b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimekpublic:
3970b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  ScopedDeclarationState(UnwrappedLine &Line, std::vector<bool> &Stack,
4070b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek                         bool MustBeDeclaration)
4170b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek      : Line(Line), Stack(Stack) {
4270b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek    Line.MustBeDeclaration = MustBeDeclaration;
43836b58f564e07e806d3d0b41a193fde0921013c7Manuel Klimek    Stack.push_back(MustBeDeclaration);
4470b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  }
4570b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  ~ScopedDeclarationState() {
4670b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek    Stack.pop_back();
47a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek    if (!Stack.empty())
48a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek      Line.MustBeDeclaration = Stack.back();
49a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek    else
50a32a7fda316289dca6aac1352fde3caf14a1cb2fManuel Klimek      Line.MustBeDeclaration = true;
5170b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  }
52f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper
5370b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimekprivate:
5470b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  UnwrappedLine &Line;
5570b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  std::vector<bool> &Stack;
5670b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek};
5770b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek
58d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekclass ScopedMacroState : public FormatTokenSource {
59d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekpublic:
60d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource,
61b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                   FormatToken *&ResetToken)
62d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek      : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken),
6367d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek        PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource),
64b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        Token(nullptr) {
65d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    TokenSource = this;
66c37b4d60f926bf440dfcc312bd6482fed3176e33Manuel Klimek    Line.Level = 0;
67d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    Line.InPPDirective = true;
68d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
69d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
7058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  ~ScopedMacroState() override {
71d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    TokenSource = PreviousTokenSource;
72d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    ResetToken = Token;
73d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    Line.InPPDirective = false;
74c37b4d60f926bf440dfcc312bd6482fed3176e33Manuel Klimek    Line.Level = PreviousLineLevel;
75d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
76d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FormatToken *getNextToken() override {
78dd5b1018d97a9666da92d320485a727ac63ee89aManuel Klimek    // The \c UnwrappedLineParser guards against this by never calling
79dd5b1018d97a9666da92d320485a727ac63ee89aManuel Klimek    // \c getNextToken() after it has encountered the first eof token.
80dd5b1018d97a9666da92d320485a727ac63ee89aManuel Klimek    assert(!eof());
81d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    Token = PreviousTokenSource->getNextToken();
82d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    if (eof())
8396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      return getFakeEOF();
84d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    return Token;
85d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
86d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getPosition() override { return PreviousTokenSource->getPosition(); }
8880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FormatToken *setPosition(unsigned Position) override {
9080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    Token = PreviousTokenSource->setPosition(Position);
9180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    return Token;
9280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  }
9380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
94d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekprivate:
9596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  bool eof() { return Token && Token->HasUnescapedNewline; }
9696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek
9796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  FormatToken *getFakeEOF() {
9896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    static bool EOFInitialized = false;
9996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    static FormatToken FormatTok;
10096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (!EOFInitialized) {
10196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      FormatTok.Tok.startToken();
10296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      FormatTok.Tok.setKind(tok::eof);
10396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      EOFInitialized = true;
10496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    }
10596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    return &FormatTok;
106d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
107d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
108d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  UnwrappedLine &Line;
109d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  FormatTokenSource *&TokenSource;
11096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  FormatToken *&ResetToken;
111c37b4d60f926bf440dfcc312bd6482fed3176e33Manuel Klimek  unsigned PreviousLineLevel;
112d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  FormatTokenSource *PreviousTokenSource;
113d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
11496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  FormatToken *Token;
115d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek};
116d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
117e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper} // end anonymous namespace
118e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper
119bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimekclass ScopedLineState {
120bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimekpublic:
121525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek  ScopedLineState(UnwrappedLineParser &Parser,
122525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek                  bool SwitchToPreprocessorLines = false)
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : Parser(Parser), OriginalLines(Parser.CurrentLines) {
124525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek    if (SwitchToPreprocessorLines)
125525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek      Parser.CurrentLines = &Parser.PreprocessorDirectives;
126567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    else if (!Parser.Line->Tokens.empty())
127567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper      Parser.CurrentLines = &Parser.Line->Tokens.back().Children;
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    PreBlockLine = std::move(Parser.Line);
129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Parser.Line = llvm::make_unique<UnwrappedLine>();
130cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper    Parser.Line->Level = PreBlockLine->Level;
131cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper    Parser.Line->InPPDirective = PreBlockLine->InPPDirective;
132bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  }
133bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek
134bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  ~ScopedLineState() {
135cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper    if (!Parser.Line->Tokens.empty()) {
136bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      Parser.addUnwrappedLine();
137bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek    }
138cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper    assert(Parser.Line->Tokens.empty());
139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Parser.Line = std::move(PreBlockLine);
140567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    if (Parser.CurrentLines == &Parser.PreprocessorDirectives)
141567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper      Parser.MustBreakBeforeNextToken = true;
142567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    Parser.CurrentLines = OriginalLines;
143bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  }
144bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek
145bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimekprivate:
146bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  UnwrappedLineParser &Parser;
147bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::unique_ptr<UnwrappedLine> PreBlockLine;
149567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  SmallVectorImpl<UnwrappedLine> *OriginalLines;
150bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek};
151bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass CompoundStatementIndenter {
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CompoundStatementIndenter(UnwrappedLineParser *Parser,
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            const FormatStyle &Style, unsigned &LineLevel)
156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      : LineLevel(LineLevel), OldLineLevel(LineLevel) {
15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.AfterControlStatement)
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Parser->addUnwrappedLine();
15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.IndentBraces)
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ++LineLevel;
161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ~CompoundStatementIndenter() { LineLevel = OldLineLevel; }
163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesprivate:
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned &LineLevel;
166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned OldLineLevel;
167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
169e50947fcb029475f87578fb40f94982cec46c0c0Craig Toppernamespace {
170e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper
17180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekclass IndexedTokenSource : public FormatTokenSource {
17280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekpublic:
17396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  IndexedTokenSource(ArrayRef<FormatToken *> Tokens)
17480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      : Tokens(Tokens), Position(-1) {}
17580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
176651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FormatToken *getNextToken() override {
17780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    ++Position;
17880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    return Tokens[Position];
17980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  }
18080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getPosition() override {
18280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    assert(Position >= 0);
18380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    return Position;
18480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  }
18580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FormatToken *setPosition(unsigned P) override {
18780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    Position = P;
18880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    return Tokens[Position];
18980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  }
19080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
191ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  void reset() { Position = -1; }
192ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek
19380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekprivate:
19496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  ArrayRef<FormatToken *> Tokens;
19580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  int Position;
19680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek};
19780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
198e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper} // end anonymous namespace
199e50947fcb029475f87578fb40f94982cec46c0c0Craig Topper
200caf42a3ef114900fd2ab927d1a13b4db000515e8Daniel JasperUnwrappedLineParser::UnwrappedLineParser(const FormatStyle &Style,
201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                         const AdditionalKeywords &Keywords,
20296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek                                         ArrayRef<FormatToken *> Tokens,
203caf42a3ef114900fd2ab927d1a13b4db000515e8Daniel Jasper                                         UnwrappedLineConsumer &Callback)
204525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek    : Line(new UnwrappedLine), MustBreakBeforeNextToken(false),
205b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      CurrentLines(&Lines), Style(Style), Keywords(Keywords), Tokens(nullptr),
206b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1) {}
207ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek
208ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimekvoid UnwrappedLineParser::reset() {
209ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  PPBranchLevel = -1;
210ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  Line.reset(new UnwrappedLine);
211ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  CommentsBeforeNextToken.clear();
2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  FormatTok = nullptr;
213ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  MustBreakBeforeNextToken = false;
214ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  PreprocessorDirectives.clear();
215ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  CurrentLines = &Lines;
216ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  DeclarationScopeStack.clear();
217ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  PPStack.clear();
218ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek}
219bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
220b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid UnwrappedLineParser::parse() {
22180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  IndexedTokenSource TokenSource(AllTokens);
222ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  do {
223ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    DEBUG(llvm::dbgs() << "----\n");
224ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    reset();
225ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    Tokens = &TokenSource;
226ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    TokenSource.reset();
227ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek
228ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    readToken();
229ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    parseFile();
230ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    // Create line with eof token.
231ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    pushToken(FormatTok);
232ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    addUnwrappedLine();
233ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek
234ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    for (SmallVectorImpl<UnwrappedLine>::iterator I = Lines.begin(),
235ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek                                                  E = Lines.end();
236ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek         I != E; ++I) {
237ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      Callback.consumeUnwrappedLine(*I);
238ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    }
239ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    Callback.finishRun();
240ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    Lines.clear();
241ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    while (!PPLevelBranchIndex.empty() &&
242ac4d0181928e3e22fa3929ca1b24ae7f14fb7628Daniel Jasper           PPLevelBranchIndex.back() + 1 >= PPLevelBranchCount.back()) {
243ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      PPLevelBranchIndex.resize(PPLevelBranchIndex.size() - 1);
244ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      PPLevelBranchCount.resize(PPLevelBranchCount.size() - 1);
245ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    }
246ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    if (!PPLevelBranchIndex.empty()) {
247ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      ++PPLevelBranchIndex.back();
248ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      assert(PPLevelBranchIndex.size() == PPLevelBranchCount.size());
249ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      assert(PPLevelBranchIndex.back() <= PPLevelBranchCount.back());
250ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    }
251ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  } while (!PPLevelBranchIndex.empty());
252d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek}
253d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
25467d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimekvoid UnwrappedLineParser::parseFile() {
255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // The top-level context in a file always has declarations, except for pre-
256b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // processor directives and JavaScript files.
257b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  bool MustBeDeclaration =
258b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      !Line->InPPDirective && Style.Language != FormatStyle::LK_JavaScript;
259b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
260b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                                          MustBeDeclaration);
2612726877196b41b922f10f794801b313980e1a8adNico Weber  parseLevel(/*HasOpeningBrace=*/false);
262d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  // Make sure to format the remaining tokens.
26386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  flushComments(true);
264d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  addUnwrappedLine();
265bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
266bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
26767d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimekvoid UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
268e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper  bool SwitchLabelEncountered = false;
269bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  do {
27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    tok::TokenKind kind = FormatTok->Tok.getKind();
27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (FormatTok->Type == TT_MacroBlockBegin) {
27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      kind = tok::l_brace;
27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    } else if (FormatTok->Type == TT_MacroBlockEnd) {
27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      kind = tok::r_brace;
27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    switch (kind) {
278bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::comment:
27905b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper      nextToken();
28005b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper      addUnwrappedLine();
281bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
282bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::l_brace:
28370b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek      // FIXME: Add parameter whether this can happen - if this happens, we must
28470b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek      // be in a non-declaration context.
28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (!FormatTok->is(TT_MacroBlockBegin) && tryToParseBracedList())
28687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        continue;
2872726877196b41b922f10f794801b313980e1a8adNico Weber      parseBlock(/*MustBeDeclaration=*/false);
288bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      addUnwrappedLine();
289bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
290bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::r_brace:
29167d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek      if (HasOpeningBrace)
29267d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek        return;
29367d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek      nextToken();
29467d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek      addUnwrappedLine();
295a5342db6fcc6ee3fae084f584ecb019726de9ccaManuel Klimek      break;
296e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper    case tok::kw_default:
297e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper    case tok::kw_case:
29867cf1dbdd2e1e167a34b849386916450649564cbDaniel Jasper      if (!SwitchLabelEncountered &&
29967cf1dbdd2e1e167a34b849386916450649564cbDaniel Jasper          (Style.IndentCaseLabels || (Line->InPPDirective && Line->Level == 1)))
30067cf1dbdd2e1e167a34b849386916450649564cbDaniel Jasper        ++Line->Level;
301e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper      SwitchLabelEncountered = true;
302e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper      parseStructuralElement();
303e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper      break;
304bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    default:
305f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek      parseStructuralElement();
306bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
307bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    }
308bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } while (!eof());
309bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
310bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
311b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
31280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // We'll parse forward through the tokens until we hit
31380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // a closing brace or eof - note that getNextToken() will
31480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // parse macros, so this will magically work inside macro
31580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // definitions, too.
31680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  unsigned StoredPosition = Tokens->getPosition();
31796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  FormatToken *Tok = FormatTok;
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const FormatToken *PrevTok = getPreviousToken();
31980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // Keep a stack of positions of lbrace tokens. We will
32080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // update information about whether an lbrace starts a
32180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // braced init list or a different block during the loop.
3220de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  SmallVector<FormatToken *, 8> LBraceStack;
32396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(Tok->Tok.is(tok::l_brace));
32480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  do {
32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Get next non-comment token.
32602eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper    FormatToken *NextTok;
327f50dbfae1c5801d72d57fe5af90ad58871cea321Daniel Jasper    unsigned ReadTokens = 0;
32802eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper    do {
32902eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper      NextTok = Tokens->getNextToken();
330f50dbfae1c5801d72d57fe5af90ad58871cea321Daniel Jasper      ++ReadTokens;
33102eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper    } while (NextTok->is(tok::comment));
33202eacc2cf85fe11577bf6ff20f6c203e87147c57Daniel Jasper
33396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    switch (Tok->Tok.getKind()) {
33480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::l_brace:
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_JavaScript && PrevTok &&
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          PrevTok->is(tok::colon))
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // In TypeScript's TypeMemberLists, there can be semicolons between the
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        // individual members.
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Tok->BlockKind = BK_BracedInit;
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      else
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Tok->BlockKind = BK_Unknown;
3420de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper      LBraceStack.push_back(Tok);
34380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      break;
34480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::r_brace:
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (LBraceStack.empty())
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        break;
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (LBraceStack.back()->BlockKind == BK_Unknown) {
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        bool ProbablyBracedList = false;
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (Style.Language == FormatStyle::LK_Proto) {
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square);
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        } else {
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // Using OriginalColumn to distinguish between ObjC methods and
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // binary operators is a bit hacky.
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          bool NextIsObjCMethod = NextTok->isOneOf(tok::plus, tok::minus) &&
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  NextTok->OriginalColumn == 0;
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // If there is a comma, semicolon or right paren after the closing
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // brace, we assume this is a braced initializer list.  Note that
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // regardless how we mark inner braces here, we will overwrite the
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // BlockKind later if we parse a braced list (where all blocks
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // inside are by default braced lists), or when we explicitly detect
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // blocks (for example while parsing lambdas).
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          //
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // We exclude + and - as they can be ObjC visibility modifiers.
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ProbablyBracedList =
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              (Style.Language == FormatStyle::LK_JavaScript &&
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in)) ||
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              NextTok->isOneOf(tok::comma, tok::period, tok::colon,
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               tok::r_paren, tok::r_square, tok::l_brace,
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                               tok::l_square, tok::l_paren, tok::ellipsis) ||
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              (NextTok->is(tok::semi) &&
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar               (!ExpectClassBody || LBraceStack.size() != 1)) ||
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar              (NextTok->isBinaryOperator() && !NextIsObjCMethod);
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        }
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (ProbablyBracedList) {
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          Tok->BlockKind = BK_BracedInit;
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          LBraceStack.back()->BlockKind = BK_BracedInit;
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        } else {
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          Tok->BlockKind = BK_Block;
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          LBraceStack.back()->BlockKind = BK_Block;
38180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek        }
38280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      }
3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      LBraceStack.pop_back();
38480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      break;
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::at:
38680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::semi:
38780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::kw_if:
38880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::kw_while:
38980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::kw_for:
39080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::kw_switch:
39180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    case tok::kw_try:
3920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::kw___try:
3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (!LBraceStack.empty() && LBraceStack.back()->BlockKind == BK_Unknown)
3940de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper        LBraceStack.back()->BlockKind = BK_Block;
39580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      break;
39680829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    default:
39780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      break;
39880829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    }
3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    PrevTok = Tok;
40080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    Tok = NextTok;
40131e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek  } while (Tok->Tok.isNot(tok::eof) && !LBraceStack.empty());
4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
40380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  // Assume other blocks for all unclosed opening braces.
40480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  for (unsigned i = 0, e = LBraceStack.size(); i != e; ++i) {
4050de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper    if (LBraceStack[i]->BlockKind == BK_Unknown)
4060de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper      LBraceStack[i]->BlockKind = BK_Block;
40780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  }
40831e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek
40980829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  FormatTok = Tokens->setPosition(StoredPosition);
41080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek}
41180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
412aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimekvoid UnwrappedLineParser::parseBlock(bool MustBeDeclaration, bool AddLevel,
413aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek                                     bool MunchSemi) {
41487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(FormatTok->isOneOf(tok::l_brace, TT_MacroBlockBegin) &&
41587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         "'{' or macro block token expected");
41687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const bool MacroBlock = FormatTok->is(TT_MacroBlockBegin);
41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  FormatTok->BlockKind = BK_Block;
41887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
419e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper  unsigned InitialLevel = Line->Level;
420bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
421bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
42287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroBlock && FormatTok->is(tok::l_paren))
42387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    parseParens();
42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4252f1ac41a6d8d202dcc39ab8eb56ccea823dc062eManuel Klimek  addUnwrappedLine();
426bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
42770b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek  ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
42870b03f4edaefcc5b9aa2e084d1c12e9d91b32a77Manuel Klimek                                          MustBeDeclaration);
429eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper  if (AddLevel)
430eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper    ++Line->Level;
4312726877196b41b922f10f794801b313980e1a8adNico Weber  parseLevel(/*HasOpeningBrace=*/true);
43215757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko
4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (eof())
4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return;
4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroBlock ? !FormatTok->is(TT_MacroBlockEnd)
43787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 : !FormatTok->is(tok::r_brace)) {
438e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper    Line->Level = InitialLevel;
43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    FormatTok->BlockKind = BK_Block;
44067d080dafa74c7d126da522fec333a6e52a5ae35Manuel Klimek    return;
44186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  }
442393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko
443f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper  nextToken(); // Munch the closing brace.
44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroBlock && FormatTok->is(tok::l_paren))
44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    parseParens();
44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
448aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek  if (MunchSemi && FormatTok->Tok.is(tok::semi))
449aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek    nextToken();
450e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper  Line->Level = InitialLevel;
451bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
452bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
45358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarstatic bool isGoogScope(const UnwrappedLine &Line) {
4540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // FIXME: Closure-library specific stuff should not be hard-coded but be
4550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // configurable.
4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Line.Tokens.size() < 4)
4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return false;
4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  auto I = Line.Tokens.begin();
4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (I->Tok->TokenText != "goog")
4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return false;
4616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ++I;
4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (I->Tok->isNot(tok::period))
4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return false;
4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ++I;
4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (I->Tok->TokenText != "scope")
4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return false;
4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ++I;
4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return I->Tok->is(tok::l_paren);
4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic bool ShouldBreakBeforeBrace(const FormatStyle &Style,
472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                   const FormatToken &InitialToken) {
47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (InitialToken.is(tok::kw_namespace))
47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Style.BraceWrapping.AfterNamespace;
47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (InitialToken.is(tok::kw_class))
47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Style.BraceWrapping.AfterClass;
47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (InitialToken.is(tok::kw_union))
47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Style.BraceWrapping.AfterUnion;
47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (InitialToken.is(tok::kw_struct))
48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Style.BraceWrapping.AfterStruct;
48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return false;
482176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
483176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
484753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimekvoid UnwrappedLineParser::parseChildBlock() {
485753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek  FormatTok->BlockKind = BK_Block;
486753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek  nextToken();
487753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek  {
4886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    bool GoogScope =
48958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        Style.Language == FormatStyle::LK_JavaScript && isGoogScope(*Line);
490753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek    ScopedLineState LineState(*this);
491753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek    ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
492753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek                                            /*MustBeDeclaration=*/false);
4936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Line->Level += GoogScope ? 0 : 1;
494753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek    parseLevel(/*HasOpeningBrace=*/true);
49558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    flushComments(isOnNewLine(*FormatTok));
4966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Line->Level -= GoogScope ? 0 : 1;
497753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek  }
498753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek  nextToken();
499753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek}
500753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek
501bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parsePPDirective() {
50296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::hash) && "'#' expected");
503b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  ScopedMacroState MacroState(*Line, Tokens, FormatTok);
504a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek  nextToken();
505a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek
5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!FormatTok->Tok.getIdentifierInfo()) {
507bd04f2aa2247f2fda3fd8f3fee90479ba2c94499Manuel Klimek    parsePPUnknown();
508a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek    return;
509bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
510a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek
51196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  switch (FormatTok->Tok.getIdentifierInfo()->getPPKeywordID()) {
512d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  case tok::pp_define:
513d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    parsePPDefine();
5146fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    return;
5156fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  case tok::pp_if:
516ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    parsePPIf(/*IfDef=*/false);
5176fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    break;
5186fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  case tok::pp_ifdef:
5196fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  case tok::pp_ifndef:
520ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    parsePPIf(/*IfDef=*/true);
5216fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    break;
5226fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  case tok::pp_else:
5236fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    parsePPElse();
5246fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    break;
5256fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  case tok::pp_elif:
5266fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    parsePPElIf();
5276fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    break;
5286fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  case tok::pp_endif:
5296fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    parsePPEndIf();
530d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    break;
531d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  default:
532d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    parsePPUnknown();
533d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    break;
534d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
535d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek}
536d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationCondition(bool Unreachable) {
5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Unreachable || (!PPStack.empty() && PPStack.back() == PP_Unreachable))
5396fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    PPStack.push_back(PP_Unreachable);
5406fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  else
5416fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    PPStack.push_back(PP_Conditional);
5426fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko}
5436fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko
5446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationStart(bool Unreachable) {
545ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  ++PPBranchLevel;
546ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  assert(PPBranchLevel >= 0 && PPBranchLevel <= (int)PPLevelBranchIndex.size());
547ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  if (PPBranchLevel == (int)PPLevelBranchIndex.size()) {
548ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    PPLevelBranchIndex.push_back(0);
549ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    PPLevelBranchCount.push_back(0);
550ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  }
551ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  PPChainBranchIndex.push(0);
5526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool Skip = PPLevelBranchIndex[PPBranchLevel] > 0;
5536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  conditionalCompilationCondition(Unreachable || Skip);
5546fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko}
5556fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko
5566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationAlternative() {
5576fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  if (!PPStack.empty())
5586fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    PPStack.pop_back();
559ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  assert(PPBranchLevel < (int)PPLevelBranchIndex.size());
560ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  if (!PPChainBranchIndex.empty())
561ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    ++PPChainBranchIndex.top();
5626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  conditionalCompilationCondition(
5636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      PPBranchLevel >= 0 && !PPChainBranchIndex.empty() &&
5646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      PPLevelBranchIndex[PPBranchLevel] != PPChainBranchIndex.top());
5656fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko}
5666fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko
5676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::conditionalCompilationEnd() {
568ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  assert(PPBranchLevel < (int)PPLevelBranchIndex.size());
569ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  if (PPBranchLevel >= 0 && !PPChainBranchIndex.empty()) {
570ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    if (PPChainBranchIndex.top() + 1 > PPLevelBranchCount[PPBranchLevel]) {
571ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek      PPLevelBranchCount[PPBranchLevel] = PPChainBranchIndex.top() + 1;
572ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    }
573ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  }
574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Guard against #endif's without #if.
575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (PPBranchLevel > 0)
576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    --PPBranchLevel;
577ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek  if (!PPChainBranchIndex.empty())
578ae76f7f850a9101a20191b10241ca72c23dc40ddManuel Klimek    PPChainBranchIndex.pop();
5796fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  if (!PPStack.empty())
5806fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    PPStack.pop_back();
5816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
5826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPIf(bool IfDef) {
5846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  nextToken();
5856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool IsLiteralFalse = (FormatTok->Tok.isLiteral() &&
5860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                         FormatTok->Tok.getLiteralData() != nullptr &&
5876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                         StringRef(FormatTok->Tok.getLiteralData(),
5886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                   FormatTok->Tok.getLength()) == "0") ||
5896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                        FormatTok->Tok.is(tok::kw_false);
5906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  conditionalCompilationStart(!IfDef && IsLiteralFalse);
5916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  parsePPUnknown();
5926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
5936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPElse() {
5956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  conditionalCompilationAlternative();
5966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  parsePPUnknown();
5976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
5986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPElIf() { parsePPElse(); }
6006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parsePPEndIf() {
6026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  conditionalCompilationEnd();
6036fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko  parsePPUnknown();
6046fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko}
6056fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko
606d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekvoid UnwrappedLineParser::parsePPDefine() {
607d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  nextToken();
608d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
60996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.getKind() != tok::identifier) {
610d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    parsePPUnknown();
611d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    return;
612d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
613d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  nextToken();
61496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.getKind() == tok::l_paren &&
61596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      FormatTok->WhitespaceRange.getBegin() ==
61696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek          FormatTok->WhitespaceRange.getEnd()) {
617d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek    parseParens();
618d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
619d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  addUnwrappedLine();
620526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek  Line->Level = 1;
621c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek
622c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek  // Errors during a preprocessor directive can only affect the layout of the
623c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek  // preprocessor directive, and thus we ignore them. An alternative approach
624c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek  // would be to use the same approach we use on the file level (no
625c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek  // re-indentation if there was a structural error) within the macro
626c3d0c82ab0ce17c684c0192f14059d8e4d63156cManuel Klimek  // definition.
627d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  parseFile();
628d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek}
629d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
630d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekvoid UnwrappedLineParser::parsePPUnknown() {
631a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek  do {
632a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek    nextToken();
633a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek  } while (!eof());
634a080a187fa7e538da3212c7d5e678e4b7ae03253Manuel Klimek  addUnwrappedLine();
635bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
636bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
63799b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko// Here we blacklist certain tokens that are not usually the first token in an
63899b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko// unwrapped line. This is used in attempt to distinguish macro calls without
63999b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko// trailing semicolons from other constructs split to several lines.
6403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarstatic bool tokenCanStartNewLine(const clang::Token &Tok) {
64199b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko  // Semicolon can be a null-statement, l_square can be a start of a macro or
64299b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko  // a C++11 attribute, but this doesn't seem to be common.
64399b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko  return Tok.isNot(tok::semi) && Tok.isNot(tok::l_brace) &&
64499b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::l_square) &&
64599b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         // Tokens that can only be used as binary operators and a part of
64699b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         // overloaded operator names.
64799b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::period) && Tok.isNot(tok::periodstar) &&
64899b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::arrow) && Tok.isNot(tok::arrowstar) &&
64999b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::less) && Tok.isNot(tok::greater) &&
65099b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::slash) && Tok.isNot(tok::percent) &&
65199b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::lessless) && Tok.isNot(tok::greatergreater) &&
65299b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::equal) && Tok.isNot(tok::plusequal) &&
65399b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::minusequal) && Tok.isNot(tok::starequal) &&
65499b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::slashequal) && Tok.isNot(tok::percentequal) &&
65599b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::ampequal) && Tok.isNot(tok::pipeequal) &&
65699b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::caretequal) && Tok.isNot(tok::greatergreaterequal) &&
65799b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         Tok.isNot(tok::lesslessequal) &&
65899b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         // Colon is used in labels, base class lists, initializer lists,
65999b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         // range-based for loops, ternary operator, but should never be the
66099b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko         // first token in an unwrapped line.
6616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         Tok.isNot(tok::colon) &&
6626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         // 'noexcept' is a trailing annotation.
6636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         Tok.isNot(tok::kw_noexcept);
66499b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko}
66599b0e14691b61d8db4f1d239a11615957071fb45Alexander Kornienko
6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool mustBeJSIdent(const AdditionalKeywords &Keywords,
6674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          const FormatToken *FormatTok) {
6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: This returns true for C/C++ keywords like 'struct'.
6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return FormatTok->is(tok::identifier) &&
6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         (FormatTok->Tok.getIdentifierInfo() == nullptr ||
6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          !FormatTok->isOneOf(Keywords.kw_in, Keywords.kw_of, Keywords.kw_as,
6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_async, Keywords.kw_await,
6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_yield, Keywords.kw_finally,
6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_function, Keywords.kw_import,
6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_is, Keywords.kw_let, Keywords.kw_var,
6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_abstract, Keywords.kw_extends,
6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_implements, Keywords.kw_instanceof,
6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              Keywords.kw_interface, Keywords.kw_throws));
6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords,
6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 const FormatToken *FormatTok) {
6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return FormatTok->Tok.isLiteral() || mustBeJSIdent(Keywords, FormatTok);
6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// isJSDeclOrStmt returns true if |FormatTok| starts a declaration or statement
6874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// when encountered after a value (see mustBeJSIdentOrValue).
6884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic bool isJSDeclOrStmt(const AdditionalKeywords &Keywords,
6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           const FormatToken *FormatTok) {
6904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return FormatTok->isOneOf(
6914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      tok::kw_return, Keywords.kw_yield,
6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // conditionals
6934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      tok::kw_if, tok::kw_else,
6944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // loops
6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      tok::kw_for, tok::kw_while, tok::kw_do, tok::kw_continue, tok::kw_break,
6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // switch/case
6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      tok::kw_switch, tok::kw_case,
6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // exceptions
6994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      tok::kw_throw, tok::kw_try, tok::kw_catch, Keywords.kw_finally,
7004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // declaration
7014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      tok::kw_const, tok::kw_class, Keywords.kw_var, Keywords.kw_let,
7024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Keywords.kw_async, Keywords.kw_function,
7034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // import/export
7044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Keywords.kw_import, tok::kw_export);
7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// readTokenWithJavaScriptASI reads the next token and terminates the current
7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// line if JavaScript Automatic Semicolon Insertion must
7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// happen between the current token and the next token.
7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//
7114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This method is conservative - it cannot cover all edge cases of JavaScript,
7124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// but only aims to correctly handle certain well known cases. It *must not*
7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// return true in speculative cases.
7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid UnwrappedLineParser::readTokenWithJavaScriptASI() {
7154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatToken *Previous = FormatTok;
7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  readToken();
7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatToken *Next = FormatTok;
7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool IsOnSameLine =
7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      CommentsBeforeNextToken.empty()
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          ? Next->NewlinesBefore == 0
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          : CommentsBeforeNextToken.front()->NewlinesBefore == 0;
7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (IsOnSameLine)
7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return;
7254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool PreviousMustBeValue = mustBeJSIdentOrValue(Keywords, Previous);
7274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (PreviousMustBeValue && Line && Line->Tokens.size() > 1) {
7284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // If the token before the previous one is an '@', the previous token is an
7294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // annotation and can precede another identifier/value.
7304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const FormatToken *PrePrevious = std::prev(Line->Tokens.end(), 2)->Tok;
7314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (PrePrevious->is(tok::at))
7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return;
7334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
7344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Next->is(tok::exclaim) && PreviousMustBeValue)
7354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    addUnwrappedLine();
7364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool NextMustBeValue = mustBeJSIdentOrValue(Keywords, Next);
7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (NextMustBeValue && (PreviousMustBeValue ||
7384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                          Previous->isOneOf(tok::r_square, tok::r_paren,
7394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            tok::plusplus, tok::minusminus)))
7404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    addUnwrappedLine();
7414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (PreviousMustBeValue && isJSDeclOrStmt(Keywords, Next))
7424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    addUnwrappedLine();
7434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
745f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimekvoid UnwrappedLineParser::parseStructuralElement() {
7464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  assert(!FormatTok->is(tok::l_brace));
7474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Style.Language == FormatStyle::LK_TableGen &&
7484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      FormatTok->is(tok::pp_include)) {
7494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nextToken();
7504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (FormatTok->is(tok::string_literal))
7514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      nextToken();
7524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    addUnwrappedLine();
7534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return;
7544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
75596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  switch (FormatTok->Tok.getKind()) {
7566092d4ed09a2368871993d9a45717f24394329ceNico Weber  case tok::at:
7576092d4ed09a2368871993d9a45717f24394329ceNico Weber    nextToken();
75896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (FormatTok->Tok.is(tok::l_brace)) {
759d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber      parseBracedList();
760d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber      break;
761d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber    }
76296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    switch (FormatTok->Tok.getObjCKeywordID()) {
7636092d4ed09a2368871993d9a45717f24394329ceNico Weber    case tok::objc_public:
7646092d4ed09a2368871993d9a45717f24394329ceNico Weber    case tok::objc_protected:
7656092d4ed09a2368871993d9a45717f24394329ceNico Weber    case tok::objc_package:
7666092d4ed09a2368871993d9a45717f24394329ceNico Weber    case tok::objc_private:
7676092d4ed09a2368871993d9a45717f24394329ceNico Weber      return parseAccessSpecifier();
76827d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber    case tok::objc_interface:
76950767d8c8f2f667255bdb99692c0467ce992bc67Nico Weber    case tok::objc_implementation:
77050767d8c8f2f667255bdb99692c0467ce992bc67Nico Weber      return parseObjCInterfaceOrImplementation();
7711abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    case tok::objc_protocol:
7721abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber      return parseObjCProtocol();
773049c44767370b7257d17a5c32d407f19efa01c6fNico Weber    case tok::objc_end:
774049c44767370b7257d17a5c32d407f19efa01c6fNico Weber      return; // Handled by the caller.
775b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber    case tok::objc_optional:
776b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber    case tok::objc_required:
777b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber      nextToken();
778b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber      addUnwrappedLine();
779b530fa374a8d4d96e61bf1dae8f4a73f4b3d2436Nico Weber      return;
78087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case tok::objc_autoreleasepool:
78187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      nextToken();
78287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (FormatTok->Tok.is(tok::l_brace)) {
78387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        if (Style.BraceWrapping.AfterObjCDeclaration)
78487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          addUnwrappedLine();
78587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        parseBlock(/*MustBeDeclaration=*/false);
78687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      }
78787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      addUnwrappedLine();
78887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return;
7890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::objc_try:
7900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // This branch isn't strictly necessary (the kw_try case below would
7910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // do this too after the tok::at is parsed above).  But be explicit.
7920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      parseTryCatch();
7930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return;
7946092d4ed09a2368871993d9a45717f24394329ceNico Weber    default:
7956092d4ed09a2368871993d9a45717f24394329ceNico Weber      break;
7966092d4ed09a2368871993d9a45717f24394329ceNico Weber    }
7976092d4ed09a2368871993d9a45717f24394329ceNico Weber    break;
798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case tok::kw_asm:
799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    nextToken();
800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (FormatTok->is(tok::l_brace)) {
801b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      FormatTok->Type = TT_InlineASMBrace;
8020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      nextToken();
803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      while (FormatTok && FormatTok->isNot(tok::eof)) {
804176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        if (FormatTok->is(tok::r_brace)) {
805b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          FormatTok->Type = TT_InlineASMBrace;
806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          nextToken();
807b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          addUnwrappedLine();
808176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          break;
809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        }
8100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        FormatTok->Finalized = true;
811176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        nextToken();
812176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      }
813176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
814176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    break;
81515757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko  case tok::kw_namespace:
81615757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko    parseNamespace();
81715757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko    return;
8181f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko  case tok::kw_inline:
8191f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko    nextToken();
82096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (FormatTok->Tok.is(tok::kw_namespace)) {
8211f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko      parseNamespace();
8221f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko      return;
8231f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko    }
8241f94f2b484dc74e09fe31dd5ea9d3f715be6c133Dmitri Gribenko    break;
825a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_public:
826a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_protected:
827a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_private:
8280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (Style.Language == FormatStyle::LK_Java ||
8290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        Style.Language == FormatStyle::LK_JavaScript)
830176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      nextToken();
831176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    else
832176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      parseAccessSpecifier();
833bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    return;
834a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_if:
835a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    parseIfThenElse();
836a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    return;
8372e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko  case tok::kw_for:
8382e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko  case tok::kw_while:
8392e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko    parseForOrWhileLoop();
8402e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko    return;
841a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_do:
842a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    parseDoWhile();
843a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    return;
844a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_switch:
845a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    parseSwitch();
846a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    return;
847a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_default:
848a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    nextToken();
849a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    parseLabel();
850a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    return;
851a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  case tok::kw_case:
852a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    parseCaseLabel();
853bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    return;
8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case tok::kw_try:
8550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  case tok::kw___try:
8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    parseTryCatch();
8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
858d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek  case tok::kw_extern:
859d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek    nextToken();
86096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (FormatTok->Tok.is(tok::string_literal)) {
861d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek      nextToken();
86296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      if (FormatTok->Tok.is(tok::l_brace)) {
863eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper        parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/false);
864d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek        addUnwrappedLine();
865d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek        return;
866d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek      }
867d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek    }
868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
8690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  case tok::kw_export:
8700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (Style.Language == FormatStyle::LK_JavaScript) {
8710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      parseJavaScriptEs6ImportExport();
8720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      return;
8730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
8740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    break;
875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case tok::identifier:
876b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (FormatTok->is(TT_ForEachMacro)) {
877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      parseForOrWhileLoop();
878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return;
879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
88087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (FormatTok->is(TT_MacroBlockBegin)) {
88187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      parseBlock(/*MustBeDeclaration=*/false, /*AddLevel=*/true,
88287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 /*MunchSemi=*/false);
88387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return;
88487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
8854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (FormatTok->is(Keywords.kw_import)) {
8864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_JavaScript) {
8874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        parseJavaScriptEs6ImportExport();
8884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return;
8894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
8904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_Proto) {
8914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        nextToken();
8924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (FormatTok->is(tok::kw_public))
8934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          nextToken();
8944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (!FormatTok->is(tok::string_literal))
8954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          return;
8964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        nextToken();
8974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (FormatTok->is(tok::semi))
8984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          nextToken();
8994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        addUnwrappedLine();
9004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return;
9014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
9020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
90387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (FormatTok->isOneOf(Keywords.kw_signals, Keywords.kw_qsignals,
90487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                           Keywords.kw_slots, Keywords.kw_qslots)) {
905b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      nextToken();
906b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (FormatTok->is(tok::colon)) {
907b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        nextToken();
908b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        addUnwrappedLine();
909b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      }
91058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      return;
91158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar    }
912d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek    // In all other cases, parse the declaration.
913d19dc2ddf3f8630cfdbefec490c0000c14bee6bdManuel Klimek    break;
914a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko  default:
915a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    break;
916bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
917bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  do {
9184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const FormatToken *Previous = getPreviousToken();
91996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    switch (FormatTok->Tok.getKind()) {
920d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber    case tok::at:
921d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber      nextToken();
92296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      if (FormatTok->Tok.is(tok::l_brace))
923d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber        parseBracedList();
924d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber      break;
925a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    case tok::kw_enum:
9264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Ignore if this is part of "template <enum ...".
9274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Previous && Previous->is(tok::less)) {
9284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        nextToken();
9294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        break;
9304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
9314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
93287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      // parseEnum falls through and does not yet add an unwrapped line as an
93387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      // enum definition can start a structural element.
9344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (!parseEnum())
9354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        break;
93687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      // This only applies for C++.
93787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (Style.Language != FormatStyle::LK_Cpp) {
93887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        addUnwrappedLine();
93987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        return;
94087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      }
941308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek      break;
942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::kw_typedef:
943651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      nextToken();
9440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (FormatTok->isOneOf(Keywords.kw_NS_ENUM, Keywords.kw_NS_OPTIONS,
9450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                             Keywords.kw_CF_ENUM, Keywords.kw_CF_OPTIONS))
946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        parseEnum();
947651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
948d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko    case tok::kw_struct:
949d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko    case tok::kw_union:
950de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek    case tok::kw_class:
951b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      // parseRecord falls through and does not yet add an unwrapped line as a
952b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      // record declaration or definition can start a structural element.
95347ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek      parseRecord();
954b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      // This does not apply for Java and JavaScript.
955b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_Java ||
956b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          Style.Language == FormatStyle::LK_JavaScript) {
9574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (FormatTok->is(tok::semi))
9584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          nextToken();
959b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        addUnwrappedLine();
960b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        return;
961b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      }
96247ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek      break;
9630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::period:
9640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      nextToken();
9650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // In Java, classes have an implicit static member "class".
9660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (Style.Language == FormatStyle::LK_Java && FormatTok &&
9670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          FormatTok->is(tok::kw_class))
9680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        nextToken();
96987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_JavaScript && FormatTok &&
97087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          FormatTok->Tok.getIdentifierInfo())
97187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        // JavaScript only has pseudo keywords, all keywords are allowed to
97287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        // appear in "IdentifierName" positions. See http://es5.github.io/#x7.6
97387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        nextToken();
9740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      break;
975bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::semi:
976bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      nextToken();
977bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      addUnwrappedLine();
978bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      return;
979d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko    case tok::r_brace:
980d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko      addUnwrappedLine();
981d881875b6c78386c4f0da911c1110f9ed1235c6aAlexander Kornienko      return;
982bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::l_paren:
983bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      parseParens();
984bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
98587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case tok::kw_operator:
98687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      nextToken();
98787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (FormatTok->isBinaryOperator())
98887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        nextToken();
98987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      break;
990753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek    case tok::caret:
991753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      nextToken();
992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (FormatTok->Tok.isAnyIdentifier() ||
993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          FormatTok->isSimpleTypeSpecifier())
994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        nextToken();
995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (FormatTok->is(tok::l_paren))
996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        parseParens();
997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (FormatTok->is(tok::l_brace))
998753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek        parseChildBlock();
999753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      break;
1000bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::l_brace:
100180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      if (!tryToParseBracedList()) {
100280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek        // A block outside of parentheses must be the last part of a
100380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek        // structural element.
100480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek        // FIXME: Figure out cases where this is not true, and add projections
100580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek        // for them (the one we know is missing are lambdas).
100687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        if (Style.BraceWrapping.AfterFunction)
100780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek          addUnwrappedLine();
1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        FormatTok->Type = TT_FunctionLBrace;
10092726877196b41b922f10f794801b313980e1a8adNico Weber        parseBlock(/*MustBeDeclaration=*/false);
101044135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek        addUnwrappedLine();
101180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek        return;
101280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      }
101380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      // Otherwise this was a braced init list, and the structural
101480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      // element continues.
101580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek      break;
10166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case tok::kw_try:
10176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      // We arrive here when parsing function-try blocks.
10186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      parseTryCatch();
10196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return;
10207e70f4c09c5e10c2690eac04d9d812fb8e4a0c0dDaniel Jasper    case tok::identifier: {
102187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (FormatTok->is(TT_MacroBlockEnd)) {
102287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        addUnwrappedLine();
102387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        return;
102487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      }
102587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1026c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // Parse function literal unless 'function' is the first token in a line
1027c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      // in which case this should be treated as a free-standing function.
1028b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_JavaScript &&
10294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          (FormatTok->is(Keywords.kw_function) ||
10304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           FormatTok->startsSequence(Keywords.kw_async,
10314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                     Keywords.kw_function)) &&
10324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          Line->Tokens.size() > 0) {
10336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        tryToParseJSFunction();
10346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        break;
10356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
1036b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if ((Style.Language == FormatStyle::LK_JavaScript ||
1037b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar           Style.Language == FormatStyle::LK_Java) &&
1038b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          FormatTok->is(Keywords.kw_interface)) {
10394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        if (Style.Language == FormatStyle::LK_JavaScript) {
10404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // In JavaScript/TypeScript, "interface" can be used as a standalone
10414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // identifier, e.g. in `var interface = 1;`. If "interface" is
10424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // followed by another identifier, it is very like to be an actual
10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          // interface declaration.
10444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          unsigned StoredPosition = Tokens->getPosition();
10454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          FormatToken *Next = Tokens->getNextToken();
10464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          FormatTok = Tokens->setPosition(StoredPosition);
10474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          if (Next && !mustBeJSIdent(Keywords, Next)) {
10484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            nextToken();
10494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar            break;
10504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          }
10514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        }
1052b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        parseRecord();
1053b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        addUnwrappedLine();
105487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        return;
1055b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      }
1056b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // See if the following token should start a new unwrapped line.
1058b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      StringRef Text = FormatTok->TokenText;
1059bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      nextToken();
10600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (Line->Tokens.size() == 1 &&
10610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          // JS doesn't have macros, and within classes colons indicate fields,
10620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          // not labels.
106358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar          Style.Language != FormatStyle::LK_JavaScript) {
106458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        if (FormatTok->Tok.is(tok::colon) && !Line->MustBeDeclaration) {
10654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          Line->Tokens.begin()->Tok->MustBreakBefore = true;
10663d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko          parseLabel();
10673d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko          return;
10683d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko        }
1069176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        // Recognize function-like macro usages without trailing semicolon as
10700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        // well as free-standing macros like Q_OBJECT.
1071176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        bool FunctionLike = FormatTok->is(tok::l_paren);
1072176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        if (FunctionLike)
10733d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko          parseParens();
1074b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1075b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        bool FollowedByNewline =
1076b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar            CommentsBeforeNextToken.empty()
1077b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                ? FormatTok->NewlinesBefore > 0
1078b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                : CommentsBeforeNextToken.front()->NewlinesBefore > 0;
1079b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
108087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        if (FollowedByNewline && (Text.size() >= 5 || FunctionLike) &&
1081176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            tokenCanStartNewLine(FormatTok->Tok) && Text == Text.upper()) {
10827e70f4c09c5e10c2690eac04d9d812fb8e4a0c0dDaniel Jasper          addUnwrappedLine();
1083c76d59d8ff564f918833c97caede7dce2d8cfe60Daniel Jasper          return;
10843d713a72a01bf1d270d00040a3fb195121012c61Alexander Kornienko        }
1085bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      }
1086bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
10877e70f4c09c5e10c2690eac04d9d812fb8e4a0c0dDaniel Jasper    }
108805b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper    case tok::equal:
1089b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      // Fat arrows (=>) have tok::TokenKind tok::equal but TokenType
1090b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      // TT_JsFatArrow. The always start an expression or a child block if
1091b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      // followed by a curly.
1092b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (FormatTok->is(TT_JsFatArrow)) {
1093b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        nextToken();
1094b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        if (FormatTok->is(tok::l_brace))
1095b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          parseChildBlock();
1096b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        break;
1097b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      }
1098b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
109905b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper      nextToken();
110096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      if (FormatTok->Tok.is(tok::l_brace)) {
1101bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek        parseBracedList();
1102bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      }
1103bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      break;
1104b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    case tok::l_square:
1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      parseSquare();
1106b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      break;
11073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    case tok::kw_new:
11083ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      parseNew();
11093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      break;
1110bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek    default:
1111bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      nextToken();
1112bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      break;
1113bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek    }
1114bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  } while (!eof());
1115bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek}
1116bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek
1117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool UnwrappedLineParser::tryToParseLambda() {
1118b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (Style.Language != FormatStyle::LK_Cpp) {
1119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    nextToken();
1120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    return false;
1121b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
11224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const FormatToken* Previous = getPreviousToken();
11234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Previous &&
11244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new,
11254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         tok::kw_delete) ||
11264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar       Previous->closesScope() || Previous->isSimpleTypeSpecifier())) {
11272d65705ed0a72ab57b8a062c44c9caa377f9fd2aDaniel Jasper    nextToken();
1128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
11292d65705ed0a72ab57b8a062c44c9caa377f9fd2aDaniel Jasper  }
1130567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  assert(FormatTok->is(tok::l_square));
1131567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  FormatToken &LSquare = *FormatTok;
1132ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper  if (!tryToParseLambdaIntroducer())
1133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
1134b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek
1135b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  while (FormatTok->isNot(tok::l_brace)) {
1136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (FormatTok->isSimpleTypeSpecifier()) {
1137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      nextToken();
1138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      continue;
1139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1140b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    switch (FormatTok->Tok.getKind()) {
1141ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    case tok::l_brace:
1142ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      break;
1143ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    case tok::l_paren:
1144ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      parseParens();
1145ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      break;
11460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::amp:
11470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::star:
11480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::kw_const:
11490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::comma:
1150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::less:
1151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::greater:
1152ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    case tok::identifier:
115387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case tok::numeric_constant:
1154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::coloncolon:
1155ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    case tok::kw_mutable:
1156ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      nextToken();
1157ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      break;
1158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::arrow:
1159b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      FormatTok->Type = TT_LambdaArrow;
1160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      nextToken();
1161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
1162ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    default:
1163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return true;
1164b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    }
1165b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  }
1166567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  LSquare.Type = TT_LambdaLSquare;
1167753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek  parseChildBlock();
1168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
1169b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek}
1170b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek
1171b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimekbool UnwrappedLineParser::tryToParseLambdaIntroducer() {
1172b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  nextToken();
1173b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  if (FormatTok->is(tok::equal)) {
1174b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    nextToken();
1175ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    if (FormatTok->is(tok::r_square)) {
1176ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      nextToken();
1177ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      return true;
1178ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    }
1179ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    if (FormatTok->isNot(tok::comma))
1180ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      return false;
1181b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    nextToken();
1182b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  } else if (FormatTok->is(tok::amp)) {
1183b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    nextToken();
1184ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    if (FormatTok->is(tok::r_square)) {
1185ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      nextToken();
1186ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      return true;
1187ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    }
1188b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    if (!FormatTok->isOneOf(tok::comma, tok::identifier)) {
1189b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      return false;
1190b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    }
1191ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    if (FormatTok->is(tok::comma))
1192ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      nextToken();
1193b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  } else if (FormatTok->is(tok::r_square)) {
1194b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    nextToken();
1195b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    return true;
1196b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  }
1197b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  do {
1198ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    if (FormatTok->is(tok::amp))
1199ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      nextToken();
1200ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    if (!FormatTok->isOneOf(tok::identifier, tok::kw_this))
1201ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      return false;
1202b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    nextToken();
1203c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    if (FormatTok->is(tok::ellipsis))
1204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      nextToken();
1205b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    if (FormatTok->is(tok::comma)) {
1206b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      nextToken();
1207b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    } else if (FormatTok->is(tok::r_square)) {
1208b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      nextToken();
1209b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      return true;
1210b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    } else {
1211b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      return false;
1212b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    }
1213b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  } while (!eof());
1214b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek  return false;
1215b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek}
1216b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek
12176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::tryToParseJSFunction() {
12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  assert(FormatTok->is(Keywords.kw_function) ||
12194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar         FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function));
12204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (FormatTok->is(Keywords.kw_async))
12214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nextToken();
12224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Consume "function".
12236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  nextToken();
1224c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
12254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Consume * (generator function).
12264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (FormatTok->is(tok::star))
12274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nextToken();
12284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1229c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  // Consume function name.
1230c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  if (FormatTok->is(tok::identifier))
12310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    nextToken();
1232c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
12336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (FormatTok->isNot(tok::l_paren))
12346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return;
1235b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1236b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Parse formal parameter list.
1237b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  parseParens();
1238b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1239b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (FormatTok->is(tok::colon)) {
1240b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // Parse a type definition.
12416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    nextToken();
1242b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1243b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // Eat the type declaration. For braced inline object types, balance braces,
1244b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    // otherwise just parse until finding an l_brace for the function body.
1245b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (FormatTok->is(tok::l_brace))
1246b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      tryToParseBracedList();
1247b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    else
124887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      while (FormatTok->isNot(tok::l_brace) && !eof())
1249b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        nextToken();
12506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
1251b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
12526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  parseChildBlock();
12536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
12546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
125580829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimekbool UnwrappedLineParser::tryToParseBracedList() {
12560de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  if (FormatTok->BlockKind == BK_Unknown)
125780829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    calculateBraceTypes();
12580de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  assert(FormatTok->BlockKind != BK_Unknown);
12590de1c4d152b5fbf0b383e9fa8396e334f029c716Daniel Jasper  if (FormatTok->BlockKind == BK_Block)
126080829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek    return false;
126180829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  parseBracedList();
126280829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek  return true;
126380829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek}
126480829bd8c3161cb706e28f29ac17a871f5eaaa5bManuel Klimek
12655798120bc015360951d13a06e17501b909ecd21dDaniel Jasperbool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons) {
12665798120bc015360951d13a06e17501b909ecd21dDaniel Jasper  bool HasError = false;
1267bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  nextToken();
1268bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek
1269423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek  // FIXME: Once we have an expression parser in the UnwrappedLineParser,
1270423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek  // replace this by using parseAssigmentExpression() inside.
1271bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek  do {
1272b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (Style.Language == FormatStyle::LK_JavaScript) {
12734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (FormatTok->is(Keywords.kw_function) ||
12744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)) {
1275b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        tryToParseJSFunction();
1276b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        continue;
1277b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      }
1278b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (FormatTok->is(TT_JsFatArrow)) {
1279b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        nextToken();
1280b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        // Fat arrows can be followed by simple expressions or by child blocks
1281b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        // in curly braces.
128287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        if (FormatTok->is(tok::l_brace)) {
1283b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          parseChildBlock();
1284b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          continue;
1285b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        }
1286b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      }
12876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
128896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    switch (FormatTok->Tok.getKind()) {
1289753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek    case tok::caret:
1290753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      nextToken();
1291753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      if (FormatTok->is(tok::l_brace)) {
1292753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek        parseChildBlock();
1293753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      }
1294753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      break;
1295753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek    case tok::l_square:
1296753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      tryToParseLambda();
1297753a5114f9076c545c33cf3ced0d76e27bc0a2d5Manuel Klimek      break;
1298bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek    case tok::l_brace:
129931e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek      // Assume there are no blocks inside a braced init list apart
130031e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek      // from the ones we explicitly parse out (like lambdas).
130131e44f7a5d50ab8f7f623a7d2e18d5d877ef400dManuel Klimek      FormatTok->BlockKind = BK_BracedInit;
1302bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      parseBracedList();
130305b1ac8791ee89fdf0b275631ab8118febc7c33dDaniel Jasper      break;
130487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    case tok::l_paren:
130587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      parseParens();
130658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      // JavaScript can just have free standing methods and getters/setters in
130758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      // object literals. Detect them by a "{" following ")".
130858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_JavaScript) {
130958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        if (FormatTok->is(tok::l_brace))
131058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar          parseChildBlock();
131158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar        break;
131258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      }
131358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar      break;
1314bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek    case tok::r_brace:
1315bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      nextToken();
13165798120bc015360951d13a06e17501b909ecd21dDaniel Jasper      return !HasError;
1317423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek    case tok::semi:
13184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // JavaScript (or more precisely TypeScript) can have semicolons in braced
13194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // lists (in so-called TypeMemberLists). Thus, the semicolon cannot be
13204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // used for error recovery if we have otherwise determined that this is
13214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // a braced list.
13224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_JavaScript) {
13234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        nextToken();
13244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        break;
13254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
13265798120bc015360951d13a06e17501b909ecd21dDaniel Jasper      HasError = true;
13275798120bc015360951d13a06e17501b909ecd21dDaniel Jasper      if (!ContinueOnSemicolons)
13285798120bc015360951d13a06e17501b909ecd21dDaniel Jasper        return !HasError;
13295798120bc015360951d13a06e17501b909ecd21dDaniel Jasper      nextToken();
13305798120bc015360951d13a06e17501b909ecd21dDaniel Jasper      break;
1331423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek    case tok::comma:
1332423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek      nextToken();
1333423dd93c8011aa8bca9b761b0b121ea8bce0fd03Manuel Klimek      break;
1334a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko    default:
1335a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko      nextToken();
1336a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko      break;
1337bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    }
1338bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } while (!eof());
13395798120bc015360951d13a06e17501b909ecd21dDaniel Jasper  return false;
1340bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1341bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid UnwrappedLineParser::parseParens() {
1343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(FormatTok->Tok.is(tok::l_paren) && "'(' expected.");
1344c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek  nextToken();
1345c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek  do {
134696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    switch (FormatTok->Tok.getKind()) {
1347c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek    case tok::l_paren:
1348c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek      parseParens();
13490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace))
13500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        parseChildBlock();
1351c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek      break;
1352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::r_paren:
1353c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek      nextToken();
1354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return;
1355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::r_brace:
1356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // A "}" inside parenthesis is an error if there wasn't a matching "{".
1357c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek      return;
1358b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek    case tok::l_square:
1359b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      tryToParseLambda();
1360b61a8afba4120f5f1f1af4c7d2a6646a65bd8020Manuel Klimek      break;
13610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    case tok::l_brace:
1362b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (!tryToParseBracedList())
1363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        parseChildBlock();
1364651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
1365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::at:
1366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      nextToken();
1367651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (FormatTok->Tok.is(tok::l_brace))
1368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        parseBracedList();
1369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
1370176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    case tok::identifier:
1371176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (Style.Language == FormatStyle::LK_JavaScript &&
13724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          (FormatTok->is(Keywords.kw_function) ||
13734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar           FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)))
1374176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        tryToParseJSFunction();
1375176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      else
1376176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        nextToken();
1377176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
1378c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek    default:
1379c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek      nextToken();
1380c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek      break;
1381c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek    }
1382c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek  } while (!eof());
1383c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek}
1384c44ee89cb448e34aada006b707eb45a1280f31e3Manuel Klimek
1385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid UnwrappedLineParser::parseSquare() {
1386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(FormatTok->Tok.is(tok::l_square) && "'[' expected.");
1387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (tryToParseLambda())
1388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
1389bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  do {
139096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    switch (FormatTok->Tok.getKind()) {
1391bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    case tok::l_paren:
1392bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      parseParens();
1393bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case tok::r_square:
1395bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      nextToken();
1396bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      return;
1397f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper    case tok::r_brace:
1398f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper      // A "}" inside parenthesis is an error if there wasn't a matching "{".
1399f7ec1cc7f931833b2cb9876a5e7dfd6bf8681c6aDaniel Jasper      return;
1400ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    case tok::l_square:
1401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      parseSquare();
1402ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper      break;
14032afbe523648eb591709ac9262f024457eb019bd6Nico Weber    case tok::l_brace: {
1404b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (!tryToParseBracedList())
1405b7d98a1bd42601a745328e118ed38034a391cc92Manuel Klimek        parseChildBlock();
1406bb42bf1a8bfd18fa2beec7fcbcb73f738fb455baManuel Klimek      break;
14072afbe523648eb591709ac9262f024457eb019bd6Nico Weber    }
1408d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber    case tok::at:
1409d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber      nextToken();
141096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek      if (FormatTok->Tok.is(tok::l_brace))
1411d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber        parseBracedList();
1412d74fcdb630dad817f5d462edd6d12bb95e3f27f1Nico Weber      break;
1413bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    default:
1414bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      nextToken();
1415bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      break;
1416bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    }
1417bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } while (!eof());
1418bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1419bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1420bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseIfThenElse() {
142196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::kw_if) && "'if' expected");
1422bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
142396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_paren))
1424d465843f5376c7c1574fe61338cbf3dc50684d5bManuel Klimek    parseParens();
1425bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  bool NeedsUnwrappedLine = false;
142696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_brace)) {
1427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
14282726877196b41b922f10f794801b313980e1a8adNico Weber    parseBlock(/*MustBeDeclaration=*/false);
142987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.BeforeElse)
1430e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek      addUnwrappedLine();
143187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    else
1432e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek      NeedsUnwrappedLine = true;
1433bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } else {
1434bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    addUnwrappedLine();
1435526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    ++Line->Level;
1436f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek    parseStructuralElement();
1437526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    --Line->Level;
1438bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
143996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::kw_else)) {
1440bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    nextToken();
144196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (FormatTok->Tok.is(tok::l_brace)) {
1442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      CompoundStatementIndenter Indenter(this, Style, Line->Level);
14432726877196b41b922f10f794801b313980e1a8adNico Weber      parseBlock(/*MustBeDeclaration=*/false);
1444bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      addUnwrappedLine();
144596e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    } else if (FormatTok->Tok.is(tok::kw_if)) {
1446bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      parseIfThenElse();
1447bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    } else {
1448bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper      addUnwrappedLine();
1449526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek      ++Line->Level;
1450f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek      parseStructuralElement();
14514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (FormatTok->is(tok::eof))
14524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        addUnwrappedLine();
1453526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek      --Line->Level;
1454bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    }
1455bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } else if (NeedsUnwrappedLine) {
1456bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    addUnwrappedLine();
1457bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
1458bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1459bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
14606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UnwrappedLineParser::parseTryCatch() {
14610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  assert(FormatTok->isOneOf(tok::kw_try, tok::kw___try) && "'try' expected");
14626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  nextToken();
14636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool NeedsUnwrappedLine = false;
14646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (FormatTok->is(tok::colon)) {
14656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // We are in a function try block, what comes is an initializer list.
14666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    nextToken();
14676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    while (FormatTok->is(tok::identifier)) {
14686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      nextToken();
14696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (FormatTok->is(tok::l_paren))
14706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        parseParens();
14716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (FormatTok->is(tok::comma))
14726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        nextToken();
14736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
14746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
14750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Parse try with resource.
14760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_paren)) {
14770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    parseParens();
14780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
14796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (FormatTok->is(tok::l_brace)) {
14806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
14816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    parseBlock(/*MustBeDeclaration=*/false);
148287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.BeforeCatch) {
14836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      addUnwrappedLine();
14846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    } else {
14856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NeedsUnwrappedLine = true;
14866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
14876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  } else if (!FormatTok->is(tok::kw_catch)) {
14886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // The C++ standard requires a compound-statement after a try.
14896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // If there's none, we try to assume there's a structuralElement
14906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // and try to continue.
14916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    addUnwrappedLine();
14926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ++Line->Level;
14936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    parseStructuralElement();
14946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    --Line->Level;
14956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
14960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  while (1) {
14970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (FormatTok->is(tok::at))
14980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      nextToken();
14990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    if (!(FormatTok->isOneOf(tok::kw_catch, Keywords.kw___except,
15000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                             tok::kw___finally) ||
15010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          ((Style.Language == FormatStyle::LK_Java ||
15020e2c34f92f00628d48968dfea096d36381f494cbStephen Hines            Style.Language == FormatStyle::LK_JavaScript) &&
15030e2c34f92f00628d48968dfea096d36381f494cbStephen Hines           FormatTok->is(Keywords.kw_finally)) ||
15040e2c34f92f00628d48968dfea096d36381f494cbStephen Hines          (FormatTok->Tok.isObjCAtKeyword(tok::objc_catch) ||
15050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines           FormatTok->Tok.isObjCAtKeyword(tok::objc_finally))))
15060e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      break;
15076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    nextToken();
15086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    while (FormatTok->isNot(tok::l_brace)) {
15096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (FormatTok->is(tok::l_paren)) {
15106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        parseParens();
15116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        continue;
15126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
15130e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (FormatTok->isOneOf(tok::semi, tok::r_brace, tok::eof))
15146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        return;
15156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      nextToken();
15166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
15176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    NeedsUnwrappedLine = false;
15186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
15196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    parseBlock(/*MustBeDeclaration=*/false);
152087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.BeforeCatch)
15216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      addUnwrappedLine();
152287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    else
15236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      NeedsUnwrappedLine = true;
15246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
152587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (NeedsUnwrappedLine)
15266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    addUnwrappedLine();
15276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
15286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
152915757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienkovoid UnwrappedLineParser::parseNamespace() {
153096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected");
1531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1532176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const FormatToken &InitialToken = *FormatTok;
153315757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko  nextToken();
153487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  while (FormatTok->isOneOf(tok::identifier, tok::coloncolon))
153515757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko    nextToken();
153696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_brace)) {
1537176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (ShouldBreakBeforeBrace(Style, InitialToken))
153844135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek      addUnwrappedLine();
153944135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek
1540eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper    bool AddLevel = Style.NamespaceIndentation == FormatStyle::NI_All ||
1541eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper                    (Style.NamespaceIndentation == FormatStyle::NI_Inner &&
1542eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper                     DeclarationScopeStack.size() > 1);
1543eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper    parseBlock(/*MustBeDeclaration=*/true, AddLevel);
15447fc2db0acd3fb0f38db19764eef137ae3a9edc9fManuel Klimek    // Munch the semicolon after a namespace. This is more common than one would
15457fc2db0acd3fb0f38db19764eef137ae3a9edc9fManuel Klimek    // think. Puttin the semicolon into its own line is very ugly.
154696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (FormatTok->Tok.is(tok::semi))
15477fc2db0acd3fb0f38db19764eef137ae3a9edc9fManuel Klimek      nextToken();
154815757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko    addUnwrappedLine();
154915757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko  }
155015757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko  // FIXME: Add error handling.
155115757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko}
155215757316d67cb7a854d53a0402d67ad58347600aAlexander Kornienko
15533ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainarvoid UnwrappedLineParser::parseNew() {
15543ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  assert(FormatTok->is(tok::kw_new) && "'new' expected");
15553ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  nextToken();
15563ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  if (Style.Language != FormatStyle::LK_Java)
15573ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    return;
15583ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
15593ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // In Java, we can parse everything up to the parens, which aren't optional.
15603ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  do {
15613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    // There should not be a ;, { or } before the new's open paren.
15623ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    if (FormatTok->isOneOf(tok::semi, tok::l_brace, tok::r_brace))
15633ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      return;
15643ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
15653ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    // Consume the parens.
15663ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    if (FormatTok->is(tok::l_paren)) {
15673ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      parseParens();
15683ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
15693ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      // If there is a class body of an anonymous class, consume that as child.
15703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      if (FormatTok->is(tok::l_brace))
15713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar        parseChildBlock();
15723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar      return;
15733ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    }
15743ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    nextToken();
15753ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  } while (!eof());
15763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar}
15773ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar
15782e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienkovoid UnwrappedLineParser::parseForOrWhileLoop() {
1579b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  assert(FormatTok->isOneOf(tok::kw_for, tok::kw_while, TT_ForEachMacro) &&
1580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         "'for', 'while' or foreach macro expected");
15812e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko  nextToken();
158296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_paren))
15836eca03fcac1e408470d48e6309a280d3681f717dManuel Klimek    parseParens();
158496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_brace)) {
1585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
15862726877196b41b922f10f794801b313980e1a8adNico Weber    parseBlock(/*MustBeDeclaration=*/false);
15872e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko    addUnwrappedLine();
15882e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko  } else {
15892e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko    addUnwrappedLine();
1590526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    ++Line->Level;
1591f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek    parseStructuralElement();
1592526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    --Line->Level;
15932e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko  }
15942e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko}
15952e97cfc78743fcaa988e3c45f7af1002063f780cAlexander Kornienko
1596bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseDoWhile() {
159796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::kw_do) && "'do' expected");
1598bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
159996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_brace)) {
1600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
16012726877196b41b922f10f794801b313980e1a8adNico Weber    parseBlock(/*MustBeDeclaration=*/false);
160287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.IndentBraces)
1603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      addUnwrappedLine();
1604bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } else {
1605bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    addUnwrappedLine();
1606526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    ++Line->Level;
1607f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek    parseStructuralElement();
1608526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    --Line->Level;
1609bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
1610bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1611393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko  // FIXME: Add error handling.
161296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (!FormatTok->Tok.is(tok::kw_while)) {
1613393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko    addUnwrappedLine();
1614393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko    return;
1615393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko  }
1616393b008bcebb0a678a5a0a93ad69e28a30a62e84Alexander Kornienko
1617bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
1618f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek  parseStructuralElement();
1619bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1620bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1621bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseLabel() {
1622bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
1623526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek  unsigned OldLineLevel = Line->Level;
1624bcca7e484117f3155ff98f9560996e760ca4f786Daniel Jasper  if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0))
1625526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek    --Line->Level;
162696e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) {
1627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
16282726877196b41b922f10f794801b313980e1a8adNico Weber    parseBlock(/*MustBeDeclaration=*/false);
1629e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek    if (FormatTok->Tok.is(tok::kw_break)) {
163087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (Style.BraceWrapping.AfterControlStatement)
1631e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek        addUnwrappedLine();
1632e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek      parseStructuralElement();
1633e490705e6678a2e830cecacbe8142d9b369d8341Manuel Klimek    }
1634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addUnwrappedLine();
1635651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else {
1636b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (FormatTok->is(tok::semi))
1637b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      nextToken();
1638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addUnwrappedLine();
1639bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
1640526ed11ad9743c773df76bd1649d33fb92c2b8cbManuel Klimek  Line->Level = OldLineLevel;
16414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (FormatTok->isNot(tok::l_brace)) {
16424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    parseStructuralElement();
16434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    addUnwrappedLine();
16444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
1645bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1646bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1647bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseCaseLabel() {
164896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::kw_case) && "'case' expected");
1649bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  // FIXME: fix handling of complex expressions here.
1650bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  do {
1651bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    nextToken();
165296e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  } while (!eof() && !FormatTok->Tok.is(tok::colon));
1653bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  parseLabel();
1654bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1655bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1656bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseSwitch() {
165796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::kw_switch) && "'switch' expected");
1658bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
165996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_paren))
16606eca03fcac1e408470d48e6309a280d3681f717dManuel Klimek    parseParens();
166196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_brace)) {
1662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CompoundStatementIndenter Indenter(this, Style, Line->Level);
1663eff18b9b6f1218a6bbe4869989b08867823a4e75Daniel Jasper    parseBlock(/*MustBeDeclaration=*/false);
1664bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    addUnwrappedLine();
1665bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  } else {
1666bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    addUnwrappedLine();
1667e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper    ++Line->Level;
1668f0ab0a38d9482eef5495db845ff53ee689f9c80eManuel Klimek    parseStructuralElement();
1669e865cc5e183a25983bc79aca2c9bc9a6fb775ab2Daniel Jasper    --Line->Level;
1670bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  }
1671bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1672bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
1673bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::parseAccessSpecifier() {
1674bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  nextToken();
1675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Understand Qt's slots.
167658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  if (FormatTok->isOneOf(Keywords.kw_slots, Keywords.kw_qslots))
1677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    nextToken();
167856e49c5cc2b05e805c7aa9dc53672711e540d58bAlexander Kornienko  // Otherwise, we don't know what it is, and we'd better keep the next token.
167996e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::colon))
168056e49c5cc2b05e805c7aa9dc53672711e540d58bAlexander Kornienko    nextToken();
1681bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  addUnwrappedLine();
1682bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1683bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
16844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarbool UnwrappedLineParser::parseEnum() {
1685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Won't be 'enum' for NS_ENUMs.
1686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (FormatTok->Tok.is(tok::kw_enum))
1687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    nextToken();
1688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
16894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // In TypeScript, "enum" can also be used as property name, e.g. in interface
16904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // declarations. An "enum" keyword followed by a colon would be a syntax
16914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // error and thus assume it is just an identifier.
16924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Style.Language == FormatStyle::LK_JavaScript &&
16934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      FormatTok->isOneOf(tok::colon, tok::question))
16944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return false;
16954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1696cbeb1c6f337f73fe7d1135b379e45fbda0c4766dDaniel Jasper  // Eat up enum class ...
16976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (FormatTok->Tok.is(tok::kw_class) || FormatTok->Tok.is(tok::kw_struct))
16986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    nextToken();
169987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1700e27dc5d8ab967912b9a3d792ad32cad63981a974Daniel Jasper  while (FormatTok->Tok.getIdentifierInfo() ||
1701176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         FormatTok->isOneOf(tok::colon, tok::coloncolon, tok::less,
1702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                            tok::greater, tok::comma, tok::question)) {
1703308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek    nextToken();
1704308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek    // We can have macros or attributes in between 'enum' and the enum name.
1705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (FormatTok->is(tok::l_paren))
1706a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko      parseParens();
170787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (FormatTok->is(tok::identifier)) {
1708a166e73d39d2f554d0f35f94c9804284d1ff804aAlexander Kornienko      nextToken();
170987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      // If there are two identifiers in a row, this is likely an elaborate
171087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      // return type. In Java, this can be "implements", etc.
171187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      if (Style.Language == FormatStyle::LK_Cpp &&
171287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          FormatTok->is(tok::identifier))
17134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        return false;
171487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
1715308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek  }
1716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Just a declaration or something is wrong.
1718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (FormatTok->isNot(tok::l_brace))
17194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return true;
1720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FormatTok->BlockKind = BK_Block;
1721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Style.Language == FormatStyle::LK_Java) {
1723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // Java enums are different.
1724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    parseJavaEnumBody();
17254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return true;
17264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
17274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Style.Language == FormatStyle::LK_Proto) {
172887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    parseBlock(/*MustBeDeclaration=*/true);
17294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return true;
1730308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek  }
1731176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1732176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Parse enum body.
1733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool HasError = !parseBracedList(/*ContinueOnSemicolons=*/true);
1734176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (HasError) {
1735176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (FormatTok->is(tok::semi))
1736176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      nextToken();
1737176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    addUnwrappedLine();
1738176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
17394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return true;
1740176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
174187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // There is no addUnwrappedLine() here so that we fall through to parsing a
174287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // structural element afterwards. Thus, in "enum A {} n, m;",
1743308232c0aef773d24693f9e456dc3bc983934f7fManuel Klimek  // "} n, m;" will end up in one unwrapped line.
1744de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek}
1745de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek
1746176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid UnwrappedLineParser::parseJavaEnumBody() {
1747176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Determine whether the enum is simple, i.e. does not have a semicolon or
1748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // constants with class bodies. Simple enums can be formatted like braced
1749176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // lists, contracted to a single line, etc.
1750176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  unsigned StoredPosition = Tokens->getPosition();
1751176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool IsSimple = true;
1752176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FormatToken *Tok = Tokens->getNextToken();
1753176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (Tok) {
1754176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Tok->is(tok::r_brace))
1755176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
1756176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (Tok->isOneOf(tok::l_brace, tok::semi)) {
1757176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      IsSimple = false;
1758176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
1759176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1760176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // FIXME: This will also mark enums with braces in the arguments to enum
1761176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    // constants as "not simple". This is probably fine in practice, though.
1762176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Tok = Tokens->getNextToken();
1763176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1764176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FormatTok = Tokens->setPosition(StoredPosition);
1765176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1766176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (IsSimple) {
1767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    parseBracedList();
1768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    addUnwrappedLine();
1769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return;
1770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Parse the body of a more complex enum.
1773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // First add a line for everything up to the "{".
1774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  nextToken();
1775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  addUnwrappedLine();
1776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ++Line->Level;
1777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Parse the enum constants.
1779176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (FormatTok) {
1780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (FormatTok->is(tok::l_brace)) {
1781176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      // Parse the constant's class body.
1782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true,
1783176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                 /*MunchSemi=*/false);
1784176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (FormatTok->is(tok::l_paren)) {
1785176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      parseParens();
1786176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (FormatTok->is(tok::comma)) {
1787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      nextToken();
1788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      addUnwrappedLine();
1789176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (FormatTok->is(tok::semi)) {
1790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      nextToken();
1791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      addUnwrappedLine();
1792176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
1793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else if (FormatTok->is(tok::r_brace)) {
1794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      addUnwrappedLine();
1795176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      break;
1796176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    } else {
1797176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      nextToken();
1798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
1799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
1800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1801176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Parse the class body after the enum's ";" if any.
1802176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  parseLevel(/*HasOpeningBrace=*/true);
1803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  nextToken();
1804176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  --Line->Level;
1805176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  addUnwrappedLine();
1806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
1807176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
180847ea7f64108163491ed74dc746c8d94e10764704Manuel Klimekvoid UnwrappedLineParser::parseRecord() {
1809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const FormatToken &InitialToken = *FormatTok;
1810de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek  nextToken();
1811b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
1812b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // The actual identifier can be a nested name specifier, and in macros
1813b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // it is often token-pasted.
1814b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::hashhash,
1815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                            tok::kw___attribute, tok::kw___declspec,
1816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                            tok::kw_alignas) ||
1817b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar         ((Style.Language == FormatStyle::LK_Java ||
1818b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar           Style.Language == FormatStyle::LK_JavaScript) &&
1819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          FormatTok->isOneOf(tok::period, tok::comma))) {
1820b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    bool IsNonMacroIdentifier =
1821b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        FormatTok->is(tok::identifier) &&
1822b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        FormatTok->TokenText != FormatTok->TokenText.upper();
182347ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek    nextToken();
182447ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek    // We can have macros or attributes in between 'class' and the class name.
1825b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (!IsNonMacroIdentifier && FormatTok->Tok.is(tok::l_paren))
182647ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek      parseParens();
1827b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  }
182847ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek
1829b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Note that parsing away template declarations here leads to incorrectly
1830b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // accepting function declarations as record declarations.
1831b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // In general, we cannot solve this problem. Consider:
1832b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // class A<int> B() {}
1833b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // which can be a function definition or a class definition when B() is a
1834b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // macro. If we find enough real-world cases where this is a problem, we
1835b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // can parse for the 'template' keyword in the beginning of the statement,
1836b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // and thus rule out the record production in case there is no template
1837b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // (this would still leave us with an ambiguity between template function
1838b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // and class declarations).
1839b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (FormatTok->isOneOf(tok::colon, tok::less)) {
1840b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    while (!eof()) {
1841b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (FormatTok->is(tok::l_brace)) {
1842b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        calculateBraceTypes(/*ExpectClassBody=*/true);
1843b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        if (!tryToParseBracedList())
1844b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar          break;
1845606e07ecc0b7b0e01d23baa833b4b4c73af0d4f4Manuel Klimek      }
1846b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      if (FormatTok->Tok.is(tok::semi))
1847b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        return;
1848b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar      nextToken();
1849de7685487c5d628dd9fe64c4f861cd1888f50fc7Manuel Klimek    }
185047ea7f64108163491ed74dc746c8d94e10764704Manuel Klimek  }
185196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::l_brace)) {
1852176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (ShouldBreakBeforeBrace(Style, InitialToken))
185344135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek      addUnwrappedLine();
185444135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek
1855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true,
1856aabfb2712e180bb11e5dfc4f2a273890a6c5da66Manuel Klimek               /*MunchSemi=*/false);
185744135b8836fc3ffb84e540d8a097955271ccbc23Manuel Klimek  }
185887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // There is no addUnwrappedLine() here so that we fall through to parsing a
185987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // structural element afterwards. Thus, in "class A {} n, m;",
186087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // "} n, m;" will end up in one unwrapped line.
1861bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
1862bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
18631abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Webervoid UnwrappedLineParser::parseObjCProtocolList() {
186496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  assert(FormatTok->Tok.is(tok::less) && "'<' expected.");
18651abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  do
18661abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    nextToken();
186796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  while (!eof() && FormatTok->Tok.isNot(tok::greater));
18681abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  nextToken(); // Skip '>'.
18691abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber}
18701abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber
18711abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Webervoid UnwrappedLineParser::parseObjCUntilAtEnd() {
18721abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  do {
187396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (FormatTok->Tok.isObjCAtKeyword(tok::objc_end)) {
18741abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber      nextToken();
18751abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber      addUnwrappedLine();
18761abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber      break;
18771abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    }
18787186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper    if (FormatTok->is(tok::l_brace)) {
18797186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper      parseBlock(/*MustBeDeclaration=*/false);
18807186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper      // In ObjC interfaces, nothing should be following the "}".
18817186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper      addUnwrappedLine();
1882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (FormatTok->is(tok::r_brace)) {
1883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Ignore stray "}". parseStructuralElement doesn't consume them.
1884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      nextToken();
1885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      addUnwrappedLine();
18867186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper    } else {
18877186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper      parseStructuralElement();
18887186ccc86ee5802c33886d6dd4c5386c7e9fd1aaDaniel Jasper    }
18891abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  } while (!eof());
18901abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber}
18911abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber
189250767d8c8f2f667255bdb99692c0467ce992bc67Nico Webervoid UnwrappedLineParser::parseObjCInterfaceOrImplementation() {
189327d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber  nextToken();
1894f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper  nextToken(); // interface name
189527d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
189627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber  // @interface can be followed by either a base class, or a category.
189796e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::colon)) {
189827d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber    nextToken();
1899f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper    nextToken(); // base class name
190096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  } else if (FormatTok->Tok.is(tok::l_paren))
190127d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber    // Skip category, if present.
190227d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber    parseParens();
190327d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
190496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::less))
19051abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    parseObjCProtocolList();
190627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
19076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (FormatTok->Tok.is(tok::l_brace)) {
190887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Style.BraceWrapping.AfterObjCDeclaration)
19096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      addUnwrappedLine();
19102726877196b41b922f10f794801b313980e1a8adNico Weber    parseBlock(/*MustBeDeclaration=*/true);
19116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
191227d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
191327d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber  // With instance variables, this puts '}' on its own line.  Without instance
191427d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber  // variables, this ends the @interface line.
191527d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber  addUnwrappedLine();
191627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
19171abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  parseObjCUntilAtEnd();
19181abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber}
191927d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
19201abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Webervoid UnwrappedLineParser::parseObjCProtocol() {
19211abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  nextToken();
1922f9955d309d3de328e65563baf2d34571249dccbbDaniel Jasper  nextToken(); // protocol name
19231abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber
192496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::less))
19251abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    parseObjCProtocolList();
19261abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber
19271abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  // Check for protocol declaration.
192896e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  if (FormatTok->Tok.is(tok::semi)) {
19291abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    nextToken();
19301abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber    return addUnwrappedLine();
19311abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  }
19321abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber
19331abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  addUnwrappedLine();
19341abe6ea5b8961a0fc14c2e0bdbd7451f643ca065Nico Weber  parseObjCUntilAtEnd();
193527d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber}
193627d1367871a6eab347346497e87ea1adb2fd15a5Nico Weber
19370e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid UnwrappedLineParser::parseJavaScriptEs6ImportExport() {
19384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool IsImport = FormatTok->is(Keywords.kw_import);
19394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  assert(IsImport || FormatTok->is(tok::kw_export));
19400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  nextToken();
19410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1942b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  // Consume the "default" in "export default class/function".
1943b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (FormatTok->is(tok::kw_default))
1944b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    nextToken();
19450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
19464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Consume "async function", "function" and "default function", so that these
19474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // get parsed as free-standing JS functions, i.e. do not require a trailing
19484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // semicolon.
19494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (FormatTok->is(Keywords.kw_async))
19504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    nextToken();
1951b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (FormatTok->is(Keywords.kw_function)) {
1952b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    nextToken();
19530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    return;
19540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
19550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
19564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // For imports, `export *`, `export {...}`, consume the rest of the line up
19574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // to the terminating `;`. For everything else, just return and continue
19584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // parsing the structural element, i.e. the declaration or expression for
19594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // `export default`.
19604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!IsImport && !FormatTok->isOneOf(tok::l_brace, tok::star) &&
19614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      !FormatTok->isStringLiteral())
19624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return;
19630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
19644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  while (!eof() && FormatTok->isNot(tok::semi)) {
19654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (FormatTok->is(tok::l_brace)) {
19664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      FormatTok->BlockKind = BK_Block;
19674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      parseBracedList();
19684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else {
19694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      nextToken();
19704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
19710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
19720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
19730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1974d98927d76557653fc517f997db89378267f9bdf3Daniel JasperLLVM_ATTRIBUTE_UNUSED static void printDebugInfo(const UnwrappedLine &Line,
1975d98927d76557653fc517f997db89378267f9bdf3Daniel Jasper                                                 StringRef Prefix = "") {
1976567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  llvm::dbgs() << Prefix << "Line(" << Line.Level << ")"
1977567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper               << (Line.InPPDirective ? " MACRO" : "") << ": ";
1978567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(),
1979567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper                                                    E = Line.Tokens.end();
1980567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper       I != E; ++I) {
1981ac2c974bc64d3767ad5e39451a874c50b3004b3aDaniel Jasper    llvm::dbgs() << I->Tok->Tok.getName() << "[" << I->Tok->Type << "] ";
1982567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  }
1983567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(),
1984567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper                                                    E = Line.Tokens.end();
1985567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper       I != E; ++I) {
1986567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    const UnwrappedLineNode &Node = *I;
1987567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    for (SmallVectorImpl<UnwrappedLine>::const_iterator
1988567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper             I = Node.Children.begin(),
1989567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper             E = Node.Children.end();
1990567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper         I != E; ++I) {
1991567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper      printDebugInfo(*I, "\nChild: ");
1992567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    }
1993567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  }
1994567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  llvm::dbgs() << "\n";
1995567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper}
1996567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper
1997bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::addUnwrappedLine() {
1998cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper  if (Line->Tokens.empty())
199926f7e78018ed6ce8aa11b5eef94c772ca4ee48bfDaniel Jasper    return;
20008fa37999164844a926448ef4656bbf7c42070235Manuel Klimek  DEBUG({
2001567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    if (CurrentLines == &Lines)
2002567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper      printDebugInfo(*Line);
20038fa37999164844a926448ef4656bbf7c42070235Manuel Klimek  });
2004b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  CurrentLines->push_back(std::move(*Line));
2005cbb6c41f3cec4a940201a8e2e65743c9f26c3673Daniel Jasper  Line->Tokens.clear();
2006525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek  if (CurrentLines == &Lines && !PreprocessorDirectives.empty()) {
2007b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    CurrentLines->append(
2008b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        std::make_move_iterator(PreprocessorDirectives.begin()),
2009b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar        std::make_move_iterator(PreprocessorDirectives.end()));
2010525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek    PreprocessorDirectives.clear();
2011525fe168c25a8273899281c5d2326c722fc3f2a5Manuel Klimek  }
2012bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
2013bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
201496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekbool UnwrappedLineParser::eof() const { return FormatTok->Tok.is(tok::eof); }
2015bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
20166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesbool UnwrappedLineParser::isOnNewLine(const FormatToken &FormatTok) {
20176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return (Line->InPPDirective || FormatTok.HasUnescapedNewline) &&
20186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         FormatTok.NewlinesBefore > 0;
20196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
20206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
202186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimekvoid UnwrappedLineParser::flushComments(bool NewlineBeforeNext) {
202286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  bool JustComments = Line->Tokens.empty();
202396e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek  for (SmallVectorImpl<FormatToken *>::const_iterator
202486721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek           I = CommentsBeforeNextToken.begin(),
202586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek           E = CommentsBeforeNextToken.end();
202686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek       I != E; ++I) {
2027b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    if (isOnNewLine(**I) && JustComments)
202886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      addUnwrappedLine();
202986721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    pushToken(*I);
203086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  }
2031b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (NewlineBeforeNext && JustComments)
203286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    addUnwrappedLine();
203386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  CommentsBeforeNextToken.clear();
203486721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek}
203586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek
2036bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jaspervoid UnwrappedLineParser::nextToken() {
2037bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper  if (eof())
2038bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper    return;
20396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  flushComments(isOnNewLine(*FormatTok));
204086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  pushToken(FormatTok);
20414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (Style.Language != FormatStyle::LK_JavaScript)
20424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    readToken();
20434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  else
20444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    readTokenWithJavaScriptASI();
20454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
20464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
20474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconst FormatToken *UnwrappedLineParser::getPreviousToken() {
20484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: This is a dirty way to access the previous token. Find a better
20494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // solution.
20504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!Line || Line->Tokens.empty())
20514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return nullptr;
20524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return Line->Tokens.back().Tok;
2053d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek}
2054d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek
2055d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimekvoid UnwrappedLineParser::readToken() {
205686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  bool CommentsInCurrentLine = true;
205786721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  do {
205886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    FormatTok = Tokens->getNextToken();
2059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(FormatTok);
206096e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    while (!Line->InPPDirective && FormatTok->Tok.is(tok::hash) &&
206196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek           (FormatTok->HasUnescapedNewline || FormatTok->IsFirst)) {
206286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      // If there is an unfinished unwrapped line, we flush the preprocessor
206386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      // directives only after that unwrapped line was finished later.
20640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      bool SwitchToPreprocessorLines = !Line->Tokens.empty();
206586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      ScopedLineState BlockState(*this, SwitchToPreprocessorLines);
20664128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4Alexander Kornienko      // Comments stored before the preprocessor directive need to be output
20674128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4Alexander Kornienko      // before the preprocessor directive, at the same level as the
20684128e19d6f3ae42e840bc6aaf6ce6d052a46f7e4Alexander Kornienko      // preprocessor directive, as we consider them to apply to the directive.
20696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      flushComments(isOnNewLine(*FormatTok));
207086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      parsePPDirective();
207186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    }
20726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    while (FormatTok->Type == TT_ConflictStart ||
20736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines           FormatTok->Type == TT_ConflictEnd ||
20746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines           FormatTok->Type == TT_ConflictAlternative) {
20756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (FormatTok->Type == TT_ConflictStart) {
20766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        conditionalCompilationStart(/*Unreachable=*/false);
20776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      } else if (FormatTok->Type == TT_ConflictAlternative) {
20786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        conditionalCompilationAlternative();
20796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      } else if (FormatTok->Type == TT_ConflictEnd) {
20806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        conditionalCompilationEnd();
20816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
20826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      FormatTok = Tokens->getNextToken();
20836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      FormatTok->MustBreakBefore = true;
20846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
20856fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko
20866fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    if (!PPStack.empty() && (PPStack.back() == PP_Unreachable) &&
20876fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko        !Line->InPPDirective) {
20886fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko      continue;
20896fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko    }
20906fb46b02599493d16e5130eff61050c72f65f89eAlexander Kornienko
209196e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimek    if (!FormatTok->Tok.is(tok::comment))
209286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      return;
20936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (isOnNewLine(*FormatTok) || FormatTok->IsFirst) {
209486721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      CommentsInCurrentLine = false;
209586721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    }
209686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    if (CommentsInCurrentLine) {
209786721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      pushToken(FormatTok);
209886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    } else {
209986721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek      CommentsBeforeNextToken.push_back(FormatTok);
210086721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    }
210186721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  } while (!eof());
210286721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek}
210386721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek
210496e888b0dd3f114eee7e4455a74b8cb5f52e071dManuel Klimekvoid UnwrappedLineParser::pushToken(FormatToken *Tok) {
2105567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper  Line->Tokens.push_back(UnwrappedLineNode(Tok));
210686721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek  if (MustBreakBeforeNextToken) {
2107567dcf95424d69657f75e4bfd028967ca1f9eb8dDaniel Jasper    Line->Tokens.back().Tok->MustBreakBefore = true;
210886721d2a4610ac0a4b162952ec409df1fe397d58Manuel Klimek    MustBreakBeforeNextToken = false;
2109d4397b99e2fcb189002d04410d7c3bf85ab4bba3Manuel Klimek  }
2110bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper}
2111bac016bd3f67ca2f4db1ddc619e611759352b84dDaniel Jasper
2112cd162384a552ef4e4913244f4f14b9a3e5a791e1Daniel Jasper} // end namespace format
2113cd162384a552ef4e4913244f4f14b9a3e5a791e1Daniel Jasper} // end namespace clang
2114