1 //===--- UnwrappedLineParser.cpp - Format C++ code ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// This file contains the implementation of the UnwrappedLineParser,
12 /// which turns a stream of tokens into UnwrappedLines.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #include "UnwrappedLineParser.h"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/Support/Debug.h"
19 #include "llvm/Support/raw_ostream.h"
20 
21 #include <algorithm>
22 
23 #define DEBUG_TYPE "format-parser"
24 
25 namespace clang {
26 namespace format {
27 
28 class FormatTokenSource {
29 public:
30   virtual ~FormatTokenSource() {}
31   virtual FormatToken *getNextToken() = 0;
32 
33   virtual unsigned getPosition() = 0;
34   virtual FormatToken *setPosition(unsigned Position) = 0;
35 };
36 
37 namespace {
38 
39 class ScopedDeclarationState {
40 public:
41   ScopedDeclarationState(UnwrappedLine &Line, std::vector<bool> &Stack,
42                          bool MustBeDeclaration)
43       : Line(Line), Stack(Stack) {
44     Line.MustBeDeclaration = MustBeDeclaration;
45     Stack.push_back(MustBeDeclaration);
46   }
47   ~ScopedDeclarationState() {
48     Stack.pop_back();
49     if (!Stack.empty())
50       Line.MustBeDeclaration = Stack.back();
51     else
52       Line.MustBeDeclaration = true;
53   }
54 
55 private:
56   UnwrappedLine &Line;
57   std::vector<bool> &Stack;
58 };
59 
60 static bool isLineComment(const FormatToken &FormatTok) {
61   return FormatTok.is(tok::comment) && !FormatTok.TokenText.startswith("/*");
62 }
63 
64 // Checks if \p FormatTok is a line comment that continues the line comment
65 // \p Previous. The original column of \p MinColumnToken is used to determine
66 // whether \p FormatTok is indented enough to the right to continue \p Previous.
67 static bool continuesLineComment(const FormatToken &FormatTok,
68                                  const FormatToken *Previous,
69                                  const FormatToken *MinColumnToken) {
70   if (!Previous || !MinColumnToken)
71     return false;
72   unsigned MinContinueColumn =
73       MinColumnToken->OriginalColumn + (isLineComment(*MinColumnToken) ? 0 : 1);
74   return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
75          isLineComment(*Previous) &&
76          FormatTok.OriginalColumn >= MinContinueColumn;
77 }
78 
79 class ScopedMacroState : public FormatTokenSource {
80 public:
81   ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource,
82                    FormatToken *&ResetToken)
83       : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken),
84         PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource),
85         Token(nullptr), PreviousToken(nullptr) {
86     FakeEOF.Tok.startToken();
87     FakeEOF.Tok.setKind(tok::eof);
88     TokenSource = this;
89     Line.Level = 0;
90     Line.InPPDirective = true;
91   }
92 
93   ~ScopedMacroState() override {
94     TokenSource = PreviousTokenSource;
95     ResetToken = Token;
96     Line.InPPDirective = false;
97     Line.Level = PreviousLineLevel;
98   }
99 
100   FormatToken *getNextToken() override {
101     // The \c UnwrappedLineParser guards against this by never calling
102     // \c getNextToken() after it has encountered the first eof token.
103     assert(!eof());
104     PreviousToken = Token;
105     Token = PreviousTokenSource->getNextToken();
106     if (eof())
107       return &FakeEOF;
108     return Token;
109   }
110 
111   unsigned getPosition() override { return PreviousTokenSource->getPosition(); }
112 
113   FormatToken *setPosition(unsigned Position) override {
114     PreviousToken = nullptr;
115     Token = PreviousTokenSource->setPosition(Position);
116     return Token;
117   }
118 
119 private:
120   bool eof() {
121     return Token && Token->HasUnescapedNewline &&
122            !continuesLineComment(*Token, PreviousToken,
123                                  /*MinColumnToken=*/PreviousToken);
124   }
125 
126   FormatToken FakeEOF;
127   UnwrappedLine &Line;
128   FormatTokenSource *&TokenSource;
129   FormatToken *&ResetToken;
130   unsigned PreviousLineLevel;
131   FormatTokenSource *PreviousTokenSource;
132 
133   FormatToken *Token;
134   FormatToken *PreviousToken;
135 };
136 
137 } // end anonymous namespace
138 
139 class ScopedLineState {
140 public:
141   ScopedLineState(UnwrappedLineParser &Parser,
142                   bool SwitchToPreprocessorLines = false)
143       : Parser(Parser), OriginalLines(Parser.CurrentLines) {
144     if (SwitchToPreprocessorLines)
145       Parser.CurrentLines = &Parser.PreprocessorDirectives;
146     else if (!Parser.Line->Tokens.empty())
147       Parser.CurrentLines = &Parser.Line->Tokens.back().Children;
148     PreBlockLine = std::move(Parser.Line);
149     Parser.Line = llvm::make_unique<UnwrappedLine>();
150     Parser.Line->Level = PreBlockLine->Level;
151     Parser.Line->InPPDirective = PreBlockLine->InPPDirective;
152   }
153 
154   ~ScopedLineState() {
155     if (!Parser.Line->Tokens.empty()) {
156       Parser.addUnwrappedLine();
157     }
158     assert(Parser.Line->Tokens.empty());
159     Parser.Line = std::move(PreBlockLine);
160     if (Parser.CurrentLines == &Parser.PreprocessorDirectives)
161       Parser.MustBreakBeforeNextToken = true;
162     Parser.CurrentLines = OriginalLines;
163   }
164 
165 private:
166   UnwrappedLineParser &Parser;
167 
168   std::unique_ptr<UnwrappedLine> PreBlockLine;
169   SmallVectorImpl<UnwrappedLine> *OriginalLines;
170 };
171 
172 class CompoundStatementIndenter {
173 public:
174   CompoundStatementIndenter(UnwrappedLineParser *Parser,
175                             const FormatStyle &Style, unsigned &LineLevel)
176       : LineLevel(LineLevel), OldLineLevel(LineLevel) {
177     if (Style.BraceWrapping.AfterControlStatement)
178       Parser->addUnwrappedLine();
179     if (Style.BraceWrapping.IndentBraces)
180       ++LineLevel;
181   }
182   ~CompoundStatementIndenter() { LineLevel = OldLineLevel; }
183 
184 private:
185   unsigned &LineLevel;
186   unsigned OldLineLevel;
187 };
188 
189 namespace {
190 
191 class IndexedTokenSource : public FormatTokenSource {
192 public:
193   IndexedTokenSource(ArrayRef<FormatToken *> Tokens)
194       : Tokens(Tokens), Position(-1) {}
195 
196   FormatToken *getNextToken() override {
197     ++Position;
198     return Tokens[Position];
199   }
200 
201   unsigned getPosition() override {
202     assert(Position >= 0);
203     return Position;
204   }
205 
206   FormatToken *setPosition(unsigned P) override {
207     Position = P;
208     return Tokens[Position];
209   }
210 
211   void reset() { Position = -1; }
212 
213 private:
214   ArrayRef<FormatToken *> Tokens;
215   int Position;
216 };
217 
218 } // end anonymous namespace
219 
220 UnwrappedLineParser::UnwrappedLineParser(const FormatStyle &Style,
221                                          const AdditionalKeywords &Keywords,
222                                          unsigned FirstStartColumn,
223                                          ArrayRef<FormatToken *> Tokens,
224                                          UnwrappedLineConsumer &Callback)
225     : Line(new UnwrappedLine), MustBreakBeforeNextToken(false),
226       CurrentLines(&Lines), Style(Style), Keywords(Keywords),
227       CommentPragmasRegex(Style.CommentPragmas), Tokens(nullptr),
228       Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1),
229       IncludeGuard(Style.IndentPPDirectives == FormatStyle::PPDIS_None
230                        ? IG_Rejected
231                        : IG_Inited),
232       IncludeGuardToken(nullptr), FirstStartColumn(FirstStartColumn) {}
233 
234 void UnwrappedLineParser::reset() {
235   PPBranchLevel = -1;
236   IncludeGuard = Style.IndentPPDirectives == FormatStyle::PPDIS_None
237                      ? IG_Rejected
238                      : IG_Inited;
239   IncludeGuardToken = nullptr;
240   Line.reset(new UnwrappedLine);
241   CommentsBeforeNextToken.clear();
242   FormatTok = nullptr;
243   MustBreakBeforeNextToken = false;
244   PreprocessorDirectives.clear();
245   CurrentLines = &Lines;
246   DeclarationScopeStack.clear();
247   PPStack.clear();
248   Line->FirstStartColumn = FirstStartColumn;
249 }
250 
251 void UnwrappedLineParser::parse() {
252   IndexedTokenSource TokenSource(AllTokens);
253   Line->FirstStartColumn = FirstStartColumn;
254   do {
255     LLVM_DEBUG(llvm::dbgs() << "----\n");
256     reset();
257     Tokens = &TokenSource;
258     TokenSource.reset();
259 
260     readToken();
261     parseFile();
262 
263     // If we found an include guard then all preprocessor directives (other than
264     // the guard) are over-indented by one.
265     if (IncludeGuard == IG_Found)
266       for (auto &Line : Lines)
267         if (Line.InPPDirective && Line.Level > 0)
268           --Line.Level;
269 
270     // Create line with eof token.
271     pushToken(FormatTok);
272     addUnwrappedLine();
273 
274     for (SmallVectorImpl<UnwrappedLine>::iterator I = Lines.begin(),
275                                                   E = Lines.end();
276          I != E; ++I) {
277       Callback.consumeUnwrappedLine(*I);
278     }
279     Callback.finishRun();
280     Lines.clear();
281     while (!PPLevelBranchIndex.empty() &&
282            PPLevelBranchIndex.back() + 1 >= PPLevelBranchCount.back()) {
283       PPLevelBranchIndex.resize(PPLevelBranchIndex.size() - 1);
284       PPLevelBranchCount.resize(PPLevelBranchCount.size() - 1);
285     }
286     if (!PPLevelBranchIndex.empty()) {
287       ++PPLevelBranchIndex.back();
288       assert(PPLevelBranchIndex.size() == PPLevelBranchCount.size());
289       assert(PPLevelBranchIndex.back() <= PPLevelBranchCount.back());
290     }
291   } while (!PPLevelBranchIndex.empty());
292 }
293 
294 void UnwrappedLineParser::parseFile() {
295   // The top-level context in a file always has declarations, except for pre-
296   // processor directives and JavaScript files.
297   bool MustBeDeclaration =
298       !Line->InPPDirective && Style.Language != FormatStyle::LK_JavaScript;
299   ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
300                                           MustBeDeclaration);
301   if (Style.Language == FormatStyle::LK_TextProto)
302     parseBracedList();
303   else
304     parseLevel(/*HasOpeningBrace=*/false);
305   // Make sure to format the remaining tokens.
306   //
307   // LK_TextProto is special since its top-level is parsed as the body of a
308   // braced list, which does not necessarily have natural line separators such
309   // as a semicolon. Comments after the last entry that have been determined to
310   // not belong to that line, as in:
311   //   key: value
312   //   // endfile comment
313   // do not have a chance to be put on a line of their own until this point.
314   // Here we add this newline before end-of-file comments.
315   if (Style.Language == FormatStyle::LK_TextProto &&
316       !CommentsBeforeNextToken.empty())
317     addUnwrappedLine();
318   flushComments(true);
319   addUnwrappedLine();
320 }
321 
322 void UnwrappedLineParser::parseLevel(bool HasOpeningBrace) {
323   bool SwitchLabelEncountered = false;
324   do {
325     tok::TokenKind kind = FormatTok->Tok.getKind();
326     if (FormatTok->Type == TT_MacroBlockBegin) {
327       kind = tok::l_brace;
328     } else if (FormatTok->Type == TT_MacroBlockEnd) {
329       kind = tok::r_brace;
330     }
331 
332     switch (kind) {
333     case tok::comment:
334       nextToken();
335       addUnwrappedLine();
336       break;
337     case tok::l_brace:
338       // FIXME: Add parameter whether this can happen - if this happens, we must
339       // be in a non-declaration context.
340       if (!FormatTok->is(TT_MacroBlockBegin) && tryToParseBracedList())
341         continue;
342       parseBlock(/*MustBeDeclaration=*/false);
343       addUnwrappedLine();
344       break;
345     case tok::r_brace:
346       if (HasOpeningBrace)
347         return;
348       nextToken();
349       addUnwrappedLine();
350       break;
351     case tok::kw_default: {
352       unsigned StoredPosition = Tokens->getPosition();
353       FormatToken *Next;
354       do {
355         Next = Tokens->getNextToken();
356       } while (Next && Next->is(tok::comment));
357       FormatTok = Tokens->setPosition(StoredPosition);
358       if (Next && Next->isNot(tok::colon)) {
359         // default not followed by ':' is not a case label; treat it like
360         // an identifier.
361         parseStructuralElement();
362         break;
363       }
364       // Else, if it is 'default:', fall through to the case handling.
365       LLVM_FALLTHROUGH;
366     }
367     case tok::kw_case:
368       if (Style.Language == FormatStyle::LK_JavaScript &&
369           Line->MustBeDeclaration) {
370         // A 'case: string' style field declaration.
371         parseStructuralElement();
372         break;
373       }
374       if (!SwitchLabelEncountered &&
375           (Style.IndentCaseLabels || (Line->InPPDirective && Line->Level == 1)))
376         ++Line->Level;
377       SwitchLabelEncountered = true;
378       parseStructuralElement();
379       break;
380     default:
381       parseStructuralElement();
382       break;
383     }
384   } while (!eof());
385 }
386 
387 void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) {
388   // We'll parse forward through the tokens until we hit
389   // a closing brace or eof - note that getNextToken() will
390   // parse macros, so this will magically work inside macro
391   // definitions, too.
392   unsigned StoredPosition = Tokens->getPosition();
393   FormatToken *Tok = FormatTok;
394   const FormatToken *PrevTok = Tok->Previous;
395   // Keep a stack of positions of lbrace tokens. We will
396   // update information about whether an lbrace starts a
397   // braced init list or a different block during the loop.
398   SmallVector<FormatToken *, 8> LBraceStack;
399   assert(Tok->Tok.is(tok::l_brace));
400   do {
401     // Get next non-comment token.
402     FormatToken *NextTok;
403     unsigned ReadTokens = 0;
404     do {
405       NextTok = Tokens->getNextToken();
406       ++ReadTokens;
407     } while (NextTok->is(tok::comment));
408 
409     switch (Tok->Tok.getKind()) {
410     case tok::l_brace:
411       if (Style.Language == FormatStyle::LK_JavaScript && PrevTok) {
412         if (PrevTok->isOneOf(tok::colon, tok::less))
413           // A ':' indicates this code is in a type, or a braced list
414           // following a label in an object literal ({a: {b: 1}}).
415           // A '<' could be an object used in a comparison, but that is nonsense
416           // code (can never return true), so more likely it is a generic type
417           // argument (`X<{a: string; b: number}>`).
418           // The code below could be confused by semicolons between the
419           // individual members in a type member list, which would normally
420           // trigger BK_Block. In both cases, this must be parsed as an inline
421           // braced init.
422           Tok->BlockKind = BK_BracedInit;
423         else if (PrevTok->is(tok::r_paren))
424           // `) { }` can only occur in function or method declarations in JS.
425           Tok->BlockKind = BK_Block;
426       } else {
427         Tok->BlockKind = BK_Unknown;
428       }
429       LBraceStack.push_back(Tok);
430       break;
431     case tok::r_brace:
432       if (LBraceStack.empty())
433         break;
434       if (LBraceStack.back()->BlockKind == BK_Unknown) {
435         bool ProbablyBracedList = false;
436         if (Style.Language == FormatStyle::LK_Proto) {
437           ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square);
438         } else {
439           // Using OriginalColumn to distinguish between ObjC methods and
440           // binary operators is a bit hacky.
441           bool NextIsObjCMethod = NextTok->isOneOf(tok::plus, tok::minus) &&
442                                   NextTok->OriginalColumn == 0;
443 
444           // If there is a comma, semicolon or right paren after the closing
445           // brace, we assume this is a braced initializer list.  Note that
446           // regardless how we mark inner braces here, we will overwrite the
447           // BlockKind later if we parse a braced list (where all blocks
448           // inside are by default braced lists), or when we explicitly detect
449           // blocks (for example while parsing lambdas).
450           // FIXME: Some of these do not apply to JS, e.g. "} {" can never be a
451           // braced list in JS.
452           ProbablyBracedList =
453               (Style.Language == FormatStyle::LK_JavaScript &&
454                NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in,
455                                 Keywords.kw_as)) ||
456               (Style.isCpp() && NextTok->is(tok::l_paren)) ||
457               NextTok->isOneOf(tok::comma, tok::period, tok::colon,
458                                tok::r_paren, tok::r_square, tok::l_brace,
459                                tok::ellipsis) ||
460               (NextTok->is(tok::identifier) &&
461                !PrevTok->isOneOf(tok::semi, tok::r_brace, tok::l_brace)) ||
462               (NextTok->is(tok::semi) &&
463                (!ExpectClassBody || LBraceStack.size() != 1)) ||
464               (NextTok->isBinaryOperator() && !NextIsObjCMethod);
465           if (NextTok->is(tok::l_square)) {
466             // We can have an array subscript after a braced init
467             // list, but C++11 attributes are expected after blocks.
468             NextTok = Tokens->getNextToken();
469             ++ReadTokens;
470             ProbablyBracedList = NextTok->isNot(tok::l_square);
471           }
472         }
473         if (ProbablyBracedList) {
474           Tok->BlockKind = BK_BracedInit;
475           LBraceStack.back()->BlockKind = BK_BracedInit;
476         } else {
477           Tok->BlockKind = BK_Block;
478           LBraceStack.back()->BlockKind = BK_Block;
479         }
480       }
481       LBraceStack.pop_back();
482       break;
483     case tok::at:
484     case tok::semi:
485     case tok::kw_if:
486     case tok::kw_while:
487     case tok::kw_for:
488     case tok::kw_switch:
489     case tok::kw_try:
490     case tok::kw___try:
491       if (!LBraceStack.empty() && LBraceStack.back()->BlockKind == BK_Unknown)
492         LBraceStack.back()->BlockKind = BK_Block;
493       break;
494     default:
495       break;
496     }
497     PrevTok = Tok;
498     Tok = NextTok;
499   } while (Tok->Tok.isNot(tok::eof) && !LBraceStack.empty());
500 
501   // Assume other blocks for all unclosed opening braces.
502   for (unsigned i = 0, e = LBraceStack.size(); i != e; ++i) {
503     if (LBraceStack[i]->BlockKind == BK_Unknown)
504       LBraceStack[i]->BlockKind = BK_Block;
505   }
506 
507   FormatTok = Tokens->setPosition(StoredPosition);
508 }
509 
510 template <class T>
511 static inline void hash_combine(std::size_t &seed, const T &v) {
512   std::hash<T> hasher;
513   seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
514 }
515 
516 size_t UnwrappedLineParser::computePPHash() const {
517   size_t h = 0;
518   for (const auto &i : PPStack) {
519     hash_combine(h, size_t(i.Kind));
520     hash_combine(h, i.Line);
521   }
522   return h;
523 }
524 
525 void UnwrappedLineParser::parseBlock(bool MustBeDeclaration, bool AddLevel,
526                                      bool MunchSemi) {
527   assert(FormatTok->isOneOf(tok::l_brace, TT_MacroBlockBegin) &&
528          "'{' or macro block token expected");
529   const bool MacroBlock = FormatTok->is(TT_MacroBlockBegin);
530   FormatTok->BlockKind = BK_Block;
531 
532   size_t PPStartHash = computePPHash();
533 
534   unsigned InitialLevel = Line->Level;
535   nextToken(/*LevelDifference=*/AddLevel ? 1 : 0);
536 
537   if (MacroBlock && FormatTok->is(tok::l_paren))
538     parseParens();
539 
540   size_t NbPreprocessorDirectives =
541       CurrentLines == &Lines ? PreprocessorDirectives.size() : 0;
542   addUnwrappedLine();
543   size_t OpeningLineIndex =
544       CurrentLines->empty()
545           ? (UnwrappedLine::kInvalidIndex)
546           : (CurrentLines->size() - 1 - NbPreprocessorDirectives);
547 
548   ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
549                                           MustBeDeclaration);
550   if (AddLevel)
551     ++Line->Level;
552   parseLevel(/*HasOpeningBrace=*/true);
553 
554   if (eof())
555     return;
556 
557   if (MacroBlock ? !FormatTok->is(TT_MacroBlockEnd)
558                  : !FormatTok->is(tok::r_brace)) {
559     Line->Level = InitialLevel;
560     FormatTok->BlockKind = BK_Block;
561     return;
562   }
563 
564   size_t PPEndHash = computePPHash();
565 
566   // Munch the closing brace.
567   nextToken(/*LevelDifference=*/AddLevel ? -1 : 0);
568 
569   if (MacroBlock && FormatTok->is(tok::l_paren))
570     parseParens();
571 
572   if (MunchSemi && FormatTok->Tok.is(tok::semi))
573     nextToken();
574   Line->Level = InitialLevel;
575 
576   if (PPStartHash == PPEndHash) {
577     Line->MatchingOpeningBlockLineIndex = OpeningLineIndex;
578     if (OpeningLineIndex != UnwrappedLine::kInvalidIndex) {
579       // Update the opening line to add the forward reference as well
580       (*CurrentLines)[OpeningLineIndex].MatchingClosingBlockLineIndex =
581           CurrentLines->size() - 1;
582     }
583   }
584 }
585 
586 static bool isGoogScope(const UnwrappedLine &Line) {
587   // FIXME: Closure-library specific stuff should not be hard-coded but be
588   // configurable.
589   if (Line.Tokens.size() < 4)
590     return false;
591   auto I = Line.Tokens.begin();
592   if (I->Tok->TokenText != "goog")
593     return false;
594   ++I;
595   if (I->Tok->isNot(tok::period))
596     return false;
597   ++I;
598   if (I->Tok->TokenText != "scope")
599     return false;
600   ++I;
601   return I->Tok->is(tok::l_paren);
602 }
603 
604 static bool isIIFE(const UnwrappedLine &Line,
605                    const AdditionalKeywords &Keywords) {
606   // Look for the start of an immediately invoked anonymous function.
607   // https://en.wikipedia.org/wiki/Immediately-invoked_function_expression
608   // This is commonly done in JavaScript to create a new, anonymous scope.
609   // Example: (function() { ... })()
610   if (Line.Tokens.size() < 3)
611     return false;
612   auto I = Line.Tokens.begin();
613   if (I->Tok->isNot(tok::l_paren))
614     return false;
615   ++I;
616   if (I->Tok->isNot(Keywords.kw_function))
617     return false;
618   ++I;
619   return I->Tok->is(tok::l_paren);
620 }
621 
622 static bool ShouldBreakBeforeBrace(const FormatStyle &Style,
623                                    const FormatToken &InitialToken) {
624   if (InitialToken.is(tok::kw_namespace))
625     return Style.BraceWrapping.AfterNamespace;
626   if (InitialToken.is(tok::kw_class))
627     return Style.BraceWrapping.AfterClass;
628   if (InitialToken.is(tok::kw_union))
629     return Style.BraceWrapping.AfterUnion;
630   if (InitialToken.is(tok::kw_struct))
631     return Style.BraceWrapping.AfterStruct;
632   return false;
633 }
634 
635 void UnwrappedLineParser::parseChildBlock() {
636   FormatTok->BlockKind = BK_Block;
637   nextToken();
638   {
639     bool SkipIndent = (Style.Language == FormatStyle::LK_JavaScript &&
640                        (isGoogScope(*Line) || isIIFE(*Line, Keywords)));
641     ScopedLineState LineState(*this);
642     ScopedDeclarationState DeclarationState(*Line, DeclarationScopeStack,
643                                             /*MustBeDeclaration=*/false);
644     Line->Level += SkipIndent ? 0 : 1;
645     parseLevel(/*HasOpeningBrace=*/true);
646     flushComments(isOnNewLine(*FormatTok));
647     Line->Level -= SkipIndent ? 0 : 1;
648   }
649   nextToken();
650 }
651 
652 void UnwrappedLineParser::parsePPDirective() {
653   assert(FormatTok->Tok.is(tok::hash) && "'#' expected");
654   ScopedMacroState MacroState(*Line, Tokens, FormatTok);
655   nextToken();
656 
657   if (!FormatTok->Tok.getIdentifierInfo()) {
658     parsePPUnknown();
659     return;
660   }
661 
662   switch (FormatTok->Tok.getIdentifierInfo()->getPPKeywordID()) {
663   case tok::pp_define:
664     parsePPDefine();
665     return;
666   case tok::pp_if:
667     parsePPIf(/*IfDef=*/false);
668     break;
669   case tok::pp_ifdef:
670   case tok::pp_ifndef:
671     parsePPIf(/*IfDef=*/true);
672     break;
673   case tok::pp_else:
674     parsePPElse();
675     break;
676   case tok::pp_elif:
677     parsePPElIf();
678     break;
679   case tok::pp_endif:
680     parsePPEndIf();
681     break;
682   default:
683     parsePPUnknown();
684     break;
685   }
686 }
687 
688 void UnwrappedLineParser::conditionalCompilationCondition(bool Unreachable) {
689   size_t Line = CurrentLines->size();
690   if (CurrentLines == &PreprocessorDirectives)
691     Line += Lines.size();
692 
693   if (Unreachable ||
694       (!PPStack.empty() && PPStack.back().Kind == PP_Unreachable))
695     PPStack.push_back({PP_Unreachable, Line});
696   else
697     PPStack.push_back({PP_Conditional, Line});
698 }
699 
700 void UnwrappedLineParser::conditionalCompilationStart(bool Unreachable) {
701   ++PPBranchLevel;
702   assert(PPBranchLevel >= 0 && PPBranchLevel <= (int)PPLevelBranchIndex.size());
703   if (PPBranchLevel == (int)PPLevelBranchIndex.size()) {
704     PPLevelBranchIndex.push_back(0);
705     PPLevelBranchCount.push_back(0);
706   }
707   PPChainBranchIndex.push(0);
708   bool Skip = PPLevelBranchIndex[PPBranchLevel] > 0;
709   conditionalCompilationCondition(Unreachable || Skip);
710 }
711 
712 void UnwrappedLineParser::conditionalCompilationAlternative() {
713   if (!PPStack.empty())
714     PPStack.pop_back();
715   assert(PPBranchLevel < (int)PPLevelBranchIndex.size());
716   if (!PPChainBranchIndex.empty())
717     ++PPChainBranchIndex.top();
718   conditionalCompilationCondition(
719       PPBranchLevel >= 0 && !PPChainBranchIndex.empty() &&
720       PPLevelBranchIndex[PPBranchLevel] != PPChainBranchIndex.top());
721 }
722 
723 void UnwrappedLineParser::conditionalCompilationEnd() {
724   assert(PPBranchLevel < (int)PPLevelBranchIndex.size());
725   if (PPBranchLevel >= 0 && !PPChainBranchIndex.empty()) {
726     if (PPChainBranchIndex.top() + 1 > PPLevelBranchCount[PPBranchLevel]) {
727       PPLevelBranchCount[PPBranchLevel] = PPChainBranchIndex.top() + 1;
728     }
729   }
730   // Guard against #endif's without #if.
731   if (PPBranchLevel > -1)
732     --PPBranchLevel;
733   if (!PPChainBranchIndex.empty())
734     PPChainBranchIndex.pop();
735   if (!PPStack.empty())
736     PPStack.pop_back();
737 }
738 
739 void UnwrappedLineParser::parsePPIf(bool IfDef) {
740   bool IfNDef = FormatTok->is(tok::pp_ifndef);
741   nextToken();
742   bool Unreachable = false;
743   if (!IfDef && (FormatTok->is(tok::kw_false) || FormatTok->TokenText == "0"))
744     Unreachable = true;
745   if (IfDef && !IfNDef && FormatTok->TokenText == "SWIG")
746     Unreachable = true;
747   conditionalCompilationStart(Unreachable);
748   FormatToken *IfCondition = FormatTok;
749   // If there's a #ifndef on the first line, and the only lines before it are
750   // comments, it could be an include guard.
751   bool MaybeIncludeGuard = IfNDef;
752   if (IncludeGuard == IG_Inited && MaybeIncludeGuard)
753     for (auto &Line : Lines) {
754       if (!Line.Tokens.front().Tok->is(tok::comment)) {
755         MaybeIncludeGuard = false;
756         IncludeGuard = IG_Rejected;
757         break;
758       }
759     }
760   --PPBranchLevel;
761   parsePPUnknown();
762   ++PPBranchLevel;
763   if (IncludeGuard == IG_Inited && MaybeIncludeGuard) {
764     IncludeGuard = IG_IfNdefed;
765     IncludeGuardToken = IfCondition;
766   }
767 }
768 
769 void UnwrappedLineParser::parsePPElse() {
770   // If a potential include guard has an #else, it's not an include guard.
771   if (IncludeGuard == IG_Defined && PPBranchLevel == 0)
772     IncludeGuard = IG_Rejected;
773   conditionalCompilationAlternative();
774   if (PPBranchLevel > -1)
775     --PPBranchLevel;
776   parsePPUnknown();
777   ++PPBranchLevel;
778 }
779 
780 void UnwrappedLineParser::parsePPElIf() { parsePPElse(); }
781 
782 void UnwrappedLineParser::parsePPEndIf() {
783   conditionalCompilationEnd();
784   parsePPUnknown();
785   // If the #endif of a potential include guard is the last thing in the file,
786   // then we found an include guard.
787   unsigned TokenPosition = Tokens->getPosition();
788   FormatToken *PeekNext = AllTokens[TokenPosition];
789   if (IncludeGuard == IG_Defined && PPBranchLevel == -1 &&
790       PeekNext->is(tok::eof) &&
791       Style.IndentPPDirectives != FormatStyle::PPDIS_None)
792     IncludeGuard = IG_Found;
793 }
794 
795 void UnwrappedLineParser::parsePPDefine() {
796   nextToken();
797 
798   if (FormatTok->Tok.getKind() != tok::identifier) {
799     IncludeGuard = IG_Rejected;
800     IncludeGuardToken = nullptr;
801     parsePPUnknown();
802     return;
803   }
804 
805   if (IncludeGuard == IG_IfNdefed &&
806       IncludeGuardToken->TokenText == FormatTok->TokenText) {
807     IncludeGuard = IG_Defined;
808     IncludeGuardToken = nullptr;
809     for (auto &Line : Lines) {
810       if (!Line.Tokens.front().Tok->isOneOf(tok::comment, tok::hash)) {
811         IncludeGuard = IG_Rejected;
812         break;
813       }
814     }
815   }
816 
817   nextToken();
818   if (FormatTok->Tok.getKind() == tok::l_paren &&
819       FormatTok->WhitespaceRange.getBegin() ==
820           FormatTok->WhitespaceRange.getEnd()) {
821     parseParens();
822   }
823   if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash)
824     Line->Level += PPBranchLevel + 1;
825   addUnwrappedLine();
826   ++Line->Level;
827 
828   // Errors during a preprocessor directive can only affect the layout of the
829   // preprocessor directive, and thus we ignore them. An alternative approach
830   // would be to use the same approach we use on the file level (no
831   // re-indentation if there was a structural error) within the macro
832   // definition.
833   parseFile();
834 }
835 
836 void UnwrappedLineParser::parsePPUnknown() {
837   do {
838     nextToken();
839   } while (!eof());
840   if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash)
841     Line->Level += PPBranchLevel + 1;
842   addUnwrappedLine();
843 }
844 
845 // Here we blacklist certain tokens that are not usually the first token in an
846 // unwrapped line. This is used in attempt to distinguish macro calls without
847 // trailing semicolons from other constructs split to several lines.
848 static bool tokenCanStartNewLine(const clang::Token &Tok) {
849   // Semicolon can be a null-statement, l_square can be a start of a macro or
850   // a C++11 attribute, but this doesn't seem to be common.
851   return Tok.isNot(tok::semi) && Tok.isNot(tok::l_brace) &&
852          Tok.isNot(tok::l_square) &&
853          // Tokens that can only be used as binary operators and a part of
854          // overloaded operator names.
855          Tok.isNot(tok::period) && Tok.isNot(tok::periodstar) &&
856          Tok.isNot(tok::arrow) && Tok.isNot(tok::arrowstar) &&
857          Tok.isNot(tok::less) && Tok.isNot(tok::greater) &&
858          Tok.isNot(tok::slash) && Tok.isNot(tok::percent) &&
859          Tok.isNot(tok::lessless) && Tok.isNot(tok::greatergreater) &&
860          Tok.isNot(tok::equal) && Tok.isNot(tok::plusequal) &&
861          Tok.isNot(tok::minusequal) && Tok.isNot(tok::starequal) &&
862          Tok.isNot(tok::slashequal) && Tok.isNot(tok::percentequal) &&
863          Tok.isNot(tok::ampequal) && Tok.isNot(tok::pipeequal) &&
864          Tok.isNot(tok::caretequal) && Tok.isNot(tok::greatergreaterequal) &&
865          Tok.isNot(tok::lesslessequal) &&
866          // Colon is used in labels, base class lists, initializer lists,
867          // range-based for loops, ternary operator, but should never be the
868          // first token in an unwrapped line.
869          Tok.isNot(tok::colon) &&
870          // 'noexcept' is a trailing annotation.
871          Tok.isNot(tok::kw_noexcept);
872 }
873 
874 static bool mustBeJSIdent(const AdditionalKeywords &Keywords,
875                           const FormatToken *FormatTok) {
876   // FIXME: This returns true for C/C++ keywords like 'struct'.
877   return FormatTok->is(tok::identifier) &&
878          (FormatTok->Tok.getIdentifierInfo() == nullptr ||
879           !FormatTok->isOneOf(
880               Keywords.kw_in, Keywords.kw_of, Keywords.kw_as, Keywords.kw_async,
881               Keywords.kw_await, Keywords.kw_yield, Keywords.kw_finally,
882               Keywords.kw_function, Keywords.kw_import, Keywords.kw_is,
883               Keywords.kw_let, Keywords.kw_var, tok::kw_const,
884               Keywords.kw_abstract, Keywords.kw_extends, Keywords.kw_implements,
885               Keywords.kw_instanceof, Keywords.kw_interface, Keywords.kw_throws,
886               Keywords.kw_from));
887 }
888 
889 static bool mustBeJSIdentOrValue(const AdditionalKeywords &Keywords,
890                                  const FormatToken *FormatTok) {
891   return FormatTok->Tok.isLiteral() ||
892          FormatTok->isOneOf(tok::kw_true, tok::kw_false) ||
893          mustBeJSIdent(Keywords, FormatTok);
894 }
895 
896 // isJSDeclOrStmt returns true if |FormatTok| starts a declaration or statement
897 // when encountered after a value (see mustBeJSIdentOrValue).
898 static bool isJSDeclOrStmt(const AdditionalKeywords &Keywords,
899                            const FormatToken *FormatTok) {
900   return FormatTok->isOneOf(
901       tok::kw_return, Keywords.kw_yield,
902       // conditionals
903       tok::kw_if, tok::kw_else,
904       // loops
905       tok::kw_for, tok::kw_while, tok::kw_do, tok::kw_continue, tok::kw_break,
906       // switch/case
907       tok::kw_switch, tok::kw_case,
908       // exceptions
909       tok::kw_throw, tok::kw_try, tok::kw_catch, Keywords.kw_finally,
910       // declaration
911       tok::kw_const, tok::kw_class, Keywords.kw_var, Keywords.kw_let,
912       Keywords.kw_async, Keywords.kw_function,
913       // import/export
914       Keywords.kw_import, tok::kw_export);
915 }
916 
917 // readTokenWithJavaScriptASI reads the next token and terminates the current
918 // line if JavaScript Automatic Semicolon Insertion must
919 // happen between the current token and the next token.
920 //
921 // This method is conservative - it cannot cover all edge cases of JavaScript,
922 // but only aims to correctly handle certain well known cases. It *must not*
923 // return true in speculative cases.
924 void UnwrappedLineParser::readTokenWithJavaScriptASI() {
925   FormatToken *Previous = FormatTok;
926   readToken();
927   FormatToken *Next = FormatTok;
928 
929   bool IsOnSameLine =
930       CommentsBeforeNextToken.empty()
931           ? Next->NewlinesBefore == 0
932           : CommentsBeforeNextToken.front()->NewlinesBefore == 0;
933   if (IsOnSameLine)
934     return;
935 
936   bool PreviousMustBeValue = mustBeJSIdentOrValue(Keywords, Previous);
937   bool PreviousStartsTemplateExpr =
938       Previous->is(TT_TemplateString) && Previous->TokenText.endswith("${");
939   if (PreviousMustBeValue || Previous->is(tok::r_paren)) {
940     // If the line contains an '@' sign, the previous token might be an
941     // annotation, which can precede another identifier/value.
942     bool HasAt = std::find_if(Line->Tokens.begin(), Line->Tokens.end(),
943                               [](UnwrappedLineNode &LineNode) {
944                                 return LineNode.Tok->is(tok::at);
945                               }) != Line->Tokens.end();
946     if (HasAt)
947       return;
948   }
949   if (Next->is(tok::exclaim) && PreviousMustBeValue)
950     return addUnwrappedLine();
951   bool NextMustBeValue = mustBeJSIdentOrValue(Keywords, Next);
952   bool NextEndsTemplateExpr =
953       Next->is(TT_TemplateString) && Next->TokenText.startswith("}");
954   if (NextMustBeValue && !NextEndsTemplateExpr && !PreviousStartsTemplateExpr &&
955       (PreviousMustBeValue ||
956        Previous->isOneOf(tok::r_square, tok::r_paren, tok::plusplus,
957                          tok::minusminus)))
958     return addUnwrappedLine();
959   if ((PreviousMustBeValue || Previous->is(tok::r_paren)) &&
960       isJSDeclOrStmt(Keywords, Next))
961     return addUnwrappedLine();
962 }
963 
964 void UnwrappedLineParser::parseStructuralElement() {
965   assert(!FormatTok->is(tok::l_brace));
966   if (Style.Language == FormatStyle::LK_TableGen &&
967       FormatTok->is(tok::pp_include)) {
968     nextToken();
969     if (FormatTok->is(tok::string_literal))
970       nextToken();
971     addUnwrappedLine();
972     return;
973   }
974   switch (FormatTok->Tok.getKind()) {
975   case tok::kw_asm:
976     nextToken();
977     if (FormatTok->is(tok::l_brace)) {
978       FormatTok->Type = TT_InlineASMBrace;
979       nextToken();
980       while (FormatTok && FormatTok->isNot(tok::eof)) {
981         if (FormatTok->is(tok::r_brace)) {
982           FormatTok->Type = TT_InlineASMBrace;
983           nextToken();
984           addUnwrappedLine();
985           break;
986         }
987         FormatTok->Finalized = true;
988         nextToken();
989       }
990     }
991     break;
992   case tok::kw_namespace:
993     parseNamespace();
994     return;
995   case tok::kw_inline:
996     nextToken();
997     if (FormatTok->Tok.is(tok::kw_namespace)) {
998       parseNamespace();
999       return;
1000     }
1001     break;
1002   case tok::kw_public:
1003   case tok::kw_protected:
1004   case tok::kw_private:
1005     if (Style.Language == FormatStyle::LK_Java ||
1006         Style.Language == FormatStyle::LK_JavaScript)
1007       nextToken();
1008     else
1009       parseAccessSpecifier();
1010     return;
1011   case tok::kw_if:
1012     parseIfThenElse();
1013     return;
1014   case tok::kw_for:
1015   case tok::kw_while:
1016     parseForOrWhileLoop();
1017     return;
1018   case tok::kw_do:
1019     parseDoWhile();
1020     return;
1021   case tok::kw_switch:
1022     if (Style.Language == FormatStyle::LK_JavaScript && Line->MustBeDeclaration)
1023       // 'switch: string' field declaration.
1024       break;
1025     parseSwitch();
1026     return;
1027   case tok::kw_default:
1028     if (Style.Language == FormatStyle::LK_JavaScript && Line->MustBeDeclaration)
1029       // 'default: string' field declaration.
1030       break;
1031     nextToken();
1032     if (FormatTok->is(tok::colon)) {
1033       parseLabel();
1034       return;
1035     }
1036     // e.g. "default void f() {}" in a Java interface.
1037     break;
1038   case tok::kw_case:
1039     if (Style.Language == FormatStyle::LK_JavaScript && Line->MustBeDeclaration)
1040       // 'case: string' field declaration.
1041       break;
1042     parseCaseLabel();
1043     return;
1044   case tok::kw_try:
1045   case tok::kw___try:
1046     parseTryCatch();
1047     return;
1048   case tok::kw_extern:
1049     nextToken();
1050     if (FormatTok->Tok.is(tok::string_literal)) {
1051       nextToken();
1052       if (FormatTok->Tok.is(tok::l_brace)) {
1053         if (Style.BraceWrapping.AfterExternBlock) {
1054           addUnwrappedLine();
1055           parseBlock(/*MustBeDeclaration=*/true);
1056         } else {
1057           parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/false);
1058         }
1059         addUnwrappedLine();
1060         return;
1061       }
1062     }
1063     break;
1064   case tok::kw_export:
1065     if (Style.Language == FormatStyle::LK_JavaScript) {
1066       parseJavaScriptEs6ImportExport();
1067       return;
1068     }
1069     break;
1070   case tok::identifier:
1071     if (FormatTok->is(TT_ForEachMacro)) {
1072       parseForOrWhileLoop();
1073       return;
1074     }
1075     if (FormatTok->is(TT_MacroBlockBegin)) {
1076       parseBlock(/*MustBeDeclaration=*/false, /*AddLevel=*/true,
1077                  /*MunchSemi=*/false);
1078       return;
1079     }
1080     if (FormatTok->is(Keywords.kw_import)) {
1081       if (Style.Language == FormatStyle::LK_JavaScript) {
1082         parseJavaScriptEs6ImportExport();
1083         return;
1084       }
1085       if (Style.Language == FormatStyle::LK_Proto) {
1086         nextToken();
1087         if (FormatTok->is(tok::kw_public))
1088           nextToken();
1089         if (!FormatTok->is(tok::string_literal))
1090           return;
1091         nextToken();
1092         if (FormatTok->is(tok::semi))
1093           nextToken();
1094         addUnwrappedLine();
1095         return;
1096       }
1097     }
1098     if (Style.isCpp() &&
1099         FormatTok->isOneOf(Keywords.kw_signals, Keywords.kw_qsignals,
1100                            Keywords.kw_slots, Keywords.kw_qslots)) {
1101       nextToken();
1102       if (FormatTok->is(tok::colon)) {
1103         nextToken();
1104         addUnwrappedLine();
1105         return;
1106       }
1107     }
1108     // In all other cases, parse the declaration.
1109     break;
1110   default:
1111     break;
1112   }
1113   do {
1114     const FormatToken *Previous = FormatTok->Previous;
1115     switch (FormatTok->Tok.getKind()) {
1116     case tok::at:
1117       nextToken();
1118       if (FormatTok->Tok.is(tok::l_brace)) {
1119         nextToken();
1120         parseBracedList();
1121         break;
1122       }
1123       switch (FormatTok->Tok.getObjCKeywordID()) {
1124       case tok::objc_public:
1125       case tok::objc_protected:
1126       case tok::objc_package:
1127       case tok::objc_private:
1128         return parseAccessSpecifier();
1129       case tok::objc_interface:
1130       case tok::objc_implementation:
1131         return parseObjCInterfaceOrImplementation();
1132       case tok::objc_protocol:
1133         if (parseObjCProtocol())
1134           return;
1135         break;
1136       case tok::objc_end:
1137         return; // Handled by the caller.
1138       case tok::objc_optional:
1139       case tok::objc_required:
1140         nextToken();
1141         addUnwrappedLine();
1142         return;
1143       case tok::objc_autoreleasepool:
1144         nextToken();
1145         if (FormatTok->Tok.is(tok::l_brace)) {
1146           if (Style.BraceWrapping.AfterControlStatement)
1147             addUnwrappedLine();
1148           parseBlock(/*MustBeDeclaration=*/false);
1149         }
1150         addUnwrappedLine();
1151         return;
1152       case tok::objc_synchronized:
1153         nextToken();
1154         if (FormatTok->Tok.is(tok::l_paren))
1155            // Skip synchronization object
1156            parseParens();
1157         if (FormatTok->Tok.is(tok::l_brace)) {
1158           if (Style.BraceWrapping.AfterControlStatement)
1159             addUnwrappedLine();
1160           parseBlock(/*MustBeDeclaration=*/false);
1161         }
1162         addUnwrappedLine();
1163         return;
1164       case tok::objc_try:
1165         // This branch isn't strictly necessary (the kw_try case below would
1166         // do this too after the tok::at is parsed above).  But be explicit.
1167         parseTryCatch();
1168         return;
1169       default:
1170         break;
1171       }
1172       break;
1173     case tok::kw_enum:
1174       // Ignore if this is part of "template <enum ...".
1175       if (Previous && Previous->is(tok::less)) {
1176         nextToken();
1177         break;
1178       }
1179 
1180       // parseEnum falls through and does not yet add an unwrapped line as an
1181       // enum definition can start a structural element.
1182       if (!parseEnum())
1183         break;
1184       // This only applies for C++.
1185       if (!Style.isCpp()) {
1186         addUnwrappedLine();
1187         return;
1188       }
1189       break;
1190     case tok::kw_typedef:
1191       nextToken();
1192       if (FormatTok->isOneOf(Keywords.kw_NS_ENUM, Keywords.kw_NS_OPTIONS,
1193                              Keywords.kw_CF_ENUM, Keywords.kw_CF_OPTIONS))
1194         parseEnum();
1195       break;
1196     case tok::kw_struct:
1197     case tok::kw_union:
1198     case tok::kw_class:
1199       // parseRecord falls through and does not yet add an unwrapped line as a
1200       // record declaration or definition can start a structural element.
1201       parseRecord();
1202       // This does not apply for Java and JavaScript.
1203       if (Style.Language == FormatStyle::LK_Java ||
1204           Style.Language == FormatStyle::LK_JavaScript) {
1205         if (FormatTok->is(tok::semi))
1206           nextToken();
1207         addUnwrappedLine();
1208         return;
1209       }
1210       break;
1211     case tok::period:
1212       nextToken();
1213       // In Java, classes have an implicit static member "class".
1214       if (Style.Language == FormatStyle::LK_Java && FormatTok &&
1215           FormatTok->is(tok::kw_class))
1216         nextToken();
1217       if (Style.Language == FormatStyle::LK_JavaScript && FormatTok &&
1218           FormatTok->Tok.getIdentifierInfo())
1219         // JavaScript only has pseudo keywords, all keywords are allowed to
1220         // appear in "IdentifierName" positions. See http://es5.github.io/#x7.6
1221         nextToken();
1222       break;
1223     case tok::semi:
1224       nextToken();
1225       addUnwrappedLine();
1226       return;
1227     case tok::r_brace:
1228       addUnwrappedLine();
1229       return;
1230     case tok::l_paren:
1231       parseParens();
1232       break;
1233     case tok::kw_operator:
1234       nextToken();
1235       if (FormatTok->isBinaryOperator())
1236         nextToken();
1237       break;
1238     case tok::caret:
1239       nextToken();
1240       if (FormatTok->Tok.isAnyIdentifier() ||
1241           FormatTok->isSimpleTypeSpecifier())
1242         nextToken();
1243       if (FormatTok->is(tok::l_paren))
1244         parseParens();
1245       if (FormatTok->is(tok::l_brace))
1246         parseChildBlock();
1247       break;
1248     case tok::l_brace:
1249       if (!tryToParseBracedList()) {
1250         // A block outside of parentheses must be the last part of a
1251         // structural element.
1252         // FIXME: Figure out cases where this is not true, and add projections
1253         // for them (the one we know is missing are lambdas).
1254         if (Style.BraceWrapping.AfterFunction)
1255           addUnwrappedLine();
1256         FormatTok->Type = TT_FunctionLBrace;
1257         parseBlock(/*MustBeDeclaration=*/false);
1258         addUnwrappedLine();
1259         return;
1260       }
1261       // Otherwise this was a braced init list, and the structural
1262       // element continues.
1263       break;
1264     case tok::kw_try:
1265       // We arrive here when parsing function-try blocks.
1266       parseTryCatch();
1267       return;
1268     case tok::identifier: {
1269       if (FormatTok->is(TT_MacroBlockEnd)) {
1270         addUnwrappedLine();
1271         return;
1272       }
1273 
1274       // Function declarations (as opposed to function expressions) are parsed
1275       // on their own unwrapped line by continuing this loop. Function
1276       // expressions (functions that are not on their own line) must not create
1277       // a new unwrapped line, so they are special cased below.
1278       size_t TokenCount = Line->Tokens.size();
1279       if (Style.Language == FormatStyle::LK_JavaScript &&
1280           FormatTok->is(Keywords.kw_function) &&
1281           (TokenCount > 1 || (TokenCount == 1 && !Line->Tokens.front().Tok->is(
1282                                                      Keywords.kw_async)))) {
1283         tryToParseJSFunction();
1284         break;
1285       }
1286       if ((Style.Language == FormatStyle::LK_JavaScript ||
1287            Style.Language == FormatStyle::LK_Java) &&
1288           FormatTok->is(Keywords.kw_interface)) {
1289         if (Style.Language == FormatStyle::LK_JavaScript) {
1290           // In JavaScript/TypeScript, "interface" can be used as a standalone
1291           // identifier, e.g. in `var interface = 1;`. If "interface" is
1292           // followed by another identifier, it is very like to be an actual
1293           // interface declaration.
1294           unsigned StoredPosition = Tokens->getPosition();
1295           FormatToken *Next = Tokens->getNextToken();
1296           FormatTok = Tokens->setPosition(StoredPosition);
1297           if (Next && !mustBeJSIdent(Keywords, Next)) {
1298             nextToken();
1299             break;
1300           }
1301         }
1302         parseRecord();
1303         addUnwrappedLine();
1304         return;
1305       }
1306 
1307       // See if the following token should start a new unwrapped line.
1308       StringRef Text = FormatTok->TokenText;
1309       nextToken();
1310       if (Line->Tokens.size() == 1 &&
1311           // JS doesn't have macros, and within classes colons indicate fields,
1312           // not labels.
1313           Style.Language != FormatStyle::LK_JavaScript) {
1314         if (FormatTok->Tok.is(tok::colon) && !Line->MustBeDeclaration) {
1315           Line->Tokens.begin()->Tok->MustBreakBefore = true;
1316           parseLabel();
1317           return;
1318         }
1319         // Recognize function-like macro usages without trailing semicolon as
1320         // well as free-standing macros like Q_OBJECT.
1321         bool FunctionLike = FormatTok->is(tok::l_paren);
1322         if (FunctionLike)
1323           parseParens();
1324 
1325         bool FollowedByNewline =
1326             CommentsBeforeNextToken.empty()
1327                 ? FormatTok->NewlinesBefore > 0
1328                 : CommentsBeforeNextToken.front()->NewlinesBefore > 0;
1329 
1330         if (FollowedByNewline && (Text.size() >= 5 || FunctionLike) &&
1331             tokenCanStartNewLine(FormatTok->Tok) && Text == Text.upper()) {
1332           addUnwrappedLine();
1333           return;
1334         }
1335       }
1336       break;
1337     }
1338     case tok::equal:
1339       // Fat arrows (=>) have tok::TokenKind tok::equal but TokenType
1340       // TT_JsFatArrow. The always start an expression or a child block if
1341       // followed by a curly.
1342       if (FormatTok->is(TT_JsFatArrow)) {
1343         nextToken();
1344         if (FormatTok->is(tok::l_brace))
1345           parseChildBlock();
1346         break;
1347       }
1348 
1349       nextToken();
1350       if (FormatTok->Tok.is(tok::l_brace)) {
1351         nextToken();
1352         parseBracedList();
1353       } else if (Style.Language == FormatStyle::LK_Proto &&
1354                  FormatTok->Tok.is(tok::less)) {
1355         nextToken();
1356         parseBracedList(/*ContinueOnSemicolons=*/false,
1357                         /*ClosingBraceKind=*/tok::greater);
1358       }
1359       break;
1360     case tok::l_square:
1361       parseSquare();
1362       break;
1363     case tok::kw_new:
1364       parseNew();
1365       break;
1366     default:
1367       nextToken();
1368       break;
1369     }
1370   } while (!eof());
1371 }
1372 
1373 bool UnwrappedLineParser::tryToParseLambda() {
1374   if (!Style.isCpp()) {
1375     nextToken();
1376     return false;
1377   }
1378   assert(FormatTok->is(tok::l_square));
1379   FormatToken &LSquare = *FormatTok;
1380   if (!tryToParseLambdaIntroducer())
1381     return false;
1382 
1383   while (FormatTok->isNot(tok::l_brace)) {
1384     if (FormatTok->isSimpleTypeSpecifier()) {
1385       nextToken();
1386       continue;
1387     }
1388     switch (FormatTok->Tok.getKind()) {
1389     case tok::l_brace:
1390       break;
1391     case tok::l_paren:
1392       parseParens();
1393       break;
1394     case tok::amp:
1395     case tok::star:
1396     case tok::kw_const:
1397     case tok::comma:
1398     case tok::less:
1399     case tok::greater:
1400     case tok::identifier:
1401     case tok::numeric_constant:
1402     case tok::coloncolon:
1403     case tok::kw_mutable:
1404       nextToken();
1405       break;
1406     case tok::arrow:
1407       FormatTok->Type = TT_LambdaArrow;
1408       nextToken();
1409       break;
1410     default:
1411       return true;
1412     }
1413   }
1414   LSquare.Type = TT_LambdaLSquare;
1415   parseChildBlock();
1416   return true;
1417 }
1418 
1419 bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
1420   const FormatToken *Previous = FormatTok->Previous;
1421   if (Previous &&
1422       (Previous->isOneOf(tok::identifier, tok::kw_operator, tok::kw_new,
1423                          tok::kw_delete, tok::l_square) ||
1424        FormatTok->isCppStructuredBinding(Style) || Previous->closesScope() ||
1425        Previous->isSimpleTypeSpecifier())) {
1426     nextToken();
1427     return false;
1428   }
1429   nextToken();
1430   if (FormatTok->is(tok::l_square)) {
1431     return false;
1432   }
1433   parseSquare(/*LambdaIntroducer=*/true);
1434   return true;
1435 }
1436 
1437 void UnwrappedLineParser::tryToParseJSFunction() {
1438   assert(FormatTok->is(Keywords.kw_function) ||
1439          FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function));
1440   if (FormatTok->is(Keywords.kw_async))
1441     nextToken();
1442   // Consume "function".
1443   nextToken();
1444 
1445   // Consume * (generator function). Treat it like C++'s overloaded operators.
1446   if (FormatTok->is(tok::star)) {
1447     FormatTok->Type = TT_OverloadedOperator;
1448     nextToken();
1449   }
1450 
1451   // Consume function name.
1452   if (FormatTok->is(tok::identifier))
1453     nextToken();
1454 
1455   if (FormatTok->isNot(tok::l_paren))
1456     return;
1457 
1458   // Parse formal parameter list.
1459   parseParens();
1460 
1461   if (FormatTok->is(tok::colon)) {
1462     // Parse a type definition.
1463     nextToken();
1464 
1465     // Eat the type declaration. For braced inline object types, balance braces,
1466     // otherwise just parse until finding an l_brace for the function body.
1467     if (FormatTok->is(tok::l_brace))
1468       tryToParseBracedList();
1469     else
1470       while (!FormatTok->isOneOf(tok::l_brace, tok::semi) && !eof())
1471         nextToken();
1472   }
1473 
1474   if (FormatTok->is(tok::semi))
1475     return;
1476 
1477   parseChildBlock();
1478 }
1479 
1480 bool UnwrappedLineParser::tryToParseBracedList() {
1481   if (FormatTok->BlockKind == BK_Unknown)
1482     calculateBraceTypes();
1483   assert(FormatTok->BlockKind != BK_Unknown);
1484   if (FormatTok->BlockKind == BK_Block)
1485     return false;
1486   nextToken();
1487   parseBracedList();
1488   return true;
1489 }
1490 
1491 bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
1492                                           tok::TokenKind ClosingBraceKind) {
1493   bool HasError = false;
1494 
1495   // FIXME: Once we have an expression parser in the UnwrappedLineParser,
1496   // replace this by using parseAssigmentExpression() inside.
1497   do {
1498     if (Style.Language == FormatStyle::LK_JavaScript) {
1499       if (FormatTok->is(Keywords.kw_function) ||
1500           FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)) {
1501         tryToParseJSFunction();
1502         continue;
1503       }
1504       if (FormatTok->is(TT_JsFatArrow)) {
1505         nextToken();
1506         // Fat arrows can be followed by simple expressions or by child blocks
1507         // in curly braces.
1508         if (FormatTok->is(tok::l_brace)) {
1509           parseChildBlock();
1510           continue;
1511         }
1512       }
1513       if (FormatTok->is(tok::l_brace)) {
1514         // Could be a method inside of a braced list `{a() { return 1; }}`.
1515         if (tryToParseBracedList())
1516           continue;
1517         parseChildBlock();
1518       }
1519     }
1520     if (FormatTok->Tok.getKind() == ClosingBraceKind) {
1521       nextToken();
1522       return !HasError;
1523     }
1524     switch (FormatTok->Tok.getKind()) {
1525     case tok::caret:
1526       nextToken();
1527       if (FormatTok->is(tok::l_brace)) {
1528         parseChildBlock();
1529       }
1530       break;
1531     case tok::l_square:
1532       tryToParseLambda();
1533       break;
1534     case tok::l_paren:
1535       parseParens();
1536       // JavaScript can just have free standing methods and getters/setters in
1537       // object literals. Detect them by a "{" following ")".
1538       if (Style.Language == FormatStyle::LK_JavaScript) {
1539         if (FormatTok->is(tok::l_brace))
1540           parseChildBlock();
1541         break;
1542       }
1543       break;
1544     case tok::l_brace:
1545       // Assume there are no blocks inside a braced init list apart
1546       // from the ones we explicitly parse out (like lambdas).
1547       FormatTok->BlockKind = BK_BracedInit;
1548       nextToken();
1549       parseBracedList();
1550       break;
1551     case tok::less:
1552       if (Style.Language == FormatStyle::LK_Proto) {
1553         nextToken();
1554         parseBracedList(/*ContinueOnSemicolons=*/false,
1555                         /*ClosingBraceKind=*/tok::greater);
1556       } else {
1557         nextToken();
1558       }
1559       break;
1560     case tok::semi:
1561       // JavaScript (or more precisely TypeScript) can have semicolons in braced
1562       // lists (in so-called TypeMemberLists). Thus, the semicolon cannot be
1563       // used for error recovery if we have otherwise determined that this is
1564       // a braced list.
1565       if (Style.Language == FormatStyle::LK_JavaScript) {
1566         nextToken();
1567         break;
1568       }
1569       HasError = true;
1570       if (!ContinueOnSemicolons)
1571         return !HasError;
1572       nextToken();
1573       break;
1574     case tok::comma:
1575       nextToken();
1576       break;
1577     default:
1578       nextToken();
1579       break;
1580     }
1581   } while (!eof());
1582   return false;
1583 }
1584 
1585 void UnwrappedLineParser::parseParens() {
1586   assert(FormatTok->Tok.is(tok::l_paren) && "'(' expected.");
1587   nextToken();
1588   do {
1589     switch (FormatTok->Tok.getKind()) {
1590     case tok::l_paren:
1591       parseParens();
1592       if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_brace))
1593         parseChildBlock();
1594       break;
1595     case tok::r_paren:
1596       nextToken();
1597       return;
1598     case tok::r_brace:
1599       // A "}" inside parenthesis is an error if there wasn't a matching "{".
1600       return;
1601     case tok::l_square:
1602       tryToParseLambda();
1603       break;
1604     case tok::l_brace:
1605       if (!tryToParseBracedList())
1606         parseChildBlock();
1607       break;
1608     case tok::at:
1609       nextToken();
1610       if (FormatTok->Tok.is(tok::l_brace)) {
1611         nextToken();
1612         parseBracedList();
1613       }
1614       break;
1615     case tok::kw_class:
1616       if (Style.Language == FormatStyle::LK_JavaScript)
1617         parseRecord(/*ParseAsExpr=*/true);
1618       else
1619         nextToken();
1620       break;
1621     case tok::identifier:
1622       if (Style.Language == FormatStyle::LK_JavaScript &&
1623           (FormatTok->is(Keywords.kw_function) ||
1624            FormatTok->startsSequence(Keywords.kw_async, Keywords.kw_function)))
1625         tryToParseJSFunction();
1626       else
1627         nextToken();
1628       break;
1629     default:
1630       nextToken();
1631       break;
1632     }
1633   } while (!eof());
1634 }
1635 
1636 void UnwrappedLineParser::parseSquare(bool LambdaIntroducer) {
1637   if (!LambdaIntroducer) {
1638     assert(FormatTok->Tok.is(tok::l_square) && "'[' expected.");
1639     if (tryToParseLambda())
1640       return;
1641   }
1642   do {
1643     switch (FormatTok->Tok.getKind()) {
1644     case tok::l_paren:
1645       parseParens();
1646       break;
1647     case tok::r_square:
1648       nextToken();
1649       return;
1650     case tok::r_brace:
1651       // A "}" inside parenthesis is an error if there wasn't a matching "{".
1652       return;
1653     case tok::l_square:
1654       parseSquare();
1655       break;
1656     case tok::l_brace: {
1657       if (!tryToParseBracedList())
1658         parseChildBlock();
1659       break;
1660     }
1661     case tok::at:
1662       nextToken();
1663       if (FormatTok->Tok.is(tok::l_brace)) {
1664         nextToken();
1665         parseBracedList();
1666       }
1667       break;
1668     default:
1669       nextToken();
1670       break;
1671     }
1672   } while (!eof());
1673 }
1674 
1675 void UnwrappedLineParser::parseIfThenElse() {
1676   assert(FormatTok->Tok.is(tok::kw_if) && "'if' expected");
1677   nextToken();
1678   if (FormatTok->Tok.is(tok::kw_constexpr))
1679     nextToken();
1680   if (FormatTok->Tok.is(tok::l_paren))
1681     parseParens();
1682   bool NeedsUnwrappedLine = false;
1683   if (FormatTok->Tok.is(tok::l_brace)) {
1684     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1685     parseBlock(/*MustBeDeclaration=*/false);
1686     if (Style.BraceWrapping.BeforeElse)
1687       addUnwrappedLine();
1688     else
1689       NeedsUnwrappedLine = true;
1690   } else {
1691     addUnwrappedLine();
1692     ++Line->Level;
1693     parseStructuralElement();
1694     --Line->Level;
1695   }
1696   if (FormatTok->Tok.is(tok::kw_else)) {
1697     nextToken();
1698     if (FormatTok->Tok.is(tok::l_brace)) {
1699       CompoundStatementIndenter Indenter(this, Style, Line->Level);
1700       parseBlock(/*MustBeDeclaration=*/false);
1701       addUnwrappedLine();
1702     } else if (FormatTok->Tok.is(tok::kw_if)) {
1703       parseIfThenElse();
1704     } else {
1705       addUnwrappedLine();
1706       ++Line->Level;
1707       parseStructuralElement();
1708       if (FormatTok->is(tok::eof))
1709         addUnwrappedLine();
1710       --Line->Level;
1711     }
1712   } else if (NeedsUnwrappedLine) {
1713     addUnwrappedLine();
1714   }
1715 }
1716 
1717 void UnwrappedLineParser::parseTryCatch() {
1718   assert(FormatTok->isOneOf(tok::kw_try, tok::kw___try) && "'try' expected");
1719   nextToken();
1720   bool NeedsUnwrappedLine = false;
1721   if (FormatTok->is(tok::colon)) {
1722     // We are in a function try block, what comes is an initializer list.
1723     nextToken();
1724     while (FormatTok->is(tok::identifier)) {
1725       nextToken();
1726       if (FormatTok->is(tok::l_paren))
1727         parseParens();
1728       if (FormatTok->is(tok::comma))
1729         nextToken();
1730     }
1731   }
1732   // Parse try with resource.
1733   if (Style.Language == FormatStyle::LK_Java && FormatTok->is(tok::l_paren)) {
1734     parseParens();
1735   }
1736   if (FormatTok->is(tok::l_brace)) {
1737     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1738     parseBlock(/*MustBeDeclaration=*/false);
1739     if (Style.BraceWrapping.BeforeCatch) {
1740       addUnwrappedLine();
1741     } else {
1742       NeedsUnwrappedLine = true;
1743     }
1744   } else if (!FormatTok->is(tok::kw_catch)) {
1745     // The C++ standard requires a compound-statement after a try.
1746     // If there's none, we try to assume there's a structuralElement
1747     // and try to continue.
1748     addUnwrappedLine();
1749     ++Line->Level;
1750     parseStructuralElement();
1751     --Line->Level;
1752   }
1753   while (1) {
1754     if (FormatTok->is(tok::at))
1755       nextToken();
1756     if (!(FormatTok->isOneOf(tok::kw_catch, Keywords.kw___except,
1757                              tok::kw___finally) ||
1758           ((Style.Language == FormatStyle::LK_Java ||
1759             Style.Language == FormatStyle::LK_JavaScript) &&
1760            FormatTok->is(Keywords.kw_finally)) ||
1761           (FormatTok->Tok.isObjCAtKeyword(tok::objc_catch) ||
1762            FormatTok->Tok.isObjCAtKeyword(tok::objc_finally))))
1763       break;
1764     nextToken();
1765     while (FormatTok->isNot(tok::l_brace)) {
1766       if (FormatTok->is(tok::l_paren)) {
1767         parseParens();
1768         continue;
1769       }
1770       if (FormatTok->isOneOf(tok::semi, tok::r_brace, tok::eof))
1771         return;
1772       nextToken();
1773     }
1774     NeedsUnwrappedLine = false;
1775     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1776     parseBlock(/*MustBeDeclaration=*/false);
1777     if (Style.BraceWrapping.BeforeCatch)
1778       addUnwrappedLine();
1779     else
1780       NeedsUnwrappedLine = true;
1781   }
1782   if (NeedsUnwrappedLine)
1783     addUnwrappedLine();
1784 }
1785 
1786 void UnwrappedLineParser::parseNamespace() {
1787   assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected");
1788 
1789   const FormatToken &InitialToken = *FormatTok;
1790   nextToken();
1791   while (FormatTok->isOneOf(tok::identifier, tok::coloncolon))
1792     nextToken();
1793   if (FormatTok->Tok.is(tok::l_brace)) {
1794     if (ShouldBreakBeforeBrace(Style, InitialToken))
1795       addUnwrappedLine();
1796 
1797     bool AddLevel = Style.NamespaceIndentation == FormatStyle::NI_All ||
1798                     (Style.NamespaceIndentation == FormatStyle::NI_Inner &&
1799                      DeclarationScopeStack.size() > 1);
1800     parseBlock(/*MustBeDeclaration=*/true, AddLevel);
1801     // Munch the semicolon after a namespace. This is more common than one would
1802     // think. Puttin the semicolon into its own line is very ugly.
1803     if (FormatTok->Tok.is(tok::semi))
1804       nextToken();
1805     addUnwrappedLine();
1806   }
1807   // FIXME: Add error handling.
1808 }
1809 
1810 void UnwrappedLineParser::parseNew() {
1811   assert(FormatTok->is(tok::kw_new) && "'new' expected");
1812   nextToken();
1813   if (Style.Language != FormatStyle::LK_Java)
1814     return;
1815 
1816   // In Java, we can parse everything up to the parens, which aren't optional.
1817   do {
1818     // There should not be a ;, { or } before the new's open paren.
1819     if (FormatTok->isOneOf(tok::semi, tok::l_brace, tok::r_brace))
1820       return;
1821 
1822     // Consume the parens.
1823     if (FormatTok->is(tok::l_paren)) {
1824       parseParens();
1825 
1826       // If there is a class body of an anonymous class, consume that as child.
1827       if (FormatTok->is(tok::l_brace))
1828         parseChildBlock();
1829       return;
1830     }
1831     nextToken();
1832   } while (!eof());
1833 }
1834 
1835 void UnwrappedLineParser::parseForOrWhileLoop() {
1836   assert(FormatTok->isOneOf(tok::kw_for, tok::kw_while, TT_ForEachMacro) &&
1837          "'for', 'while' or foreach macro expected");
1838   nextToken();
1839   // JS' for await ( ...
1840   if (Style.Language == FormatStyle::LK_JavaScript &&
1841       FormatTok->is(Keywords.kw_await))
1842     nextToken();
1843   if (FormatTok->Tok.is(tok::l_paren))
1844     parseParens();
1845   if (FormatTok->Tok.is(tok::l_brace)) {
1846     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1847     parseBlock(/*MustBeDeclaration=*/false);
1848     addUnwrappedLine();
1849   } else {
1850     addUnwrappedLine();
1851     ++Line->Level;
1852     parseStructuralElement();
1853     --Line->Level;
1854   }
1855 }
1856 
1857 void UnwrappedLineParser::parseDoWhile() {
1858   assert(FormatTok->Tok.is(tok::kw_do) && "'do' expected");
1859   nextToken();
1860   if (FormatTok->Tok.is(tok::l_brace)) {
1861     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1862     parseBlock(/*MustBeDeclaration=*/false);
1863     if (Style.BraceWrapping.IndentBraces)
1864       addUnwrappedLine();
1865   } else {
1866     addUnwrappedLine();
1867     ++Line->Level;
1868     parseStructuralElement();
1869     --Line->Level;
1870   }
1871 
1872   // FIXME: Add error handling.
1873   if (!FormatTok->Tok.is(tok::kw_while)) {
1874     addUnwrappedLine();
1875     return;
1876   }
1877 
1878   nextToken();
1879   parseStructuralElement();
1880 }
1881 
1882 void UnwrappedLineParser::parseLabel() {
1883   nextToken();
1884   unsigned OldLineLevel = Line->Level;
1885   if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0))
1886     --Line->Level;
1887   if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) {
1888     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1889     parseBlock(/*MustBeDeclaration=*/false);
1890     if (FormatTok->Tok.is(tok::kw_break)) {
1891       if (Style.BraceWrapping.AfterControlStatement)
1892         addUnwrappedLine();
1893       parseStructuralElement();
1894     }
1895     addUnwrappedLine();
1896   } else {
1897     if (FormatTok->is(tok::semi))
1898       nextToken();
1899     addUnwrappedLine();
1900   }
1901   Line->Level = OldLineLevel;
1902   if (FormatTok->isNot(tok::l_brace)) {
1903     parseStructuralElement();
1904     addUnwrappedLine();
1905   }
1906 }
1907 
1908 void UnwrappedLineParser::parseCaseLabel() {
1909   assert(FormatTok->Tok.is(tok::kw_case) && "'case' expected");
1910   // FIXME: fix handling of complex expressions here.
1911   do {
1912     nextToken();
1913   } while (!eof() && !FormatTok->Tok.is(tok::colon));
1914   parseLabel();
1915 }
1916 
1917 void UnwrappedLineParser::parseSwitch() {
1918   assert(FormatTok->Tok.is(tok::kw_switch) && "'switch' expected");
1919   nextToken();
1920   if (FormatTok->Tok.is(tok::l_paren))
1921     parseParens();
1922   if (FormatTok->Tok.is(tok::l_brace)) {
1923     CompoundStatementIndenter Indenter(this, Style, Line->Level);
1924     parseBlock(/*MustBeDeclaration=*/false);
1925     addUnwrappedLine();
1926   } else {
1927     addUnwrappedLine();
1928     ++Line->Level;
1929     parseStructuralElement();
1930     --Line->Level;
1931   }
1932 }
1933 
1934 void UnwrappedLineParser::parseAccessSpecifier() {
1935   nextToken();
1936   // Understand Qt's slots.
1937   if (FormatTok->isOneOf(Keywords.kw_slots, Keywords.kw_qslots))
1938     nextToken();
1939   // Otherwise, we don't know what it is, and we'd better keep the next token.
1940   if (FormatTok->Tok.is(tok::colon))
1941     nextToken();
1942   addUnwrappedLine();
1943 }
1944 
1945 bool UnwrappedLineParser::parseEnum() {
1946   // Won't be 'enum' for NS_ENUMs.
1947   if (FormatTok->Tok.is(tok::kw_enum))
1948     nextToken();
1949 
1950   // In TypeScript, "enum" can also be used as property name, e.g. in interface
1951   // declarations. An "enum" keyword followed by a colon would be a syntax
1952   // error and thus assume it is just an identifier.
1953   if (Style.Language == FormatStyle::LK_JavaScript &&
1954       FormatTok->isOneOf(tok::colon, tok::question))
1955     return false;
1956 
1957   // Eat up enum class ...
1958   if (FormatTok->Tok.is(tok::kw_class) || FormatTok->Tok.is(tok::kw_struct))
1959     nextToken();
1960 
1961   while (FormatTok->Tok.getIdentifierInfo() ||
1962          FormatTok->isOneOf(tok::colon, tok::coloncolon, tok::less,
1963                             tok::greater, tok::comma, tok::question)) {
1964     nextToken();
1965     // We can have macros or attributes in between 'enum' and the enum name.
1966     if (FormatTok->is(tok::l_paren))
1967       parseParens();
1968     if (FormatTok->is(tok::identifier)) {
1969       nextToken();
1970       // If there are two identifiers in a row, this is likely an elaborate
1971       // return type. In Java, this can be "implements", etc.
1972       if (Style.isCpp() && FormatTok->is(tok::identifier))
1973         return false;
1974     }
1975   }
1976 
1977   // Just a declaration or something is wrong.
1978   if (FormatTok->isNot(tok::l_brace))
1979     return true;
1980   FormatTok->BlockKind = BK_Block;
1981 
1982   if (Style.Language == FormatStyle::LK_Java) {
1983     // Java enums are different.
1984     parseJavaEnumBody();
1985     return true;
1986   }
1987   if (Style.Language == FormatStyle::LK_Proto) {
1988     parseBlock(/*MustBeDeclaration=*/true);
1989     return true;
1990   }
1991 
1992   // Parse enum body.
1993   nextToken();
1994   bool HasError = !parseBracedList(/*ContinueOnSemicolons=*/true);
1995   if (HasError) {
1996     if (FormatTok->is(tok::semi))
1997       nextToken();
1998     addUnwrappedLine();
1999   }
2000   return true;
2001 
2002   // There is no addUnwrappedLine() here so that we fall through to parsing a
2003   // structural element afterwards. Thus, in "enum A {} n, m;",
2004   // "} n, m;" will end up in one unwrapped line.
2005 }
2006 
2007 void UnwrappedLineParser::parseJavaEnumBody() {
2008   // Determine whether the enum is simple, i.e. does not have a semicolon or
2009   // constants with class bodies. Simple enums can be formatted like braced
2010   // lists, contracted to a single line, etc.
2011   unsigned StoredPosition = Tokens->getPosition();
2012   bool IsSimple = true;
2013   FormatToken *Tok = Tokens->getNextToken();
2014   while (Tok) {
2015     if (Tok->is(tok::r_brace))
2016       break;
2017     if (Tok->isOneOf(tok::l_brace, tok::semi)) {
2018       IsSimple = false;
2019       break;
2020     }
2021     // FIXME: This will also mark enums with braces in the arguments to enum
2022     // constants as "not simple". This is probably fine in practice, though.
2023     Tok = Tokens->getNextToken();
2024   }
2025   FormatTok = Tokens->setPosition(StoredPosition);
2026 
2027   if (IsSimple) {
2028     nextToken();
2029     parseBracedList();
2030     addUnwrappedLine();
2031     return;
2032   }
2033 
2034   // Parse the body of a more complex enum.
2035   // First add a line for everything up to the "{".
2036   nextToken();
2037   addUnwrappedLine();
2038   ++Line->Level;
2039 
2040   // Parse the enum constants.
2041   while (FormatTok) {
2042     if (FormatTok->is(tok::l_brace)) {
2043       // Parse the constant's class body.
2044       parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true,
2045                  /*MunchSemi=*/false);
2046     } else if (FormatTok->is(tok::l_paren)) {
2047       parseParens();
2048     } else if (FormatTok->is(tok::comma)) {
2049       nextToken();
2050       addUnwrappedLine();
2051     } else if (FormatTok->is(tok::semi)) {
2052       nextToken();
2053       addUnwrappedLine();
2054       break;
2055     } else if (FormatTok->is(tok::r_brace)) {
2056       addUnwrappedLine();
2057       break;
2058     } else {
2059       nextToken();
2060     }
2061   }
2062 
2063   // Parse the class body after the enum's ";" if any.
2064   parseLevel(/*HasOpeningBrace=*/true);
2065   nextToken();
2066   --Line->Level;
2067   addUnwrappedLine();
2068 }
2069 
2070 void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
2071   const FormatToken &InitialToken = *FormatTok;
2072   nextToken();
2073 
2074   // The actual identifier can be a nested name specifier, and in macros
2075   // it is often token-pasted.
2076   while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::hashhash,
2077                             tok::kw___attribute, tok::kw___declspec,
2078                             tok::kw_alignas) ||
2079          ((Style.Language == FormatStyle::LK_Java ||
2080            Style.Language == FormatStyle::LK_JavaScript) &&
2081           FormatTok->isOneOf(tok::period, tok::comma))) {
2082     if (Style.Language == FormatStyle::LK_JavaScript &&
2083         FormatTok->isOneOf(Keywords.kw_extends, Keywords.kw_implements)) {
2084       // JavaScript/TypeScript supports inline object types in
2085       // extends/implements positions:
2086       //     class Foo implements {bar: number} { }
2087       nextToken();
2088       if (FormatTok->is(tok::l_brace)) {
2089         tryToParseBracedList();
2090         continue;
2091       }
2092     }
2093     bool IsNonMacroIdentifier =
2094         FormatTok->is(tok::identifier) &&
2095         FormatTok->TokenText != FormatTok->TokenText.upper();
2096     nextToken();
2097     // We can have macros or attributes in between 'class' and the class name.
2098     if (!IsNonMacroIdentifier && FormatTok->Tok.is(tok::l_paren))
2099       parseParens();
2100   }
2101 
2102   // Note that parsing away template declarations here leads to incorrectly
2103   // accepting function declarations as record declarations.
2104   // In general, we cannot solve this problem. Consider:
2105   // class A<int> B() {}
2106   // which can be a function definition or a class definition when B() is a
2107   // macro. If we find enough real-world cases where this is a problem, we
2108   // can parse for the 'template' keyword in the beginning of the statement,
2109   // and thus rule out the record production in case there is no template
2110   // (this would still leave us with an ambiguity between template function
2111   // and class declarations).
2112   if (FormatTok->isOneOf(tok::colon, tok::less)) {
2113     while (!eof()) {
2114       if (FormatTok->is(tok::l_brace)) {
2115         calculateBraceTypes(/*ExpectClassBody=*/true);
2116         if (!tryToParseBracedList())
2117           break;
2118       }
2119       if (FormatTok->Tok.is(tok::semi))
2120         return;
2121       nextToken();
2122     }
2123   }
2124   if (FormatTok->Tok.is(tok::l_brace)) {
2125     if (ParseAsExpr) {
2126       parseChildBlock();
2127     } else {
2128       if (ShouldBreakBeforeBrace(Style, InitialToken))
2129         addUnwrappedLine();
2130 
2131       parseBlock(/*MustBeDeclaration=*/true, /*AddLevel=*/true,
2132                  /*MunchSemi=*/false);
2133     }
2134   }
2135   // There is no addUnwrappedLine() here so that we fall through to parsing a
2136   // structural element afterwards. Thus, in "class A {} n, m;",
2137   // "} n, m;" will end up in one unwrapped line.
2138 }
2139 
2140 void UnwrappedLineParser::parseObjCMethod() {
2141   assert(FormatTok->Tok.isOneOf(tok::l_paren, tok::identifier) &&
2142          "'(' or identifier expected.");
2143   do {
2144     if (FormatTok->Tok.is(tok::semi)) {
2145       nextToken();
2146       addUnwrappedLine();
2147       return;
2148     } else if (FormatTok->Tok.is(tok::l_brace)) {
2149       parseBlock(/*MustBeDeclaration=*/false);
2150       addUnwrappedLine();
2151       return;
2152     } else {
2153       nextToken();
2154     }
2155   } while (!eof());
2156 }
2157 
2158 void UnwrappedLineParser::parseObjCProtocolList() {
2159   assert(FormatTok->Tok.is(tok::less) && "'<' expected.");
2160   do {
2161     nextToken();
2162     // Early exit in case someone forgot a close angle.
2163     if (FormatTok->isOneOf(tok::semi, tok::l_brace) ||
2164         FormatTok->Tok.isObjCAtKeyword(tok::objc_end))
2165       return;
2166   } while (!eof() && FormatTok->Tok.isNot(tok::greater));
2167   nextToken(); // Skip '>'.
2168 }
2169 
2170 void UnwrappedLineParser::parseObjCUntilAtEnd() {
2171   do {
2172     if (FormatTok->Tok.isObjCAtKeyword(tok::objc_end)) {
2173       nextToken();
2174       addUnwrappedLine();
2175       break;
2176     }
2177     if (FormatTok->is(tok::l_brace)) {
2178       parseBlock(/*MustBeDeclaration=*/false);
2179       // In ObjC interfaces, nothing should be following the "}".
2180       addUnwrappedLine();
2181     } else if (FormatTok->is(tok::r_brace)) {
2182       // Ignore stray "}". parseStructuralElement doesn't consume them.
2183       nextToken();
2184       addUnwrappedLine();
2185     } else if (FormatTok->isOneOf(tok::minus, tok::plus)) {
2186       nextToken();
2187       parseObjCMethod();
2188     } else {
2189       parseStructuralElement();
2190     }
2191   } while (!eof());
2192 }
2193 
2194 void UnwrappedLineParser::parseObjCInterfaceOrImplementation() {
2195   assert(FormatTok->Tok.getObjCKeywordID() == tok::objc_interface ||
2196          FormatTok->Tok.getObjCKeywordID() == tok::objc_implementation);
2197   nextToken();
2198   nextToken(); // interface name
2199 
2200   // @interface can be followed by a lightweight generic
2201   // specialization list, then either a base class or a category.
2202   if (FormatTok->Tok.is(tok::less)) {
2203     // Unlike protocol lists, generic parameterizations support
2204     // nested angles:
2205     //
2206     // @interface Foo<ValueType : id <NSCopying, NSSecureCoding>> :
2207     //     NSObject <NSCopying, NSSecureCoding>
2208     //
2209     // so we need to count how many open angles we have left.
2210     unsigned NumOpenAngles = 1;
2211     do {
2212       nextToken();
2213       // Early exit in case someone forgot a close angle.
2214       if (FormatTok->isOneOf(tok::semi, tok::l_brace) ||
2215           FormatTok->Tok.isObjCAtKeyword(tok::objc_end))
2216         break;
2217       if (FormatTok->Tok.is(tok::less))
2218         ++NumOpenAngles;
2219       else if (FormatTok->Tok.is(tok::greater)) {
2220         assert(NumOpenAngles > 0 && "'>' makes NumOpenAngles negative");
2221         --NumOpenAngles;
2222       }
2223     } while (!eof() && NumOpenAngles != 0);
2224     nextToken(); // Skip '>'.
2225   }
2226   if (FormatTok->Tok.is(tok::colon)) {
2227     nextToken();
2228     nextToken(); // base class name
2229   } else if (FormatTok->Tok.is(tok::l_paren))
2230     // Skip category, if present.
2231     parseParens();
2232 
2233   if (FormatTok->Tok.is(tok::less))
2234     parseObjCProtocolList();
2235 
2236   if (FormatTok->Tok.is(tok::l_brace)) {
2237     if (Style.BraceWrapping.AfterObjCDeclaration)
2238       addUnwrappedLine();
2239     parseBlock(/*MustBeDeclaration=*/true);
2240   }
2241 
2242   // With instance variables, this puts '}' on its own line.  Without instance
2243   // variables, this ends the @interface line.
2244   addUnwrappedLine();
2245 
2246   parseObjCUntilAtEnd();
2247 }
2248 
2249 // Returns true for the declaration/definition form of @protocol,
2250 // false for the expression form.
2251 bool UnwrappedLineParser::parseObjCProtocol() {
2252   assert(FormatTok->Tok.getObjCKeywordID() == tok::objc_protocol);
2253   nextToken();
2254 
2255   if (FormatTok->is(tok::l_paren))
2256     // The expression form of @protocol, e.g. "Protocol* p = @protocol(foo);".
2257     return false;
2258 
2259   // The definition/declaration form,
2260   // @protocol Foo
2261   // - (int)someMethod;
2262   // @end
2263 
2264   nextToken(); // protocol name
2265 
2266   if (FormatTok->Tok.is(tok::less))
2267     parseObjCProtocolList();
2268 
2269   // Check for protocol declaration.
2270   if (FormatTok->Tok.is(tok::semi)) {
2271     nextToken();
2272     addUnwrappedLine();
2273     return true;
2274   }
2275 
2276   addUnwrappedLine();
2277   parseObjCUntilAtEnd();
2278   return true;
2279 }
2280 
2281 void UnwrappedLineParser::parseJavaScriptEs6ImportExport() {
2282   bool IsImport = FormatTok->is(Keywords.kw_import);
2283   assert(IsImport || FormatTok->is(tok::kw_export));
2284   nextToken();
2285 
2286   // Consume the "default" in "export default class/function".
2287   if (FormatTok->is(tok::kw_default))
2288     nextToken();
2289 
2290   // Consume "async function", "function" and "default function", so that these
2291   // get parsed as free-standing JS functions, i.e. do not require a trailing
2292   // semicolon.
2293   if (FormatTok->is(Keywords.kw_async))
2294     nextToken();
2295   if (FormatTok->is(Keywords.kw_function)) {
2296     nextToken();
2297     return;
2298   }
2299 
2300   // For imports, `export *`, `export {...}`, consume the rest of the line up
2301   // to the terminating `;`. For everything else, just return and continue
2302   // parsing the structural element, i.e. the declaration or expression for
2303   // `export default`.
2304   if (!IsImport && !FormatTok->isOneOf(tok::l_brace, tok::star) &&
2305       !FormatTok->isStringLiteral())
2306     return;
2307 
2308   while (!eof()) {
2309     if (FormatTok->is(tok::semi))
2310       return;
2311     if (Line->Tokens.empty()) {
2312       // Common issue: Automatic Semicolon Insertion wrapped the line, so the
2313       // import statement should terminate.
2314       return;
2315     }
2316     if (FormatTok->is(tok::l_brace)) {
2317       FormatTok->BlockKind = BK_Block;
2318       nextToken();
2319       parseBracedList();
2320     } else {
2321       nextToken();
2322     }
2323   }
2324 }
2325 
2326 LLVM_ATTRIBUTE_UNUSED static void printDebugInfo(const UnwrappedLine &Line,
2327                                                  StringRef Prefix = "") {
2328   llvm::dbgs() << Prefix << "Line(" << Line.Level
2329                << ", FSC=" << Line.FirstStartColumn << ")"
2330                << (Line.InPPDirective ? " MACRO" : "") << ": ";
2331   for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(),
2332                                                     E = Line.Tokens.end();
2333        I != E; ++I) {
2334     llvm::dbgs() << I->Tok->Tok.getName() << "["
2335                  << "T=" << I->Tok->Type << ", OC=" << I->Tok->OriginalColumn
2336                  << "] ";
2337   }
2338   for (std::list<UnwrappedLineNode>::const_iterator I = Line.Tokens.begin(),
2339                                                     E = Line.Tokens.end();
2340        I != E; ++I) {
2341     const UnwrappedLineNode &Node = *I;
2342     for (SmallVectorImpl<UnwrappedLine>::const_iterator
2343              I = Node.Children.begin(),
2344              E = Node.Children.end();
2345          I != E; ++I) {
2346       printDebugInfo(*I, "\nChild: ");
2347     }
2348   }
2349   llvm::dbgs() << "\n";
2350 }
2351 
2352 void UnwrappedLineParser::addUnwrappedLine() {
2353   if (Line->Tokens.empty())
2354     return;
2355   LLVM_DEBUG({
2356     if (CurrentLines == &Lines)
2357       printDebugInfo(*Line);
2358   });
2359   CurrentLines->push_back(std::move(*Line));
2360   Line->Tokens.clear();
2361   Line->MatchingOpeningBlockLineIndex = UnwrappedLine::kInvalidIndex;
2362   Line->FirstStartColumn = 0;
2363   if (CurrentLines == &Lines && !PreprocessorDirectives.empty()) {
2364     CurrentLines->append(
2365         std::make_move_iterator(PreprocessorDirectives.begin()),
2366         std::make_move_iterator(PreprocessorDirectives.end()));
2367     PreprocessorDirectives.clear();
2368   }
2369   // Disconnect the current token from the last token on the previous line.
2370   FormatTok->Previous = nullptr;
2371 }
2372 
2373 bool UnwrappedLineParser::eof() const { return FormatTok->Tok.is(tok::eof); }
2374 
2375 bool UnwrappedLineParser::isOnNewLine(const FormatToken &FormatTok) {
2376   return (Line->InPPDirective || FormatTok.HasUnescapedNewline) &&
2377          FormatTok.NewlinesBefore > 0;
2378 }
2379 
2380 // Checks if \p FormatTok is a line comment that continues the line comment
2381 // section on \p Line.
2382 static bool continuesLineCommentSection(const FormatToken &FormatTok,
2383                                         const UnwrappedLine &Line,
2384                                         llvm::Regex &CommentPragmasRegex) {
2385   if (Line.Tokens.empty())
2386     return false;
2387 
2388   StringRef IndentContent = FormatTok.TokenText;
2389   if (FormatTok.TokenText.startswith("//") ||
2390       FormatTok.TokenText.startswith("/*"))
2391     IndentContent = FormatTok.TokenText.substr(2);
2392   if (CommentPragmasRegex.match(IndentContent))
2393     return false;
2394 
2395   // If Line starts with a line comment, then FormatTok continues the comment
2396   // section if its original column is greater or equal to the original start
2397   // column of the line.
2398   //
2399   // Define the min column token of a line as follows: if a line ends in '{' or
2400   // contains a '{' followed by a line comment, then the min column token is
2401   // that '{'. Otherwise, the min column token of the line is the first token of
2402   // the line.
2403   //
2404   // If Line starts with a token other than a line comment, then FormatTok
2405   // continues the comment section if its original column is greater than the
2406   // original start column of the min column token of the line.
2407   //
2408   // For example, the second line comment continues the first in these cases:
2409   //
2410   // // first line
2411   // // second line
2412   //
2413   // and:
2414   //
2415   // // first line
2416   //  // second line
2417   //
2418   // and:
2419   //
2420   // int i; // first line
2421   //  // second line
2422   //
2423   // and:
2424   //
2425   // do { // first line
2426   //      // second line
2427   //   int i;
2428   // } while (true);
2429   //
2430   // and:
2431   //
2432   // enum {
2433   //   a, // first line
2434   //    // second line
2435   //   b
2436   // };
2437   //
2438   // The second line comment doesn't continue the first in these cases:
2439   //
2440   //   // first line
2441   //  // second line
2442   //
2443   // and:
2444   //
2445   // int i; // first line
2446   // // second line
2447   //
2448   // and:
2449   //
2450   // do { // first line
2451   //   // second line
2452   //   int i;
2453   // } while (true);
2454   //
2455   // and:
2456   //
2457   // enum {
2458   //   a, // first line
2459   //   // second line
2460   // };
2461   const FormatToken *MinColumnToken = Line.Tokens.front().Tok;
2462 
2463   // Scan for '{//'. If found, use the column of '{' as a min column for line
2464   // comment section continuation.
2465   const FormatToken *PreviousToken = nullptr;
2466   for (const UnwrappedLineNode &Node : Line.Tokens) {
2467     if (PreviousToken && PreviousToken->is(tok::l_brace) &&
2468         isLineComment(*Node.Tok)) {
2469       MinColumnToken = PreviousToken;
2470       break;
2471     }
2472     PreviousToken = Node.Tok;
2473 
2474     // Grab the last newline preceding a token in this unwrapped line.
2475     if (Node.Tok->NewlinesBefore > 0) {
2476       MinColumnToken = Node.Tok;
2477     }
2478   }
2479   if (PreviousToken && PreviousToken->is(tok::l_brace)) {
2480     MinColumnToken = PreviousToken;
2481   }
2482 
2483   return continuesLineComment(FormatTok, /*Previous=*/Line.Tokens.back().Tok,
2484                               MinColumnToken);
2485 }
2486 
2487 void UnwrappedLineParser::flushComments(bool NewlineBeforeNext) {
2488   bool JustComments = Line->Tokens.empty();
2489   for (SmallVectorImpl<FormatToken *>::const_iterator
2490            I = CommentsBeforeNextToken.begin(),
2491            E = CommentsBeforeNextToken.end();
2492        I != E; ++I) {
2493     // Line comments that belong to the same line comment section are put on the
2494     // same line since later we might want to reflow content between them.
2495     // Additional fine-grained breaking of line comment sections is controlled
2496     // by the class BreakableLineCommentSection in case it is desirable to keep
2497     // several line comment sections in the same unwrapped line.
2498     //
2499     // FIXME: Consider putting separate line comment sections as children to the
2500     // unwrapped line instead.
2501     (*I)->ContinuesLineCommentSection =
2502         continuesLineCommentSection(**I, *Line, CommentPragmasRegex);
2503     if (isOnNewLine(**I) && JustComments && !(*I)->ContinuesLineCommentSection)
2504       addUnwrappedLine();
2505     pushToken(*I);
2506   }
2507   if (NewlineBeforeNext && JustComments)
2508     addUnwrappedLine();
2509   CommentsBeforeNextToken.clear();
2510 }
2511 
2512 void UnwrappedLineParser::nextToken(int LevelDifference) {
2513   if (eof())
2514     return;
2515   flushComments(isOnNewLine(*FormatTok));
2516   pushToken(FormatTok);
2517   FormatToken *Previous = FormatTok;
2518   if (Style.Language != FormatStyle::LK_JavaScript)
2519     readToken(LevelDifference);
2520   else
2521     readTokenWithJavaScriptASI();
2522   FormatTok->Previous = Previous;
2523 }
2524 
2525 void UnwrappedLineParser::distributeComments(
2526     const SmallVectorImpl<FormatToken *> &Comments,
2527     const FormatToken *NextTok) {
2528   // Whether or not a line comment token continues a line is controlled by
2529   // the method continuesLineCommentSection, with the following caveat:
2530   //
2531   // Define a trail of Comments to be a nonempty proper postfix of Comments such
2532   // that each comment line from the trail is aligned with the next token, if
2533   // the next token exists. If a trail exists, the beginning of the maximal
2534   // trail is marked as a start of a new comment section.
2535   //
2536   // For example in this code:
2537   //
2538   // int a; // line about a
2539   //   // line 1 about b
2540   //   // line 2 about b
2541   //   int b;
2542   //
2543   // the two lines about b form a maximal trail, so there are two sections, the
2544   // first one consisting of the single comment "// line about a" and the
2545   // second one consisting of the next two comments.
2546   if (Comments.empty())
2547     return;
2548   bool ShouldPushCommentsInCurrentLine = true;
2549   bool HasTrailAlignedWithNextToken = false;
2550   unsigned StartOfTrailAlignedWithNextToken = 0;
2551   if (NextTok) {
2552     // We are skipping the first element intentionally.
2553     for (unsigned i = Comments.size() - 1; i > 0; --i) {
2554       if (Comments[i]->OriginalColumn == NextTok->OriginalColumn) {
2555         HasTrailAlignedWithNextToken = true;
2556         StartOfTrailAlignedWithNextToken = i;
2557       }
2558     }
2559   }
2560   for (unsigned i = 0, e = Comments.size(); i < e; ++i) {
2561     FormatToken *FormatTok = Comments[i];
2562     if (HasTrailAlignedWithNextToken && i == StartOfTrailAlignedWithNextToken) {
2563       FormatTok->ContinuesLineCommentSection = false;
2564     } else {
2565       FormatTok->ContinuesLineCommentSection =
2566           continuesLineCommentSection(*FormatTok, *Line, CommentPragmasRegex);
2567     }
2568     if (!FormatTok->ContinuesLineCommentSection &&
2569         (isOnNewLine(*FormatTok) || FormatTok->IsFirst)) {
2570       ShouldPushCommentsInCurrentLine = false;
2571     }
2572     if (ShouldPushCommentsInCurrentLine) {
2573       pushToken(FormatTok);
2574     } else {
2575       CommentsBeforeNextToken.push_back(FormatTok);
2576     }
2577   }
2578 }
2579 
2580 void UnwrappedLineParser::readToken(int LevelDifference) {
2581   SmallVector<FormatToken *, 1> Comments;
2582   do {
2583     FormatTok = Tokens->getNextToken();
2584     assert(FormatTok);
2585     while (!Line->InPPDirective && FormatTok->Tok.is(tok::hash) &&
2586            (FormatTok->HasUnescapedNewline || FormatTok->IsFirst)) {
2587       distributeComments(Comments, FormatTok);
2588       Comments.clear();
2589       // If there is an unfinished unwrapped line, we flush the preprocessor
2590       // directives only after that unwrapped line was finished later.
2591       bool SwitchToPreprocessorLines = !Line->Tokens.empty();
2592       ScopedLineState BlockState(*this, SwitchToPreprocessorLines);
2593       assert((LevelDifference >= 0 ||
2594               static_cast<unsigned>(-LevelDifference) <= Line->Level) &&
2595              "LevelDifference makes Line->Level negative");
2596       Line->Level += LevelDifference;
2597       // Comments stored before the preprocessor directive need to be output
2598       // before the preprocessor directive, at the same level as the
2599       // preprocessor directive, as we consider them to apply to the directive.
2600       flushComments(isOnNewLine(*FormatTok));
2601       parsePPDirective();
2602     }
2603     while (FormatTok->Type == TT_ConflictStart ||
2604            FormatTok->Type == TT_ConflictEnd ||
2605            FormatTok->Type == TT_ConflictAlternative) {
2606       if (FormatTok->Type == TT_ConflictStart) {
2607         conditionalCompilationStart(/*Unreachable=*/false);
2608       } else if (FormatTok->Type == TT_ConflictAlternative) {
2609         conditionalCompilationAlternative();
2610       } else if (FormatTok->Type == TT_ConflictEnd) {
2611         conditionalCompilationEnd();
2612       }
2613       FormatTok = Tokens->getNextToken();
2614       FormatTok->MustBreakBefore = true;
2615     }
2616 
2617     if (!PPStack.empty() && (PPStack.back().Kind == PP_Unreachable) &&
2618         !Line->InPPDirective) {
2619       continue;
2620     }
2621 
2622     if (!FormatTok->Tok.is(tok::comment)) {
2623       distributeComments(Comments, FormatTok);
2624       Comments.clear();
2625       return;
2626     }
2627 
2628     Comments.push_back(FormatTok);
2629   } while (!eof());
2630 
2631   distributeComments(Comments, nullptr);
2632   Comments.clear();
2633 }
2634 
2635 void UnwrappedLineParser::pushToken(FormatToken *Tok) {
2636   Line->Tokens.push_back(UnwrappedLineNode(Tok));
2637   if (MustBreakBeforeNextToken) {
2638     Line->Tokens.back().Tok->MustBreakBefore = true;
2639     MustBreakBeforeNextToken = false;
2640   }
2641 }
2642 
2643 } // end namespace format
2644 } // end namespace clang
2645