xref: /freebsd/contrib/llvm-project/clang/lib/Format/TokenAnnotator.cpp (revision e64bea71c21eb42e97aa615188ba91f6cce0d36d)
1 //===--- TokenAnnotator.cpp - Format C++ code -----------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// This file implements a token annotator, i.e. creates
11 /// \c AnnotatedTokens out of \c FormatTokens with required extra information.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #include "TokenAnnotator.h"
16 #include "FormatToken.h"
17 #include "clang/Basic/TokenKinds.h"
18 #include "llvm/ADT/SmallPtrSet.h"
19 #include "llvm/Support/Debug.h"
20 
21 #define DEBUG_TYPE "format-token-annotator"
22 
23 namespace clang {
24 namespace format {
25 
mustBreakAfterAttributes(const FormatToken & Tok,const FormatStyle & Style)26 static bool mustBreakAfterAttributes(const FormatToken &Tok,
27                                      const FormatStyle &Style) {
28   switch (Style.BreakAfterAttributes) {
29   case FormatStyle::ABS_Always:
30     return true;
31   case FormatStyle::ABS_Leave:
32     return Tok.NewlinesBefore > 0;
33   default:
34     return false;
35   }
36 }
37 
38 namespace {
39 
40 /// Returns \c true if the line starts with a token that can start a statement
41 /// with an initializer.
startsWithInitStatement(const AnnotatedLine & Line)42 static bool startsWithInitStatement(const AnnotatedLine &Line) {
43   return Line.startsWith(tok::kw_for) || Line.startsWith(tok::kw_if) ||
44          Line.startsWith(tok::kw_switch);
45 }
46 
47 /// Returns \c true if the token can be used as an identifier in
48 /// an Objective-C \c \@selector, \c false otherwise.
49 ///
50 /// Because getFormattingLangOpts() always lexes source code as
51 /// Objective-C++, C++ keywords like \c new and \c delete are
52 /// lexed as tok::kw_*, not tok::identifier, even for Objective-C.
53 ///
54 /// For Objective-C and Objective-C++, both identifiers and keywords
55 /// are valid inside @selector(...) (or a macro which
56 /// invokes @selector(...)). So, we allow treat any identifier or
57 /// keyword as a potential Objective-C selector component.
canBeObjCSelectorComponent(const FormatToken & Tok)58 static bool canBeObjCSelectorComponent(const FormatToken &Tok) {
59   return Tok.Tok.getIdentifierInfo();
60 }
61 
62 /// With `Left` being '(', check if we're at either `[...](` or
63 /// `[...]<...>(`, where the [ opens a lambda capture list.
64 // FIXME: this doesn't cover attributes/constraints before the l_paren.
isLambdaParameterList(const FormatToken * Left)65 static bool isLambdaParameterList(const FormatToken *Left) {
66   // Skip <...> if present.
67   if (Left->Previous && Left->Previous->is(tok::greater) &&
68       Left->Previous->MatchingParen &&
69       Left->Previous->MatchingParen->is(TT_TemplateOpener)) {
70     Left = Left->Previous->MatchingParen;
71   }
72 
73   // Check for `[...]`.
74   return Left->Previous && Left->Previous->is(tok::r_square) &&
75          Left->Previous->MatchingParen &&
76          Left->Previous->MatchingParen->is(TT_LambdaLSquare);
77 }
78 
79 /// Returns \c true if the token is followed by a boolean condition, \c false
80 /// otherwise.
isKeywordWithCondition(const FormatToken & Tok)81 static bool isKeywordWithCondition(const FormatToken &Tok) {
82   return Tok.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch,
83                      tok::kw_constexpr, tok::kw_catch);
84 }
85 
86 /// Returns \c true if the token starts a C++ attribute, \c false otherwise.
isCppAttribute(bool IsCpp,const FormatToken & Tok)87 static bool isCppAttribute(bool IsCpp, const FormatToken &Tok) {
88   if (!IsCpp || !Tok.startsSequence(tok::l_square, tok::l_square))
89     return false;
90   // The first square bracket is part of an ObjC array literal
91   if (Tok.Previous && Tok.Previous->is(tok::at))
92     return false;
93   const FormatToken *AttrTok = Tok.Next->Next;
94   if (!AttrTok)
95     return false;
96   // C++17 '[[using ns: foo, bar(baz, blech)]]'
97   // We assume nobody will name an ObjC variable 'using'.
98   if (AttrTok->startsSequence(tok::kw_using, tok::identifier, tok::colon))
99     return true;
100   if (AttrTok->isNot(tok::identifier))
101     return false;
102   while (AttrTok && !AttrTok->startsSequence(tok::r_square, tok::r_square)) {
103     // ObjC message send. We assume nobody will use : in a C++11 attribute
104     // specifier parameter, although this is technically valid:
105     // [[foo(:)]].
106     if (AttrTok->is(tok::colon) ||
107         AttrTok->startsSequence(tok::identifier, tok::identifier) ||
108         AttrTok->startsSequence(tok::r_paren, tok::identifier)) {
109       return false;
110     }
111     if (AttrTok->is(tok::ellipsis))
112       return true;
113     AttrTok = AttrTok->Next;
114   }
115   return AttrTok && AttrTok->startsSequence(tok::r_square, tok::r_square);
116 }
117 
118 /// A parser that gathers additional information about tokens.
119 ///
120 /// The \c TokenAnnotator tries to match parenthesis and square brakets and
121 /// store a parenthesis levels. It also tries to resolve matching "<" and ">"
122 /// into template parameter lists.
123 class AnnotatingParser {
124 public:
AnnotatingParser(const FormatStyle & Style,AnnotatedLine & Line,const AdditionalKeywords & Keywords,SmallVector<ScopeType> & Scopes)125   AnnotatingParser(const FormatStyle &Style, AnnotatedLine &Line,
126                    const AdditionalKeywords &Keywords,
127                    SmallVector<ScopeType> &Scopes)
128       : Style(Style), Line(Line), CurrentToken(Line.First), AutoFound(false),
129         IsCpp(Style.isCpp()), LangOpts(getFormattingLangOpts(Style)),
130         Keywords(Keywords), Scopes(Scopes), TemplateDeclarationDepth(0) {
131     Contexts.push_back(Context(tok::unknown, 1, /*IsExpression=*/false));
132     resetTokenMetadata();
133   }
134 
135 private:
getScopeType(const FormatToken & Token) const136   ScopeType getScopeType(const FormatToken &Token) const {
137     switch (Token.getType()) {
138     case TT_ClassLBrace:
139     case TT_StructLBrace:
140     case TT_UnionLBrace:
141       return ST_Class;
142     case TT_CompoundRequirementLBrace:
143       return ST_CompoundRequirement;
144     default:
145       return ST_Other;
146     }
147   }
148 
parseAngle()149   bool parseAngle() {
150     if (!CurrentToken)
151       return false;
152 
153     auto *Left = CurrentToken->Previous; // The '<'.
154     if (!Left)
155       return false;
156 
157     if (NonTemplateLess.count(Left) > 0)
158       return false;
159 
160     const auto *BeforeLess = Left->Previous;
161 
162     if (BeforeLess) {
163       if (BeforeLess->Tok.isLiteral())
164         return false;
165       if (BeforeLess->is(tok::r_brace))
166         return false;
167       if (BeforeLess->is(tok::r_paren) && Contexts.size() > 1 &&
168           !(BeforeLess->MatchingParen &&
169             BeforeLess->MatchingParen->is(TT_OverloadedOperatorLParen))) {
170         return false;
171       }
172       if (BeforeLess->is(tok::kw_operator) && CurrentToken->is(tok::l_paren))
173         return false;
174     }
175 
176     Left->ParentBracket = Contexts.back().ContextKind;
177     ScopedContextCreator ContextCreator(*this, tok::less, 12);
178     Contexts.back().IsExpression = false;
179 
180     // If there's a template keyword before the opening angle bracket, this is a
181     // template parameter, not an argument.
182     if (BeforeLess && BeforeLess->isNot(tok::kw_template))
183       Contexts.back().ContextType = Context::TemplateArgument;
184 
185     if (Style.isJava() && CurrentToken->is(tok::question))
186       next();
187 
188     for (bool SeenTernaryOperator = false, MaybeAngles = true; CurrentToken;) {
189       const bool InExpr = Contexts[Contexts.size() - 2].IsExpression;
190       if (CurrentToken->is(tok::greater)) {
191         const auto *Next = CurrentToken->Next;
192         if (CurrentToken->isNot(TT_TemplateCloser)) {
193           // Try to do a better job at looking for ">>" within the condition of
194           // a statement. Conservatively insert spaces between consecutive ">"
195           // tokens to prevent splitting right shift operators and potentially
196           // altering program semantics. This check is overly conservative and
197           // will prevent spaces from being inserted in select nested template
198           // parameter cases, but should not alter program semantics.
199           if (Next && Next->is(tok::greater) &&
200               Left->ParentBracket != tok::less &&
201               CurrentToken->getStartOfNonWhitespace() ==
202                   Next->getStartOfNonWhitespace().getLocWithOffset(-1)) {
203             return false;
204           }
205           if (InExpr && SeenTernaryOperator &&
206               (!Next || !Next->isOneOf(tok::l_paren, tok::l_brace))) {
207             return false;
208           }
209           if (!MaybeAngles)
210             return false;
211         }
212         Left->MatchingParen = CurrentToken;
213         CurrentToken->MatchingParen = Left;
214         // In TT_Proto, we must distignuish between:
215         //   map<key, value>
216         //   msg < item: data >
217         //   msg: < item: data >
218         // In TT_TextProto, map<key, value> does not occur.
219         if (Style.isTextProto() ||
220             (Style.Language == FormatStyle::LK_Proto && BeforeLess &&
221              BeforeLess->isOneOf(TT_SelectorName, TT_DictLiteral))) {
222           CurrentToken->setType(TT_DictLiteral);
223         } else {
224           CurrentToken->setType(TT_TemplateCloser);
225           CurrentToken->Tok.setLength(1);
226         }
227         if (Next && Next->Tok.isLiteral())
228           return false;
229         next();
230         return true;
231       }
232       if (BeforeLess && BeforeLess->is(TT_TemplateName)) {
233         next();
234         continue;
235       }
236       if (CurrentToken->is(tok::question) && Style.isJava()) {
237         next();
238         continue;
239       }
240       if (CurrentToken->isOneOf(tok::r_paren, tok::r_square, tok::r_brace))
241         return false;
242       const auto &Prev = *CurrentToken->Previous;
243       // If a && or || is found and interpreted as a binary operator, this set
244       // of angles is likely part of something like "a < b && c > d". If the
245       // angles are inside an expression, the ||/&& might also be a binary
246       // operator that was misinterpreted because we are parsing template
247       // parameters.
248       // FIXME: This is getting out of hand, write a decent parser.
249       if (MaybeAngles && InExpr && !Line.startsWith(tok::kw_template) &&
250           Prev.is(TT_BinaryOperator) &&
251           Prev.isOneOf(tok::pipepipe, tok::ampamp)) {
252         MaybeAngles = false;
253       }
254       if (Prev.isOneOf(tok::question, tok::colon) && !Style.isProto())
255         SeenTernaryOperator = true;
256       updateParameterCount(Left, CurrentToken);
257       if (Style.Language == FormatStyle::LK_Proto) {
258         if (FormatToken *Previous = CurrentToken->getPreviousNonComment()) {
259           if (CurrentToken->is(tok::colon) ||
260               (CurrentToken->isOneOf(tok::l_brace, tok::less) &&
261                Previous->isNot(tok::colon))) {
262             Previous->setType(TT_SelectorName);
263           }
264         }
265       } else if (Style.isTableGen()) {
266         if (CurrentToken->isOneOf(tok::comma, tok::equal)) {
267           // They appear as separators. Unless they are not in class definition.
268           next();
269           continue;
270         }
271         // In angle, there must be Value like tokens. Types are also able to be
272         // parsed in the same way with Values.
273         if (!parseTableGenValue())
274           return false;
275         continue;
276       }
277       if (!consumeToken())
278         return false;
279     }
280     return false;
281   }
282 
parseUntouchableParens()283   bool parseUntouchableParens() {
284     while (CurrentToken) {
285       CurrentToken->Finalized = true;
286       switch (CurrentToken->Tok.getKind()) {
287       case tok::l_paren:
288         next();
289         if (!parseUntouchableParens())
290           return false;
291         continue;
292       case tok::r_paren:
293         next();
294         return true;
295       default:
296         // no-op
297         break;
298       }
299       next();
300     }
301     return false;
302   }
303 
parseParens(bool IsIf=false)304   bool parseParens(bool IsIf = false) {
305     if (!CurrentToken)
306       return false;
307     assert(CurrentToken->Previous && "Unknown previous token");
308     FormatToken &OpeningParen = *CurrentToken->Previous;
309     assert(OpeningParen.is(tok::l_paren));
310     FormatToken *PrevNonComment = OpeningParen.getPreviousNonComment();
311     OpeningParen.ParentBracket = Contexts.back().ContextKind;
312     ScopedContextCreator ContextCreator(*this, tok::l_paren, 1);
313 
314     // FIXME: This is a bit of a hack. Do better.
315     Contexts.back().ColonIsForRangeExpr =
316         Contexts.size() == 2 && Contexts[0].ColonIsForRangeExpr;
317 
318     if (OpeningParen.Previous &&
319         OpeningParen.Previous->is(TT_UntouchableMacroFunc)) {
320       OpeningParen.Finalized = true;
321       return parseUntouchableParens();
322     }
323 
324     bool StartsObjCMethodExpr = false;
325     if (!Style.isVerilog()) {
326       if (FormatToken *MaybeSel = OpeningParen.Previous) {
327         // @selector( starts a selector.
328         if (MaybeSel->is(tok::objc_selector) && MaybeSel->Previous &&
329             MaybeSel->Previous->is(tok::at)) {
330           StartsObjCMethodExpr = true;
331         }
332       }
333     }
334 
335     if (OpeningParen.is(TT_OverloadedOperatorLParen)) {
336       // Find the previous kw_operator token.
337       FormatToken *Prev = &OpeningParen;
338       while (Prev->isNot(tok::kw_operator)) {
339         Prev = Prev->Previous;
340         assert(Prev && "Expect a kw_operator prior to the OperatorLParen!");
341       }
342 
343       // If faced with "a.operator*(argument)" or "a->operator*(argument)",
344       // i.e. the operator is called as a member function,
345       // then the argument must be an expression.
346       bool OperatorCalledAsMemberFunction =
347           Prev->Previous && Prev->Previous->isOneOf(tok::period, tok::arrow);
348       Contexts.back().IsExpression = OperatorCalledAsMemberFunction;
349     } else if (OpeningParen.is(TT_VerilogInstancePortLParen)) {
350       Contexts.back().IsExpression = true;
351       Contexts.back().ContextType = Context::VerilogInstancePortList;
352     } else if (Style.isJavaScript() &&
353                (Line.startsWith(Keywords.kw_type, tok::identifier) ||
354                 Line.startsWith(tok::kw_export, Keywords.kw_type,
355                                 tok::identifier))) {
356       // type X = (...);
357       // export type X = (...);
358       Contexts.back().IsExpression = false;
359     } else if (OpeningParen.Previous &&
360                (OpeningParen.Previous->isOneOf(
361                     tok::kw_static_assert, tok::kw_noexcept, tok::kw_explicit,
362                     tok::kw_while, tok::l_paren, tok::comma, TT_CastRParen,
363                     TT_BinaryOperator) ||
364                 OpeningParen.Previous->isIf())) {
365       // static_assert, if and while usually contain expressions.
366       Contexts.back().IsExpression = true;
367     } else if (Style.isJavaScript() && OpeningParen.Previous &&
368                (OpeningParen.Previous->is(Keywords.kw_function) ||
369                 (OpeningParen.Previous->endsSequence(tok::identifier,
370                                                      Keywords.kw_function)))) {
371       // function(...) or function f(...)
372       Contexts.back().IsExpression = false;
373     } else if (Style.isJavaScript() && OpeningParen.Previous &&
374                OpeningParen.Previous->is(TT_JsTypeColon)) {
375       // let x: (SomeType);
376       Contexts.back().IsExpression = false;
377     } else if (isLambdaParameterList(&OpeningParen)) {
378       // This is a parameter list of a lambda expression.
379       OpeningParen.setType(TT_LambdaDefinitionLParen);
380       Contexts.back().IsExpression = false;
381     } else if (OpeningParen.is(TT_RequiresExpressionLParen)) {
382       Contexts.back().IsExpression = false;
383     } else if (OpeningParen.Previous &&
384                OpeningParen.Previous->is(tok::kw__Generic)) {
385       Contexts.back().ContextType = Context::C11GenericSelection;
386       Contexts.back().IsExpression = true;
387     } else if (Line.InPPDirective &&
388                (!OpeningParen.Previous ||
389                 OpeningParen.Previous->isNot(tok::identifier))) {
390       Contexts.back().IsExpression = true;
391     } else if (Contexts[Contexts.size() - 2].CaretFound) {
392       // This is the parameter list of an ObjC block.
393       Contexts.back().IsExpression = false;
394     } else if (OpeningParen.Previous &&
395                OpeningParen.Previous->is(TT_ForEachMacro)) {
396       // The first argument to a foreach macro is a declaration.
397       Contexts.back().ContextType = Context::ForEachMacro;
398       Contexts.back().IsExpression = false;
399     } else if (OpeningParen.Previous && OpeningParen.Previous->MatchingParen &&
400                OpeningParen.Previous->MatchingParen->isOneOf(
401                    TT_ObjCBlockLParen, TT_FunctionTypeLParen)) {
402       Contexts.back().IsExpression = false;
403     } else if (!Line.MustBeDeclaration &&
404                (!Line.InPPDirective || (Line.InMacroBody && !Scopes.empty()))) {
405       bool IsForOrCatch =
406           OpeningParen.Previous &&
407           OpeningParen.Previous->isOneOf(tok::kw_for, tok::kw_catch);
408       Contexts.back().IsExpression = !IsForOrCatch;
409     }
410 
411     if (Style.isTableGen()) {
412       if (FormatToken *Prev = OpeningParen.Previous) {
413         if (Prev->is(TT_TableGenCondOperator)) {
414           Contexts.back().IsTableGenCondOpe = true;
415           Contexts.back().IsExpression = true;
416         } else if (Contexts.size() > 1 &&
417                    Contexts[Contexts.size() - 2].IsTableGenBangOpe) {
418           // Hack to handle bang operators. The parent context's flag
419           // was set by parseTableGenSimpleValue().
420           // We have to specify the context outside because the prev of "(" may
421           // be ">", not the bang operator in this case.
422           Contexts.back().IsTableGenBangOpe = true;
423           Contexts.back().IsExpression = true;
424         } else {
425           // Otherwise, this paren seems DAGArg.
426           if (!parseTableGenDAGArg())
427             return false;
428           return parseTableGenDAGArgAndList(&OpeningParen);
429         }
430       }
431     }
432 
433     // Infer the role of the l_paren based on the previous token if we haven't
434     // detected one yet.
435     if (PrevNonComment && OpeningParen.is(TT_Unknown)) {
436       if (PrevNonComment->isAttribute()) {
437         OpeningParen.setType(TT_AttributeLParen);
438       } else if (PrevNonComment->isOneOf(TT_TypenameMacro, tok::kw_decltype,
439                                          tok::kw_typeof,
440 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) tok::kw___##Trait,
441 #include "clang/Basic/TransformTypeTraits.def"
442                                          tok::kw__Atomic)) {
443         OpeningParen.setType(TT_TypeDeclarationParen);
444         // decltype() and typeof() usually contain expressions.
445         if (PrevNonComment->isOneOf(tok::kw_decltype, tok::kw_typeof))
446           Contexts.back().IsExpression = true;
447       }
448     }
449 
450     if (StartsObjCMethodExpr) {
451       Contexts.back().ColonIsObjCMethodExpr = true;
452       OpeningParen.setType(TT_ObjCMethodExpr);
453     }
454 
455     // MightBeFunctionType and ProbablyFunctionType are used for
456     // function pointer and reference types as well as Objective-C
457     // block types:
458     //
459     // void (*FunctionPointer)(void);
460     // void (&FunctionReference)(void);
461     // void (&&FunctionReference)(void);
462     // void (^ObjCBlock)(void);
463     bool MightBeFunctionType = !Contexts[Contexts.size() - 2].IsExpression;
464     bool ProbablyFunctionType =
465         CurrentToken->isPointerOrReference() || CurrentToken->is(tok::caret);
466     bool HasMultipleLines = false;
467     bool HasMultipleParametersOnALine = false;
468     bool MightBeObjCForRangeLoop =
469         OpeningParen.Previous && OpeningParen.Previous->is(tok::kw_for);
470     FormatToken *PossibleObjCForInToken = nullptr;
471     while (CurrentToken) {
472       const auto &Prev = *CurrentToken->Previous;
473       const auto *PrevPrev = Prev.Previous;
474       if (Prev.is(TT_PointerOrReference) &&
475           PrevPrev->isOneOf(tok::l_paren, tok::coloncolon)) {
476         ProbablyFunctionType = true;
477       }
478       if (CurrentToken->is(tok::comma))
479         MightBeFunctionType = false;
480       if (Prev.is(TT_BinaryOperator))
481         Contexts.back().IsExpression = true;
482       if (CurrentToken->is(tok::r_paren)) {
483         if (Prev.is(TT_PointerOrReference) &&
484             (PrevPrev == &OpeningParen || PrevPrev->is(tok::coloncolon))) {
485           MightBeFunctionType = true;
486         }
487         if (OpeningParen.isNot(TT_CppCastLParen) && MightBeFunctionType &&
488             ProbablyFunctionType && CurrentToken->Next &&
489             (CurrentToken->Next->is(tok::l_paren) ||
490              (CurrentToken->Next->is(tok::l_square) &&
491               (Line.MustBeDeclaration ||
492                (PrevNonComment && PrevNonComment->isTypeName(LangOpts)))))) {
493           OpeningParen.setType(OpeningParen.Next->is(tok::caret)
494                                    ? TT_ObjCBlockLParen
495                                    : TT_FunctionTypeLParen);
496         }
497         OpeningParen.MatchingParen = CurrentToken;
498         CurrentToken->MatchingParen = &OpeningParen;
499 
500         if (CurrentToken->Next && CurrentToken->Next->is(tok::l_brace) &&
501             OpeningParen.Previous && OpeningParen.Previous->is(tok::l_paren)) {
502           // Detect the case where macros are used to generate lambdas or
503           // function bodies, e.g.:
504           //   auto my_lambda = MACRO((Type *type, int i) { .. body .. });
505           for (FormatToken *Tok = &OpeningParen; Tok != CurrentToken;
506                Tok = Tok->Next) {
507             if (Tok->is(TT_BinaryOperator) && Tok->isPointerOrReference())
508               Tok->setType(TT_PointerOrReference);
509           }
510         }
511 
512         if (StartsObjCMethodExpr) {
513           CurrentToken->setType(TT_ObjCMethodExpr);
514           if (Contexts.back().FirstObjCSelectorName) {
515             Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
516                 Contexts.back().LongestObjCSelectorName;
517           }
518         }
519 
520         if (OpeningParen.is(TT_AttributeLParen))
521           CurrentToken->setType(TT_AttributeRParen);
522         if (OpeningParen.is(TT_TypeDeclarationParen))
523           CurrentToken->setType(TT_TypeDeclarationParen);
524         if (OpeningParen.Previous &&
525             OpeningParen.Previous->is(TT_JavaAnnotation)) {
526           CurrentToken->setType(TT_JavaAnnotation);
527         }
528         if (OpeningParen.Previous &&
529             OpeningParen.Previous->is(TT_LeadingJavaAnnotation)) {
530           CurrentToken->setType(TT_LeadingJavaAnnotation);
531         }
532         if (OpeningParen.Previous &&
533             OpeningParen.Previous->is(TT_AttributeSquare)) {
534           CurrentToken->setType(TT_AttributeSquare);
535         }
536 
537         if (!HasMultipleLines)
538           OpeningParen.setPackingKind(PPK_Inconclusive);
539         else if (HasMultipleParametersOnALine)
540           OpeningParen.setPackingKind(PPK_BinPacked);
541         else
542           OpeningParen.setPackingKind(PPK_OnePerLine);
543 
544         next();
545         return true;
546       }
547       if (CurrentToken->isOneOf(tok::r_square, tok::r_brace))
548         return false;
549 
550       if (CurrentToken->is(tok::l_brace) && OpeningParen.is(TT_ObjCBlockLParen))
551         OpeningParen.setType(TT_Unknown);
552       if (CurrentToken->is(tok::comma) && CurrentToken->Next &&
553           !CurrentToken->Next->HasUnescapedNewline &&
554           !CurrentToken->Next->isTrailingComment()) {
555         HasMultipleParametersOnALine = true;
556       }
557       bool ProbablyFunctionTypeLParen =
558           (CurrentToken->is(tok::l_paren) && CurrentToken->Next &&
559            CurrentToken->Next->isOneOf(tok::star, tok::amp, tok::caret));
560       if ((Prev.isOneOf(tok::kw_const, tok::kw_auto) ||
561            Prev.isTypeName(LangOpts)) &&
562           !(CurrentToken->is(tok::l_brace) ||
563             (CurrentToken->is(tok::l_paren) && !ProbablyFunctionTypeLParen))) {
564         Contexts.back().IsExpression = false;
565       }
566       if (CurrentToken->isOneOf(tok::semi, tok::colon)) {
567         MightBeObjCForRangeLoop = false;
568         if (PossibleObjCForInToken) {
569           PossibleObjCForInToken->setType(TT_Unknown);
570           PossibleObjCForInToken = nullptr;
571         }
572       }
573       if (IsIf && CurrentToken->is(tok::semi)) {
574         for (auto *Tok = OpeningParen.Next;
575              Tok != CurrentToken &&
576              !Tok->isOneOf(tok::equal, tok::l_paren, tok::l_brace);
577              Tok = Tok->Next) {
578           if (Tok->isPointerOrReference())
579             Tok->setFinalizedType(TT_PointerOrReference);
580         }
581       }
582       if (MightBeObjCForRangeLoop && CurrentToken->is(Keywords.kw_in)) {
583         PossibleObjCForInToken = CurrentToken;
584         PossibleObjCForInToken->setType(TT_ObjCForIn);
585       }
586       // When we discover a 'new', we set CanBeExpression to 'false' in order to
587       // parse the type correctly. Reset that after a comma.
588       if (CurrentToken->is(tok::comma))
589         Contexts.back().CanBeExpression = true;
590 
591       if (Style.isTableGen()) {
592         if (CurrentToken->is(tok::comma)) {
593           if (Contexts.back().IsTableGenCondOpe)
594             CurrentToken->setType(TT_TableGenCondOperatorComma);
595           next();
596         } else if (CurrentToken->is(tok::colon)) {
597           if (Contexts.back().IsTableGenCondOpe)
598             CurrentToken->setType(TT_TableGenCondOperatorColon);
599           next();
600         }
601         // In TableGen there must be Values in parens.
602         if (!parseTableGenValue())
603           return false;
604         continue;
605       }
606 
607       FormatToken *Tok = CurrentToken;
608       if (!consumeToken())
609         return false;
610       updateParameterCount(&OpeningParen, Tok);
611       if (CurrentToken && CurrentToken->HasUnescapedNewline)
612         HasMultipleLines = true;
613     }
614     return false;
615   }
616 
isCSharpAttributeSpecifier(const FormatToken & Tok)617   bool isCSharpAttributeSpecifier(const FormatToken &Tok) {
618     if (!Style.isCSharp())
619       return false;
620 
621     // `identifier[i]` is not an attribute.
622     if (Tok.Previous && Tok.Previous->is(tok::identifier))
623       return false;
624 
625     // Chains of [] in `identifier[i][j][k]` are not attributes.
626     if (Tok.Previous && Tok.Previous->is(tok::r_square)) {
627       auto *MatchingParen = Tok.Previous->MatchingParen;
628       if (!MatchingParen || MatchingParen->is(TT_ArraySubscriptLSquare))
629         return false;
630     }
631 
632     const FormatToken *AttrTok = Tok.Next;
633     if (!AttrTok)
634       return false;
635 
636     // Just an empty declaration e.g. string [].
637     if (AttrTok->is(tok::r_square))
638       return false;
639 
640     // Move along the tokens inbetween the '[' and ']' e.g. [STAThread].
641     while (AttrTok && AttrTok->isNot(tok::r_square))
642       AttrTok = AttrTok->Next;
643 
644     if (!AttrTok)
645       return false;
646 
647     // Allow an attribute to be the only content of a file.
648     AttrTok = AttrTok->Next;
649     if (!AttrTok)
650       return true;
651 
652     // Limit this to being an access modifier that follows.
653     if (AttrTok->isAccessSpecifierKeyword() ||
654         AttrTok->isOneOf(tok::comment, tok::kw_class, tok::kw_static,
655                          tok::l_square, Keywords.kw_internal)) {
656       return true;
657     }
658 
659     // incase its a [XXX] retval func(....
660     if (AttrTok->Next &&
661         AttrTok->Next->startsSequence(tok::identifier, tok::l_paren)) {
662       return true;
663     }
664 
665     return false;
666   }
667 
parseSquare()668   bool parseSquare() {
669     if (!CurrentToken)
670       return false;
671 
672     // A '[' could be an index subscript (after an identifier or after
673     // ')' or ']'), it could be the start of an Objective-C method
674     // expression, it could the start of an Objective-C array literal,
675     // or it could be a C++ attribute specifier [[foo::bar]].
676     FormatToken *Left = CurrentToken->Previous;
677     Left->ParentBracket = Contexts.back().ContextKind;
678     FormatToken *Parent = Left->getPreviousNonComment();
679 
680     // Cases where '>' is followed by '['.
681     // In C++, this can happen either in array of templates (foo<int>[10])
682     // or when array is a nested template type (unique_ptr<type1<type2>[]>).
683     bool CppArrayTemplates =
684         IsCpp && Parent && Parent->is(TT_TemplateCloser) &&
685         (Contexts.back().CanBeExpression || Contexts.back().IsExpression ||
686          Contexts.back().ContextType == Context::TemplateArgument);
687 
688     const bool IsInnerSquare = Contexts.back().InCpp11AttributeSpecifier;
689     const bool IsCpp11AttributeSpecifier =
690         isCppAttribute(IsCpp, *Left) || IsInnerSquare;
691 
692     // Treat C# Attributes [STAThread] much like C++ attributes [[...]].
693     bool IsCSharpAttributeSpecifier =
694         isCSharpAttributeSpecifier(*Left) ||
695         Contexts.back().InCSharpAttributeSpecifier;
696 
697     bool InsideInlineASM = Line.startsWith(tok::kw_asm);
698     bool IsCppStructuredBinding = Left->isCppStructuredBinding(IsCpp);
699     bool StartsObjCMethodExpr =
700         !IsCppStructuredBinding && !InsideInlineASM && !CppArrayTemplates &&
701         IsCpp && !IsCpp11AttributeSpecifier && !IsCSharpAttributeSpecifier &&
702         Contexts.back().CanBeExpression && Left->isNot(TT_LambdaLSquare) &&
703         !CurrentToken->isOneOf(tok::l_brace, tok::r_square) &&
704         (!Parent ||
705          Parent->isOneOf(tok::colon, tok::l_square, tok::l_paren,
706                          tok::kw_return, tok::kw_throw) ||
707          Parent->isUnaryOperator() ||
708          // FIXME(bug 36976): ObjC return types shouldn't use TT_CastRParen.
709          Parent->isOneOf(TT_ObjCForIn, TT_CastRParen) ||
710          (getBinOpPrecedence(Parent->Tok.getKind(), true, true) >
711           prec::Unknown));
712     bool ColonFound = false;
713 
714     unsigned BindingIncrease = 1;
715     if (IsCppStructuredBinding) {
716       Left->setType(TT_StructuredBindingLSquare);
717     } else if (Left->is(TT_Unknown)) {
718       if (StartsObjCMethodExpr) {
719         Left->setType(TT_ObjCMethodExpr);
720       } else if (InsideInlineASM) {
721         Left->setType(TT_InlineASMSymbolicNameLSquare);
722       } else if (IsCpp11AttributeSpecifier) {
723         Left->setType(TT_AttributeSquare);
724         if (!IsInnerSquare && Left->Previous)
725           Left->Previous->EndsCppAttributeGroup = false;
726       } else if (Style.isJavaScript() && Parent &&
727                  Contexts.back().ContextKind == tok::l_brace &&
728                  Parent->isOneOf(tok::l_brace, tok::comma)) {
729         Left->setType(TT_JsComputedPropertyName);
730       } else if (IsCpp && Contexts.back().ContextKind == tok::l_brace &&
731                  Parent && Parent->isOneOf(tok::l_brace, tok::comma)) {
732         Left->setType(TT_DesignatedInitializerLSquare);
733       } else if (IsCSharpAttributeSpecifier) {
734         Left->setType(TT_AttributeSquare);
735       } else if (CurrentToken->is(tok::r_square) && Parent &&
736                  Parent->is(TT_TemplateCloser)) {
737         Left->setType(TT_ArraySubscriptLSquare);
738       } else if (Style.isProto()) {
739         // Square braces in LK_Proto can either be message field attributes:
740         //
741         // optional Aaa aaa = 1 [
742         //   (aaa) = aaa
743         // ];
744         //
745         // extensions 123 [
746         //   (aaa) = aaa
747         // ];
748         //
749         // or text proto extensions (in options):
750         //
751         // option (Aaa.options) = {
752         //   [type.type/type] {
753         //     key: value
754         //   }
755         // }
756         //
757         // or repeated fields (in options):
758         //
759         // option (Aaa.options) = {
760         //   keys: [ 1, 2, 3 ]
761         // }
762         //
763         // In the first and the third case we want to spread the contents inside
764         // the square braces; in the second we want to keep them inline.
765         Left->setType(TT_ArrayInitializerLSquare);
766         if (!Left->endsSequence(tok::l_square, tok::numeric_constant,
767                                 tok::equal) &&
768             !Left->endsSequence(tok::l_square, tok::numeric_constant,
769                                 tok::identifier) &&
770             !Left->endsSequence(tok::l_square, tok::colon, TT_SelectorName)) {
771           Left->setType(TT_ProtoExtensionLSquare);
772           BindingIncrease = 10;
773         }
774       } else if (!CppArrayTemplates && Parent &&
775                  Parent->isOneOf(TT_BinaryOperator, TT_TemplateCloser, tok::at,
776                                  tok::comma, tok::l_paren, tok::l_square,
777                                  tok::question, tok::colon, tok::kw_return,
778                                  // Should only be relevant to JavaScript:
779                                  tok::kw_default)) {
780         Left->setType(TT_ArrayInitializerLSquare);
781       } else {
782         BindingIncrease = 10;
783         Left->setType(TT_ArraySubscriptLSquare);
784       }
785     }
786 
787     ScopedContextCreator ContextCreator(*this, tok::l_square, BindingIncrease);
788     Contexts.back().IsExpression = true;
789     if (Style.isJavaScript() && Parent && Parent->is(TT_JsTypeColon))
790       Contexts.back().IsExpression = false;
791 
792     Contexts.back().ColonIsObjCMethodExpr = StartsObjCMethodExpr;
793     Contexts.back().InCpp11AttributeSpecifier = IsCpp11AttributeSpecifier;
794     Contexts.back().InCSharpAttributeSpecifier = IsCSharpAttributeSpecifier;
795 
796     while (CurrentToken) {
797       if (CurrentToken->is(tok::r_square)) {
798         if (IsCpp11AttributeSpecifier) {
799           CurrentToken->setType(TT_AttributeSquare);
800           if (!IsInnerSquare)
801             CurrentToken->EndsCppAttributeGroup = true;
802         }
803         if (IsCSharpAttributeSpecifier) {
804           CurrentToken->setType(TT_AttributeSquare);
805         } else if (((CurrentToken->Next &&
806                      CurrentToken->Next->is(tok::l_paren)) ||
807                     (CurrentToken->Previous &&
808                      CurrentToken->Previous->Previous == Left)) &&
809                    Left->is(TT_ObjCMethodExpr)) {
810           // An ObjC method call is rarely followed by an open parenthesis. It
811           // also can't be composed of just one token, unless it's a macro that
812           // will be expanded to more tokens.
813           // FIXME: Do we incorrectly label ":" with this?
814           StartsObjCMethodExpr = false;
815           Left->setType(TT_Unknown);
816         }
817         if (StartsObjCMethodExpr && CurrentToken->Previous != Left) {
818           CurrentToken->setType(TT_ObjCMethodExpr);
819           // If we haven't seen a colon yet, make sure the last identifier
820           // before the r_square is tagged as a selector name component.
821           if (!ColonFound && CurrentToken->Previous &&
822               CurrentToken->Previous->is(TT_Unknown) &&
823               canBeObjCSelectorComponent(*CurrentToken->Previous)) {
824             CurrentToken->Previous->setType(TT_SelectorName);
825           }
826           // determineStarAmpUsage() thinks that '*' '[' is allocating an
827           // array of pointers, but if '[' starts a selector then '*' is a
828           // binary operator.
829           if (Parent && Parent->is(TT_PointerOrReference))
830             Parent->overwriteFixedType(TT_BinaryOperator);
831         }
832         Left->MatchingParen = CurrentToken;
833         CurrentToken->MatchingParen = Left;
834         // FirstObjCSelectorName is set when a colon is found. This does
835         // not work, however, when the method has no parameters.
836         // Here, we set FirstObjCSelectorName when the end of the method call is
837         // reached, in case it was not set already.
838         if (!Contexts.back().FirstObjCSelectorName) {
839           FormatToken *Previous = CurrentToken->getPreviousNonComment();
840           if (Previous && Previous->is(TT_SelectorName)) {
841             Previous->ObjCSelectorNameParts = 1;
842             Contexts.back().FirstObjCSelectorName = Previous;
843           }
844         } else {
845           Left->ParameterCount =
846               Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
847         }
848         if (Contexts.back().FirstObjCSelectorName) {
849           Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
850               Contexts.back().LongestObjCSelectorName;
851           if (Left->BlockParameterCount > 1)
852             Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 0;
853         }
854         if (Style.isTableGen() && Left->is(TT_TableGenListOpener))
855           CurrentToken->setType(TT_TableGenListCloser);
856         next();
857         return true;
858       }
859       if (CurrentToken->isOneOf(tok::r_paren, tok::r_brace))
860         return false;
861       if (CurrentToken->is(tok::colon)) {
862         if (IsCpp11AttributeSpecifier &&
863             CurrentToken->endsSequence(tok::colon, tok::identifier,
864                                        tok::kw_using)) {
865           // Remember that this is a [[using ns: foo]] C++ attribute, so we
866           // don't add a space before the colon (unlike other colons).
867           CurrentToken->setType(TT_AttributeColon);
868         } else if (!Style.isVerilog() && !Line.InPragmaDirective &&
869                    Left->isOneOf(TT_ArraySubscriptLSquare,
870                                  TT_DesignatedInitializerLSquare)) {
871           Left->setType(TT_ObjCMethodExpr);
872           StartsObjCMethodExpr = true;
873           Contexts.back().ColonIsObjCMethodExpr = true;
874           if (Parent && Parent->is(tok::r_paren)) {
875             // FIXME(bug 36976): ObjC return types shouldn't use TT_CastRParen.
876             Parent->setType(TT_CastRParen);
877           }
878         }
879         ColonFound = true;
880       }
881       if (CurrentToken->is(tok::comma) && Left->is(TT_ObjCMethodExpr) &&
882           !ColonFound) {
883         Left->setType(TT_ArrayInitializerLSquare);
884       }
885       FormatToken *Tok = CurrentToken;
886       if (Style.isTableGen()) {
887         if (CurrentToken->isOneOf(tok::comma, tok::minus, tok::ellipsis)) {
888           // '-' and '...' appears as a separator in slice.
889           next();
890         } else {
891           // In TableGen there must be a list of Values in square brackets.
892           // It must be ValueList or SliceElements.
893           if (!parseTableGenValue())
894             return false;
895         }
896         updateParameterCount(Left, Tok);
897         continue;
898       }
899       if (!consumeToken())
900         return false;
901       updateParameterCount(Left, Tok);
902     }
903     return false;
904   }
905 
skipToNextNonComment()906   void skipToNextNonComment() {
907     next();
908     while (CurrentToken && CurrentToken->is(tok::comment))
909       next();
910   }
911 
912   // Simplified parser for TableGen Value. Returns true on success.
913   // It consists of SimpleValues, SimpleValues with Suffixes, and Value followed
914   // by '#', paste operator.
915   // There also exists the case the Value is parsed as NameValue.
916   // In this case, the Value ends if '{' is found.
parseTableGenValue(bool ParseNameMode=false)917   bool parseTableGenValue(bool ParseNameMode = false) {
918     if (!CurrentToken)
919       return false;
920     while (CurrentToken->is(tok::comment))
921       next();
922     if (!parseTableGenSimpleValue())
923       return false;
924     if (!CurrentToken)
925       return true;
926     // Value "#" [Value]
927     if (CurrentToken->is(tok::hash)) {
928       if (CurrentToken->Next &&
929           CurrentToken->Next->isOneOf(tok::colon, tok::semi, tok::l_brace)) {
930         // Trailing paste operator.
931         // These are only the allowed cases in TGParser::ParseValue().
932         CurrentToken->setType(TT_TableGenTrailingPasteOperator);
933         next();
934         return true;
935       }
936       FormatToken *HashTok = CurrentToken;
937       skipToNextNonComment();
938       HashTok->setType(TT_Unknown);
939       if (!parseTableGenValue(ParseNameMode))
940         return false;
941       if (!CurrentToken)
942         return true;
943     }
944     // In name mode, '{' is regarded as the end of the value.
945     // See TGParser::ParseValue in TGParser.cpp
946     if (ParseNameMode && CurrentToken->is(tok::l_brace))
947       return true;
948     // These tokens indicates this is a value with suffixes.
949     if (CurrentToken->isOneOf(tok::l_brace, tok::l_square, tok::period)) {
950       CurrentToken->setType(TT_TableGenValueSuffix);
951       FormatToken *Suffix = CurrentToken;
952       skipToNextNonComment();
953       if (Suffix->is(tok::l_square))
954         return parseSquare();
955       if (Suffix->is(tok::l_brace)) {
956         Scopes.push_back(getScopeType(*Suffix));
957         return parseBrace();
958       }
959     }
960     return true;
961   }
962 
963   // TokVarName    ::=  "$" ualpha (ualpha |  "0"..."9")*
964   // Appears as a part of DagArg.
965   // This does not change the current token on fail.
tryToParseTableGenTokVar()966   bool tryToParseTableGenTokVar() {
967     if (!CurrentToken)
968       return false;
969     if (CurrentToken->is(tok::identifier) &&
970         CurrentToken->TokenText.front() == '$') {
971       skipToNextNonComment();
972       return true;
973     }
974     return false;
975   }
976 
977   // DagArg       ::=  Value [":" TokVarName] | TokVarName
978   // Appears as a part of SimpleValue6.
parseTableGenDAGArg(bool AlignColon=false)979   bool parseTableGenDAGArg(bool AlignColon = false) {
980     if (tryToParseTableGenTokVar())
981       return true;
982     if (parseTableGenValue()) {
983       if (CurrentToken && CurrentToken->is(tok::colon)) {
984         if (AlignColon)
985           CurrentToken->setType(TT_TableGenDAGArgListColonToAlign);
986         else
987           CurrentToken->setType(TT_TableGenDAGArgListColon);
988         skipToNextNonComment();
989         return tryToParseTableGenTokVar();
990       }
991       return true;
992     }
993     return false;
994   }
995 
996   // Judge if the token is a operator ID to insert line break in DAGArg.
997   // That is, TableGenBreakingDAGArgOperators is empty (by the definition of the
998   // option) or the token is in the list.
isTableGenDAGArgBreakingOperator(const FormatToken & Tok)999   bool isTableGenDAGArgBreakingOperator(const FormatToken &Tok) {
1000     auto &Opes = Style.TableGenBreakingDAGArgOperators;
1001     // If the list is empty, all operators are breaking operators.
1002     if (Opes.empty())
1003       return true;
1004     // Otherwise, the operator is limited to normal identifiers.
1005     if (Tok.isNot(tok::identifier) ||
1006         Tok.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator)) {
1007       return false;
1008     }
1009     // The case next is colon, it is not a operator of identifier.
1010     if (!Tok.Next || Tok.Next->is(tok::colon))
1011       return false;
1012     return llvm::is_contained(Opes, Tok.TokenText.str());
1013   }
1014 
1015   // SimpleValue6 ::=  "(" DagArg [DagArgList] ")"
1016   // This parses SimpleValue 6's inside part of "(" ")"
parseTableGenDAGArgAndList(FormatToken * Opener)1017   bool parseTableGenDAGArgAndList(FormatToken *Opener) {
1018     FormatToken *FirstTok = CurrentToken;
1019     if (!parseTableGenDAGArg())
1020       return false;
1021     bool BreakInside = false;
1022     if (Style.TableGenBreakInsideDAGArg != FormatStyle::DAS_DontBreak) {
1023       // Specialized detection for DAGArgOperator, that determines the way of
1024       // line break for this DAGArg elements.
1025       if (isTableGenDAGArgBreakingOperator(*FirstTok)) {
1026         // Special case for identifier DAGArg operator.
1027         BreakInside = true;
1028         Opener->setType(TT_TableGenDAGArgOpenerToBreak);
1029         if (FirstTok->isOneOf(TT_TableGenBangOperator,
1030                               TT_TableGenCondOperator)) {
1031           // Special case for bang/cond operators. Set the whole operator as
1032           // the DAGArg operator. Always break after it.
1033           CurrentToken->Previous->setType(TT_TableGenDAGArgOperatorToBreak);
1034         } else if (FirstTok->is(tok::identifier)) {
1035           if (Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakAll)
1036             FirstTok->setType(TT_TableGenDAGArgOperatorToBreak);
1037           else
1038             FirstTok->setType(TT_TableGenDAGArgOperatorID);
1039         }
1040       }
1041     }
1042     // Parse the [DagArgList] part
1043     bool FirstDAGArgListElm = true;
1044     while (CurrentToken) {
1045       if (!FirstDAGArgListElm && CurrentToken->is(tok::comma)) {
1046         CurrentToken->setType(BreakInside ? TT_TableGenDAGArgListCommaToBreak
1047                                           : TT_TableGenDAGArgListComma);
1048         skipToNextNonComment();
1049       }
1050       if (CurrentToken && CurrentToken->is(tok::r_paren)) {
1051         CurrentToken->setType(TT_TableGenDAGArgCloser);
1052         Opener->MatchingParen = CurrentToken;
1053         CurrentToken->MatchingParen = Opener;
1054         skipToNextNonComment();
1055         return true;
1056       }
1057       if (!parseTableGenDAGArg(
1058               BreakInside &&
1059               Style.AlignConsecutiveTableGenBreakingDAGArgColons.Enabled)) {
1060         return false;
1061       }
1062       FirstDAGArgListElm = false;
1063     }
1064     return false;
1065   }
1066 
parseTableGenSimpleValue()1067   bool parseTableGenSimpleValue() {
1068     assert(Style.isTableGen());
1069     if (!CurrentToken)
1070       return false;
1071     FormatToken *Tok = CurrentToken;
1072     skipToNextNonComment();
1073     // SimpleValue 1, 2, 3: Literals
1074     if (Tok->isOneOf(tok::numeric_constant, tok::string_literal,
1075                      TT_TableGenMultiLineString, tok::kw_true, tok::kw_false,
1076                      tok::question, tok::kw_int)) {
1077       return true;
1078     }
1079     // SimpleValue 4: ValueList, Type
1080     if (Tok->is(tok::l_brace)) {
1081       Scopes.push_back(getScopeType(*Tok));
1082       return parseBrace();
1083     }
1084     // SimpleValue 5: List initializer
1085     if (Tok->is(tok::l_square)) {
1086       Tok->setType(TT_TableGenListOpener);
1087       if (!parseSquare())
1088         return false;
1089       if (Tok->is(tok::less)) {
1090         CurrentToken->setType(TT_TemplateOpener);
1091         return parseAngle();
1092       }
1093       return true;
1094     }
1095     // SimpleValue 6: DAGArg [DAGArgList]
1096     // SimpleValue6 ::=  "(" DagArg [DagArgList] ")"
1097     if (Tok->is(tok::l_paren)) {
1098       Tok->setType(TT_TableGenDAGArgOpener);
1099       return parseTableGenDAGArgAndList(Tok);
1100     }
1101     // SimpleValue 9: Bang operator
1102     if (Tok->is(TT_TableGenBangOperator)) {
1103       if (CurrentToken && CurrentToken->is(tok::less)) {
1104         CurrentToken->setType(TT_TemplateOpener);
1105         skipToNextNonComment();
1106         if (!parseAngle())
1107           return false;
1108       }
1109       if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1110         return false;
1111       next();
1112       // FIXME: Hack using inheritance to child context
1113       Contexts.back().IsTableGenBangOpe = true;
1114       bool Result = parseParens();
1115       Contexts.back().IsTableGenBangOpe = false;
1116       return Result;
1117     }
1118     // SimpleValue 9: Cond operator
1119     if (Tok->is(TT_TableGenCondOperator)) {
1120       if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1121         return false;
1122       next();
1123       return parseParens();
1124     }
1125     // We have to check identifier at the last because the kind of bang/cond
1126     // operators are also identifier.
1127     // SimpleValue 7: Identifiers
1128     if (Tok->is(tok::identifier)) {
1129       // SimpleValue 8: Anonymous record
1130       if (CurrentToken && CurrentToken->is(tok::less)) {
1131         CurrentToken->setType(TT_TemplateOpener);
1132         skipToNextNonComment();
1133         return parseAngle();
1134       }
1135       return true;
1136     }
1137 
1138     return false;
1139   }
1140 
couldBeInStructArrayInitializer() const1141   bool couldBeInStructArrayInitializer() const {
1142     if (Contexts.size() < 2)
1143       return false;
1144     // We want to back up no more then 2 context levels i.e.
1145     // . { { <-
1146     const auto End = std::next(Contexts.rbegin(), 2);
1147     auto Last = Contexts.rbegin();
1148     unsigned Depth = 0;
1149     for (; Last != End; ++Last)
1150       if (Last->ContextKind == tok::l_brace)
1151         ++Depth;
1152     return Depth == 2 && Last->ContextKind != tok::l_brace;
1153   }
1154 
parseBrace()1155   bool parseBrace() {
1156     if (!CurrentToken)
1157       return true;
1158 
1159     assert(CurrentToken->Previous);
1160     FormatToken &OpeningBrace = *CurrentToken->Previous;
1161     assert(OpeningBrace.is(tok::l_brace));
1162     OpeningBrace.ParentBracket = Contexts.back().ContextKind;
1163 
1164     if (Contexts.back().CaretFound)
1165       OpeningBrace.overwriteFixedType(TT_ObjCBlockLBrace);
1166     Contexts.back().CaretFound = false;
1167 
1168     ScopedContextCreator ContextCreator(*this, tok::l_brace, 1);
1169     Contexts.back().ColonIsDictLiteral = true;
1170     if (OpeningBrace.is(BK_BracedInit))
1171       Contexts.back().IsExpression = true;
1172     if (Style.isJavaScript() && OpeningBrace.Previous &&
1173         OpeningBrace.Previous->is(TT_JsTypeColon)) {
1174       Contexts.back().IsExpression = false;
1175     }
1176     if (Style.isVerilog() &&
1177         (!OpeningBrace.getPreviousNonComment() ||
1178          OpeningBrace.getPreviousNonComment()->isNot(Keywords.kw_apostrophe))) {
1179       Contexts.back().VerilogMayBeConcatenation = true;
1180     }
1181     if (Style.isTableGen())
1182       Contexts.back().ColonIsDictLiteral = false;
1183 
1184     unsigned CommaCount = 0;
1185     while (CurrentToken) {
1186       if (CurrentToken->is(tok::r_brace)) {
1187         assert(!Scopes.empty());
1188         assert(Scopes.back() == getScopeType(OpeningBrace));
1189         Scopes.pop_back();
1190         assert(OpeningBrace.Optional == CurrentToken->Optional);
1191         OpeningBrace.MatchingParen = CurrentToken;
1192         CurrentToken->MatchingParen = &OpeningBrace;
1193         if (Style.AlignArrayOfStructures != FormatStyle::AIAS_None) {
1194           if (OpeningBrace.ParentBracket == tok::l_brace &&
1195               couldBeInStructArrayInitializer() && CommaCount > 0) {
1196             Contexts.back().ContextType = Context::StructArrayInitializer;
1197           }
1198         }
1199         next();
1200         return true;
1201       }
1202       if (CurrentToken->isOneOf(tok::r_paren, tok::r_square))
1203         return false;
1204       updateParameterCount(&OpeningBrace, CurrentToken);
1205       if (CurrentToken->isOneOf(tok::colon, tok::l_brace, tok::less)) {
1206         FormatToken *Previous = CurrentToken->getPreviousNonComment();
1207         if (Previous->is(TT_JsTypeOptionalQuestion))
1208           Previous = Previous->getPreviousNonComment();
1209         if ((CurrentToken->is(tok::colon) && !Style.isTableGen() &&
1210              (!Contexts.back().ColonIsDictLiteral || !IsCpp)) ||
1211             Style.isProto()) {
1212           OpeningBrace.setType(TT_DictLiteral);
1213           if (Previous->Tok.getIdentifierInfo() ||
1214               Previous->is(tok::string_literal)) {
1215             Previous->setType(TT_SelectorName);
1216           }
1217         }
1218         if (CurrentToken->is(tok::colon) && OpeningBrace.is(TT_Unknown) &&
1219             !Style.isTableGen()) {
1220           OpeningBrace.setType(TT_DictLiteral);
1221         } else if (Style.isJavaScript()) {
1222           OpeningBrace.overwriteFixedType(TT_DictLiteral);
1223         }
1224       }
1225       if (CurrentToken->is(tok::comma)) {
1226         if (Style.isJavaScript())
1227           OpeningBrace.overwriteFixedType(TT_DictLiteral);
1228         ++CommaCount;
1229       }
1230       if (!consumeToken())
1231         return false;
1232     }
1233     return true;
1234   }
1235 
updateParameterCount(FormatToken * Left,FormatToken * Current)1236   void updateParameterCount(FormatToken *Left, FormatToken *Current) {
1237     // For ObjC methods, the number of parameters is calculated differently as
1238     // method declarations have a different structure (the parameters are not
1239     // inside a bracket scope).
1240     if (Current->is(tok::l_brace) && Current->is(BK_Block))
1241       ++Left->BlockParameterCount;
1242     if (Current->is(tok::comma)) {
1243       ++Left->ParameterCount;
1244       if (!Left->Role)
1245         Left->Role.reset(new CommaSeparatedList(Style));
1246       Left->Role->CommaFound(Current);
1247     } else if (Left->ParameterCount == 0 && Current->isNot(tok::comment)) {
1248       Left->ParameterCount = 1;
1249     }
1250   }
1251 
parseConditional()1252   bool parseConditional() {
1253     while (CurrentToken) {
1254       if (CurrentToken->is(tok::colon) && CurrentToken->is(TT_Unknown)) {
1255         CurrentToken->setType(TT_ConditionalExpr);
1256         next();
1257         return true;
1258       }
1259       if (!consumeToken())
1260         return false;
1261     }
1262     return false;
1263   }
1264 
parseTemplateDeclaration()1265   bool parseTemplateDeclaration() {
1266     if (!CurrentToken || CurrentToken->isNot(tok::less))
1267       return false;
1268 
1269     CurrentToken->setType(TT_TemplateOpener);
1270     next();
1271 
1272     TemplateDeclarationDepth++;
1273     const bool WellFormed = parseAngle();
1274     TemplateDeclarationDepth--;
1275     if (!WellFormed)
1276       return false;
1277 
1278     if (CurrentToken && TemplateDeclarationDepth == 0)
1279       CurrentToken->Previous->ClosesTemplateDeclaration = true;
1280 
1281     return true;
1282   }
1283 
consumeToken()1284   bool consumeToken() {
1285     if (IsCpp) {
1286       const auto *Prev = CurrentToken->getPreviousNonComment();
1287       if (Prev && Prev->is(tok::r_square) && Prev->is(TT_AttributeSquare) &&
1288           CurrentToken->isOneOf(tok::kw_if, tok::kw_switch, tok::kw_case,
1289                                 tok::kw_default, tok::kw_for, tok::kw_while) &&
1290           mustBreakAfterAttributes(*CurrentToken, Style)) {
1291         CurrentToken->MustBreakBefore = true;
1292       }
1293     }
1294     FormatToken *Tok = CurrentToken;
1295     next();
1296     // In Verilog primitives' state tables, `:`, `?`, and `-` aren't normal
1297     // operators.
1298     if (Tok->is(TT_VerilogTableItem))
1299       return true;
1300     // Multi-line string itself is a single annotated token.
1301     if (Tok->is(TT_TableGenMultiLineString))
1302       return true;
1303     auto *Prev = Tok->getPreviousNonComment();
1304     auto *Next = Tok->getNextNonComment();
1305     switch (bool IsIf = false; Tok->Tok.getKind()) {
1306     case tok::plus:
1307     case tok::minus:
1308       if (!Prev && Line.MustBeDeclaration)
1309         Tok->setType(TT_ObjCMethodSpecifier);
1310       break;
1311     case tok::colon:
1312       if (!Prev)
1313         return false;
1314       // Goto labels and case labels are already identified in
1315       // UnwrappedLineParser.
1316       if (Tok->isTypeFinalized())
1317         break;
1318       // Colons from ?: are handled in parseConditional().
1319       if (Style.isJavaScript()) {
1320         if (Contexts.back().ColonIsForRangeExpr || // colon in for loop
1321             (Contexts.size() == 1 &&               // switch/case labels
1322              !Line.First->isOneOf(tok::kw_enum, tok::kw_case)) ||
1323             Contexts.back().ContextKind == tok::l_paren ||  // function params
1324             Contexts.back().ContextKind == tok::l_square || // array type
1325             (!Contexts.back().IsExpression &&
1326              Contexts.back().ContextKind == tok::l_brace) || // object type
1327             (Contexts.size() == 1 &&
1328              Line.MustBeDeclaration)) { // method/property declaration
1329           Contexts.back().IsExpression = false;
1330           Tok->setType(TT_JsTypeColon);
1331           break;
1332         }
1333       } else if (Style.isCSharp()) {
1334         if (Contexts.back().InCSharpAttributeSpecifier) {
1335           Tok->setType(TT_AttributeColon);
1336           break;
1337         }
1338         if (Contexts.back().ContextKind == tok::l_paren) {
1339           Tok->setType(TT_CSharpNamedArgumentColon);
1340           break;
1341         }
1342       } else if (Style.isVerilog() && Tok->isNot(TT_BinaryOperator)) {
1343         // The distribution weight operators are labeled
1344         // TT_BinaryOperator by the lexer.
1345         if (Keywords.isVerilogEnd(*Prev) || Keywords.isVerilogBegin(*Prev)) {
1346           Tok->setType(TT_VerilogBlockLabelColon);
1347         } else if (Contexts.back().ContextKind == tok::l_square) {
1348           Tok->setType(TT_BitFieldColon);
1349         } else if (Contexts.back().ColonIsDictLiteral) {
1350           Tok->setType(TT_DictLiteral);
1351         } else if (Contexts.size() == 1) {
1352           // In Verilog a case label doesn't have the case keyword. We
1353           // assume a colon following an expression is a case label.
1354           // Colons from ?: are annotated in parseConditional().
1355           Tok->setType(TT_CaseLabelColon);
1356           if (Line.Level > 1 || (!Line.InPPDirective && Line.Level > 0))
1357             --Line.Level;
1358         }
1359         break;
1360       }
1361       if (Line.First->isOneOf(Keywords.kw_module, Keywords.kw_import) ||
1362           Line.First->startsSequence(tok::kw_export, Keywords.kw_module) ||
1363           Line.First->startsSequence(tok::kw_export, Keywords.kw_import)) {
1364         Tok->setType(TT_ModulePartitionColon);
1365       } else if (Line.First->is(tok::kw_asm)) {
1366         Tok->setType(TT_InlineASMColon);
1367       } else if (Contexts.back().ColonIsDictLiteral || Style.isProto()) {
1368         Tok->setType(TT_DictLiteral);
1369         if (Style.isTextProto())
1370           Prev->setType(TT_SelectorName);
1371       } else if (Contexts.back().ColonIsObjCMethodExpr ||
1372                  Line.startsWith(TT_ObjCMethodSpecifier)) {
1373         Tok->setType(TT_ObjCMethodExpr);
1374         const auto *PrevPrev = Prev->Previous;
1375         // Ensure we tag all identifiers in method declarations as
1376         // TT_SelectorName.
1377         bool UnknownIdentifierInMethodDeclaration =
1378             Line.startsWith(TT_ObjCMethodSpecifier) &&
1379             Prev->is(tok::identifier) && Prev->is(TT_Unknown);
1380         if (!PrevPrev ||
1381             // FIXME(bug 36976): ObjC return types shouldn't use TT_CastRParen.
1382             !(PrevPrev->is(TT_CastRParen) ||
1383               (PrevPrev->is(TT_ObjCMethodExpr) && PrevPrev->is(tok::colon))) ||
1384             PrevPrev->is(tok::r_square) ||
1385             Contexts.back().LongestObjCSelectorName == 0 ||
1386             UnknownIdentifierInMethodDeclaration) {
1387           Prev->setType(TT_SelectorName);
1388           if (!Contexts.back().FirstObjCSelectorName)
1389             Contexts.back().FirstObjCSelectorName = Prev;
1390           else if (Prev->ColumnWidth > Contexts.back().LongestObjCSelectorName)
1391             Contexts.back().LongestObjCSelectorName = Prev->ColumnWidth;
1392           Prev->ParameterIndex =
1393               Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
1394           ++Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
1395         }
1396       } else if (Contexts.back().ColonIsForRangeExpr) {
1397         Tok->setType(TT_RangeBasedForLoopColon);
1398         for (auto *Token = Prev;
1399              Token && !Token->isOneOf(tok::semi, tok::l_paren);
1400              Token = Token->Previous) {
1401           if (Token->isPointerOrReference())
1402             Token->setFinalizedType(TT_PointerOrReference);
1403         }
1404       } else if (Contexts.back().ContextType == Context::C11GenericSelection) {
1405         Tok->setType(TT_GenericSelectionColon);
1406         if (Prev->isPointerOrReference())
1407           Prev->setFinalizedType(TT_PointerOrReference);
1408       } else if ((CurrentToken && CurrentToken->is(tok::numeric_constant)) ||
1409                  (Prev->is(TT_StartOfName) && !Scopes.empty() &&
1410                   Scopes.back() == ST_Class)) {
1411         Tok->setType(TT_BitFieldColon);
1412       } else if (Contexts.size() == 1 &&
1413                  !Line.getFirstNonComment()->isOneOf(tok::kw_enum, tok::kw_case,
1414                                                      tok::kw_default) &&
1415                  !Line.startsWith(tok::kw_typedef, tok::kw_enum)) {
1416         if (Prev->isOneOf(tok::r_paren, tok::kw_noexcept) ||
1417             Prev->ClosesRequiresClause) {
1418           Tok->setType(TT_CtorInitializerColon);
1419         } else if (Prev->is(tok::kw_try)) {
1420           // Member initializer list within function try block.
1421           FormatToken *PrevPrev = Prev->getPreviousNonComment();
1422           if (!PrevPrev)
1423             break;
1424           if (PrevPrev && PrevPrev->isOneOf(tok::r_paren, tok::kw_noexcept))
1425             Tok->setType(TT_CtorInitializerColon);
1426         } else {
1427           Tok->setType(TT_InheritanceColon);
1428           if (Prev->isAccessSpecifierKeyword())
1429             Line.Type = LT_AccessModifier;
1430         }
1431       } else if (canBeObjCSelectorComponent(*Prev) && Next &&
1432                  (Next->isOneOf(tok::r_paren, tok::comma) ||
1433                   (canBeObjCSelectorComponent(*Next) && Next->Next &&
1434                    Next->Next->is(tok::colon)))) {
1435         // This handles a special macro in ObjC code where selectors including
1436         // the colon are passed as macro arguments.
1437         Tok->setType(TT_ObjCMethodExpr);
1438       }
1439       break;
1440     case tok::pipe:
1441     case tok::amp:
1442       // | and & in declarations/type expressions represent union and
1443       // intersection types, respectively.
1444       if (Style.isJavaScript() && !Contexts.back().IsExpression)
1445         Tok->setType(TT_JsTypeOperator);
1446       break;
1447     case tok::kw_if:
1448       if (Style.isTableGen()) {
1449         // In TableGen it has the form 'if' <value> 'then'.
1450         if (!parseTableGenValue())
1451           return false;
1452         if (CurrentToken && CurrentToken->is(Keywords.kw_then))
1453           next(); // skip then
1454         break;
1455       }
1456       if (CurrentToken &&
1457           CurrentToken->isOneOf(tok::kw_constexpr, tok::identifier)) {
1458         next();
1459       }
1460       IsIf = true;
1461       [[fallthrough]];
1462     case tok::kw_while:
1463       if (CurrentToken && CurrentToken->is(tok::l_paren)) {
1464         next();
1465         if (!parseParens(IsIf))
1466           return false;
1467       }
1468       break;
1469     case tok::kw_for:
1470       if (Style.isJavaScript()) {
1471         // x.for and {for: ...}
1472         if ((Prev && Prev->is(tok::period)) || (Next && Next->is(tok::colon)))
1473           break;
1474         // JS' for await ( ...
1475         if (CurrentToken && CurrentToken->is(Keywords.kw_await))
1476           next();
1477       }
1478       if (IsCpp && CurrentToken && CurrentToken->is(tok::kw_co_await))
1479         next();
1480       Contexts.back().ColonIsForRangeExpr = true;
1481       if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1482         return false;
1483       next();
1484       if (!parseParens())
1485         return false;
1486       break;
1487     case tok::l_paren:
1488       // When faced with 'operator()()', the kw_operator handler incorrectly
1489       // marks the first l_paren as a OverloadedOperatorLParen. Here, we make
1490       // the first two parens OverloadedOperators and the second l_paren an
1491       // OverloadedOperatorLParen.
1492       if (Prev && Prev->is(tok::r_paren) && Prev->MatchingParen &&
1493           Prev->MatchingParen->is(TT_OverloadedOperatorLParen)) {
1494         Prev->setType(TT_OverloadedOperator);
1495         Prev->MatchingParen->setType(TT_OverloadedOperator);
1496         Tok->setType(TT_OverloadedOperatorLParen);
1497       }
1498 
1499       if (Style.isVerilog()) {
1500         // Identify the parameter list and port list in a module instantiation.
1501         // This is still needed when we already have
1502         // UnwrappedLineParser::parseVerilogHierarchyHeader because that
1503         // function is only responsible for the definition, not the
1504         // instantiation.
1505         auto IsInstancePort = [&]() {
1506           const FormatToken *PrevPrev;
1507           // In the following example all 4 left parentheses will be treated as
1508           // 'TT_VerilogInstancePortLParen'.
1509           //
1510           //   module_x instance_1(port_1); // Case A.
1511           //   module_x #(parameter_1)      // Case B.
1512           //       instance_2(port_1),      // Case C.
1513           //       instance_3(port_1);      // Case D.
1514           if (!Prev || !(PrevPrev = Prev->getPreviousNonComment()))
1515             return false;
1516           // Case A.
1517           if (Keywords.isVerilogIdentifier(*Prev) &&
1518               Keywords.isVerilogIdentifier(*PrevPrev)) {
1519             return true;
1520           }
1521           // Case B.
1522           if (Prev->is(Keywords.kw_verilogHash) &&
1523               Keywords.isVerilogIdentifier(*PrevPrev)) {
1524             return true;
1525           }
1526           // Case C.
1527           if (Keywords.isVerilogIdentifier(*Prev) && PrevPrev->is(tok::r_paren))
1528             return true;
1529           // Case D.
1530           if (Keywords.isVerilogIdentifier(*Prev) && PrevPrev->is(tok::comma)) {
1531             const FormatToken *PrevParen = PrevPrev->getPreviousNonComment();
1532             if (PrevParen && PrevParen->is(tok::r_paren) &&
1533                 PrevParen->MatchingParen &&
1534                 PrevParen->MatchingParen->is(TT_VerilogInstancePortLParen)) {
1535               return true;
1536             }
1537           }
1538           return false;
1539         };
1540 
1541         if (IsInstancePort())
1542           Tok->setType(TT_VerilogInstancePortLParen);
1543       }
1544 
1545       if (!parseParens())
1546         return false;
1547       if (Line.MustBeDeclaration && Contexts.size() == 1 &&
1548           !Contexts.back().IsExpression && !Line.startsWith(TT_ObjCProperty) &&
1549           !Line.startsWith(tok::l_paren) &&
1550           !Tok->isOneOf(TT_TypeDeclarationParen, TT_RequiresExpressionLParen)) {
1551         if (!Prev ||
1552             (!Prev->isAttribute() &&
1553              !Prev->isOneOf(TT_RequiresClause, TT_LeadingJavaAnnotation,
1554                             TT_BinaryOperator))) {
1555           Line.MightBeFunctionDecl = true;
1556           Tok->MightBeFunctionDeclParen = true;
1557         }
1558       }
1559       break;
1560     case tok::l_square:
1561       if (Style.isTableGen())
1562         Tok->setType(TT_TableGenListOpener);
1563       if (!parseSquare())
1564         return false;
1565       break;
1566     case tok::l_brace:
1567       if (IsCpp) {
1568         if (Tok->is(TT_RequiresExpressionLBrace))
1569           Line.Type = LT_RequiresExpression;
1570       } else if (Style.isTextProto()) {
1571         if (Prev && Prev->isNot(TT_DictLiteral))
1572           Prev->setType(TT_SelectorName);
1573       }
1574       Scopes.push_back(getScopeType(*Tok));
1575       if (!parseBrace())
1576         return false;
1577       break;
1578     case tok::less:
1579       if (parseAngle()) {
1580         Tok->setType(TT_TemplateOpener);
1581         // In TT_Proto, we must distignuish between:
1582         //   map<key, value>
1583         //   msg < item: data >
1584         //   msg: < item: data >
1585         // In TT_TextProto, map<key, value> does not occur.
1586         if (Style.isTextProto() ||
1587             (Style.Language == FormatStyle::LK_Proto && Prev &&
1588              Prev->isOneOf(TT_SelectorName, TT_DictLiteral))) {
1589           Tok->setType(TT_DictLiteral);
1590           if (Prev && Prev->isNot(TT_DictLiteral))
1591             Prev->setType(TT_SelectorName);
1592         }
1593         if (Style.isTableGen())
1594           Tok->setType(TT_TemplateOpener);
1595       } else {
1596         Tok->setType(TT_BinaryOperator);
1597         NonTemplateLess.insert(Tok);
1598         CurrentToken = Tok;
1599         next();
1600       }
1601       break;
1602     case tok::r_paren:
1603     case tok::r_square:
1604       return false;
1605     case tok::r_brace:
1606       // Don't pop scope when encountering unbalanced r_brace.
1607       if (!Scopes.empty())
1608         Scopes.pop_back();
1609       // Lines can start with '}'.
1610       if (Prev)
1611         return false;
1612       break;
1613     case tok::greater:
1614       if (!Style.isTextProto() && Tok->is(TT_Unknown))
1615         Tok->setType(TT_BinaryOperator);
1616       if (Prev && Prev->is(TT_TemplateCloser))
1617         Tok->SpacesRequiredBefore = 1;
1618       break;
1619     case tok::kw_operator:
1620       if (Style.isProto())
1621         break;
1622       // Handle C++ user-defined conversion function.
1623       if (IsCpp && CurrentToken) {
1624         const auto *Info = CurrentToken->Tok.getIdentifierInfo();
1625         // What follows Tok is an identifier or a non-operator keyword.
1626         if (Info && !(CurrentToken->isPlacementOperator() ||
1627                       CurrentToken->is(tok::kw_co_await) ||
1628                       Info->isCPlusPlusOperatorKeyword())) {
1629           FormatToken *LParen;
1630           if (CurrentToken->startsSequence(tok::kw_decltype, tok::l_paren,
1631                                            tok::kw_auto, tok::r_paren)) {
1632             // Skip `decltype(auto)`.
1633             LParen = CurrentToken->Next->Next->Next->Next;
1634           } else {
1635             // Skip to l_paren.
1636             for (LParen = CurrentToken->Next;
1637                  LParen && LParen->isNot(tok::l_paren); LParen = LParen->Next) {
1638               if (LParen->isPointerOrReference())
1639                 LParen->setFinalizedType(TT_PointerOrReference);
1640             }
1641           }
1642           if (LParen && LParen->is(tok::l_paren)) {
1643             if (!Contexts.back().IsExpression) {
1644               Tok->setFinalizedType(TT_FunctionDeclarationName);
1645               LParen->setFinalizedType(TT_FunctionDeclarationLParen);
1646             }
1647             break;
1648           }
1649         }
1650       }
1651       while (CurrentToken &&
1652              !CurrentToken->isOneOf(tok::l_paren, tok::semi, tok::r_paren)) {
1653         if (CurrentToken->isOneOf(tok::star, tok::amp))
1654           CurrentToken->setType(TT_PointerOrReference);
1655         auto Next = CurrentToken->getNextNonComment();
1656         if (!Next)
1657           break;
1658         if (Next->is(tok::less))
1659           next();
1660         else
1661           consumeToken();
1662         if (!CurrentToken)
1663           break;
1664         auto Previous = CurrentToken->getPreviousNonComment();
1665         assert(Previous);
1666         if (CurrentToken->is(tok::comma) && Previous->isNot(tok::kw_operator))
1667           break;
1668         if (Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator, tok::comma,
1669                               tok::arrow) ||
1670             Previous->isPointerOrReference() ||
1671             // User defined literal.
1672             Previous->TokenText.starts_with("\"\"")) {
1673           Previous->setType(TT_OverloadedOperator);
1674           if (CurrentToken->isOneOf(tok::less, tok::greater))
1675             break;
1676         }
1677       }
1678       if (CurrentToken && CurrentToken->is(tok::l_paren))
1679         CurrentToken->setType(TT_OverloadedOperatorLParen);
1680       if (CurrentToken && CurrentToken->Previous->is(TT_BinaryOperator))
1681         CurrentToken->Previous->setType(TT_OverloadedOperator);
1682       break;
1683     case tok::question:
1684       if (Style.isJavaScript() && Next &&
1685           Next->isOneOf(tok::semi, tok::comma, tok::colon, tok::r_paren,
1686                         tok::r_brace, tok::r_square)) {
1687         // Question marks before semicolons, colons, etc. indicate optional
1688         // types (fields, parameters), e.g.
1689         //   function(x?: string, y?) {...}
1690         //   class X { y?; }
1691         Tok->setType(TT_JsTypeOptionalQuestion);
1692         break;
1693       }
1694       // Declarations cannot be conditional expressions, this can only be part
1695       // of a type declaration.
1696       if (Line.MustBeDeclaration && !Contexts.back().IsExpression &&
1697           Style.isJavaScript()) {
1698         break;
1699       }
1700       if (Style.isCSharp()) {
1701         // `Type?)`, `Type?>`, `Type? name;`, and `Type? name =` can only be
1702         // nullable types.
1703         if (Next && (Next->isOneOf(tok::r_paren, tok::greater) ||
1704                      Next->startsSequence(tok::identifier, tok::semi) ||
1705                      Next->startsSequence(tok::identifier, tok::equal))) {
1706           Tok->setType(TT_CSharpNullable);
1707           break;
1708         }
1709 
1710         // Line.MustBeDeclaration will be true for `Type? name;`.
1711         // But not
1712         // cond ? "A" : "B";
1713         // cond ? id : "B";
1714         // cond ? cond2 ? "A" : "B" : "C";
1715         if (!Contexts.back().IsExpression && Line.MustBeDeclaration &&
1716             (!Next || !Next->isOneOf(tok::identifier, tok::string_literal) ||
1717              !Next->Next || !Next->Next->isOneOf(tok::colon, tok::question))) {
1718           Tok->setType(TT_CSharpNullable);
1719           break;
1720         }
1721       }
1722       parseConditional();
1723       break;
1724     case tok::kw_template:
1725       parseTemplateDeclaration();
1726       break;
1727     case tok::comma:
1728       switch (Contexts.back().ContextType) {
1729       case Context::CtorInitializer:
1730         Tok->setType(TT_CtorInitializerComma);
1731         break;
1732       case Context::InheritanceList:
1733         Tok->setType(TT_InheritanceComma);
1734         break;
1735       case Context::VerilogInstancePortList:
1736         Tok->setType(TT_VerilogInstancePortComma);
1737         break;
1738       default:
1739         if (Style.isVerilog() && Contexts.size() == 1 &&
1740             Line.startsWith(Keywords.kw_assign)) {
1741           Tok->setFinalizedType(TT_VerilogAssignComma);
1742         } else if (Contexts.back().FirstStartOfName &&
1743                    (Contexts.size() == 1 || startsWithInitStatement(Line))) {
1744           Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true;
1745           Line.IsMultiVariableDeclStmt = true;
1746         }
1747         break;
1748       }
1749       if (Contexts.back().ContextType == Context::ForEachMacro)
1750         Contexts.back().IsExpression = true;
1751       break;
1752     case tok::kw_default:
1753       // Unindent case labels.
1754       if (Style.isVerilog() && Keywords.isVerilogEndOfLabel(*Tok) &&
1755           (Line.Level > 1 || (!Line.InPPDirective && Line.Level > 0))) {
1756         --Line.Level;
1757       }
1758       break;
1759     case tok::identifier:
1760       if (Tok->isOneOf(Keywords.kw___has_include,
1761                        Keywords.kw___has_include_next)) {
1762         parseHasInclude();
1763       }
1764       if (IsCpp) {
1765         if (Next && Next->is(tok::l_paren) && Prev &&
1766             Prev->isOneOf(tok::kw___cdecl, tok::kw___stdcall,
1767                           tok::kw___fastcall, tok::kw___thiscall,
1768                           tok::kw___regcall, tok::kw___vectorcall)) {
1769           Tok->setFinalizedType(TT_FunctionDeclarationName);
1770           Next->setFinalizedType(TT_FunctionDeclarationLParen);
1771         }
1772       } else if (Style.isCSharp()) {
1773         if (Tok->is(Keywords.kw_where) && Next && Next->isNot(tok::l_paren)) {
1774           Tok->setType(TT_CSharpGenericTypeConstraint);
1775           parseCSharpGenericTypeConstraint();
1776           if (!Prev)
1777             Line.IsContinuation = true;
1778         }
1779       } else if (Style.isTableGen()) {
1780         if (Tok->is(Keywords.kw_assert)) {
1781           if (!parseTableGenValue())
1782             return false;
1783         } else if (Tok->isOneOf(Keywords.kw_def, Keywords.kw_defm) &&
1784                    (!Next || !Next->isOneOf(tok::colon, tok::l_brace))) {
1785           // The case NameValue appears.
1786           if (!parseTableGenValue(true))
1787             return false;
1788         }
1789       }
1790       break;
1791     case tok::arrow:
1792       if (Tok->isNot(TT_LambdaArrow) && Prev && Prev->is(tok::kw_noexcept))
1793         Tok->setType(TT_TrailingReturnArrow);
1794       break;
1795     case tok::equal:
1796       // In TableGen, there must be a value after "=";
1797       if (Style.isTableGen() && !parseTableGenValue())
1798         return false;
1799       break;
1800     default:
1801       break;
1802     }
1803     return true;
1804   }
1805 
parseCSharpGenericTypeConstraint()1806   void parseCSharpGenericTypeConstraint() {
1807     int OpenAngleBracketsCount = 0;
1808     while (CurrentToken) {
1809       if (CurrentToken->is(tok::less)) {
1810         // parseAngle is too greedy and will consume the whole line.
1811         CurrentToken->setType(TT_TemplateOpener);
1812         ++OpenAngleBracketsCount;
1813         next();
1814       } else if (CurrentToken->is(tok::greater)) {
1815         CurrentToken->setType(TT_TemplateCloser);
1816         --OpenAngleBracketsCount;
1817         next();
1818       } else if (CurrentToken->is(tok::comma) && OpenAngleBracketsCount == 0) {
1819         // We allow line breaks after GenericTypeConstraintComma's
1820         // so do not flag commas in Generics as GenericTypeConstraintComma's.
1821         CurrentToken->setType(TT_CSharpGenericTypeConstraintComma);
1822         next();
1823       } else if (CurrentToken->is(Keywords.kw_where)) {
1824         CurrentToken->setType(TT_CSharpGenericTypeConstraint);
1825         next();
1826       } else if (CurrentToken->is(tok::colon)) {
1827         CurrentToken->setType(TT_CSharpGenericTypeConstraintColon);
1828         next();
1829       } else {
1830         next();
1831       }
1832     }
1833   }
1834 
parseIncludeDirective()1835   void parseIncludeDirective() {
1836     if (CurrentToken && CurrentToken->is(tok::less)) {
1837       next();
1838       while (CurrentToken) {
1839         // Mark tokens up to the trailing line comments as implicit string
1840         // literals.
1841         if (CurrentToken->isNot(tok::comment) &&
1842             !CurrentToken->TokenText.starts_with("//")) {
1843           CurrentToken->setType(TT_ImplicitStringLiteral);
1844         }
1845         next();
1846       }
1847     }
1848   }
1849 
parseWarningOrError()1850   void parseWarningOrError() {
1851     next();
1852     // We still want to format the whitespace left of the first token of the
1853     // warning or error.
1854     next();
1855     while (CurrentToken) {
1856       CurrentToken->setType(TT_ImplicitStringLiteral);
1857       next();
1858     }
1859   }
1860 
parsePragma()1861   void parsePragma() {
1862     next(); // Consume "pragma".
1863     if (CurrentToken &&
1864         CurrentToken->isOneOf(Keywords.kw_mark, Keywords.kw_option,
1865                               Keywords.kw_region)) {
1866       bool IsMarkOrRegion =
1867           CurrentToken->isOneOf(Keywords.kw_mark, Keywords.kw_region);
1868       next();
1869       next(); // Consume first token (so we fix leading whitespace).
1870       while (CurrentToken) {
1871         if (IsMarkOrRegion || CurrentToken->Previous->is(TT_BinaryOperator))
1872           CurrentToken->setType(TT_ImplicitStringLiteral);
1873         next();
1874       }
1875     }
1876   }
1877 
parseHasInclude()1878   void parseHasInclude() {
1879     if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1880       return;
1881     next(); // '('
1882     parseIncludeDirective();
1883     next(); // ')'
1884   }
1885 
parsePreprocessorDirective()1886   LineType parsePreprocessorDirective() {
1887     bool IsFirstToken = CurrentToken->IsFirst;
1888     LineType Type = LT_PreprocessorDirective;
1889     next();
1890     if (!CurrentToken)
1891       return Type;
1892 
1893     if (Style.isJavaScript() && IsFirstToken) {
1894       // JavaScript files can contain shebang lines of the form:
1895       // #!/usr/bin/env node
1896       // Treat these like C++ #include directives.
1897       while (CurrentToken) {
1898         // Tokens cannot be comments here.
1899         CurrentToken->setType(TT_ImplicitStringLiteral);
1900         next();
1901       }
1902       return LT_ImportStatement;
1903     }
1904 
1905     if (CurrentToken->is(tok::numeric_constant)) {
1906       CurrentToken->SpacesRequiredBefore = 1;
1907       return Type;
1908     }
1909     // Hashes in the middle of a line can lead to any strange token
1910     // sequence.
1911     if (!CurrentToken->Tok.getIdentifierInfo())
1912       return Type;
1913     // In Verilog macro expansions start with a backtick just like preprocessor
1914     // directives. Thus we stop if the word is not a preprocessor directive.
1915     if (Style.isVerilog() && !Keywords.isVerilogPPDirective(*CurrentToken))
1916       return LT_Invalid;
1917     switch (CurrentToken->Tok.getIdentifierInfo()->getPPKeywordID()) {
1918     case tok::pp_include:
1919     case tok::pp_include_next:
1920     case tok::pp_import:
1921       next();
1922       parseIncludeDirective();
1923       Type = LT_ImportStatement;
1924       break;
1925     case tok::pp_error:
1926     case tok::pp_warning:
1927       parseWarningOrError();
1928       break;
1929     case tok::pp_pragma:
1930       parsePragma();
1931       break;
1932     case tok::pp_if:
1933     case tok::pp_elif:
1934       Contexts.back().IsExpression = true;
1935       next();
1936       if (CurrentToken)
1937         CurrentToken->SpacesRequiredBefore = true;
1938       parseLine();
1939       break;
1940     default:
1941       break;
1942     }
1943     while (CurrentToken) {
1944       FormatToken *Tok = CurrentToken;
1945       next();
1946       if (Tok->is(tok::l_paren)) {
1947         parseParens();
1948       } else if (Tok->isOneOf(Keywords.kw___has_include,
1949                               Keywords.kw___has_include_next)) {
1950         parseHasInclude();
1951       }
1952     }
1953     return Type;
1954   }
1955 
1956 public:
parseLine()1957   LineType parseLine() {
1958     if (!CurrentToken)
1959       return LT_Invalid;
1960     NonTemplateLess.clear();
1961     if (!Line.InMacroBody && CurrentToken->is(tok::hash)) {
1962       // We were not yet allowed to use C++17 optional when this was being
1963       // written. So we used LT_Invalid to mark that the line is not a
1964       // preprocessor directive.
1965       auto Type = parsePreprocessorDirective();
1966       if (Type != LT_Invalid)
1967         return Type;
1968     }
1969 
1970     // Directly allow to 'import <string-literal>' to support protocol buffer
1971     // definitions (github.com/google/protobuf) or missing "#" (either way we
1972     // should not break the line).
1973     IdentifierInfo *Info = CurrentToken->Tok.getIdentifierInfo();
1974     if ((Style.isJava() && CurrentToken->is(Keywords.kw_package)) ||
1975         (!Style.isVerilog() && Info &&
1976          Info->getPPKeywordID() == tok::pp_import && CurrentToken->Next &&
1977          CurrentToken->Next->isOneOf(tok::string_literal, tok::identifier,
1978                                      tok::kw_static))) {
1979       next();
1980       parseIncludeDirective();
1981       return LT_ImportStatement;
1982     }
1983 
1984     // If this line starts and ends in '<' and '>', respectively, it is likely
1985     // part of "#define <a/b.h>".
1986     if (CurrentToken->is(tok::less) && Line.Last->is(tok::greater)) {
1987       parseIncludeDirective();
1988       return LT_ImportStatement;
1989     }
1990 
1991     // In .proto files, top-level options and package statements are very
1992     // similar to import statements and should not be line-wrapped.
1993     if (Style.Language == FormatStyle::LK_Proto && Line.Level == 0 &&
1994         CurrentToken->isOneOf(Keywords.kw_option, Keywords.kw_package)) {
1995       next();
1996       if (CurrentToken && CurrentToken->is(tok::identifier)) {
1997         while (CurrentToken)
1998           next();
1999         return LT_ImportStatement;
2000       }
2001     }
2002 
2003     bool KeywordVirtualFound = false;
2004     bool ImportStatement = false;
2005 
2006     // import {...} from '...';
2007     if (Style.isJavaScript() && CurrentToken->is(Keywords.kw_import))
2008       ImportStatement = true;
2009 
2010     while (CurrentToken) {
2011       if (CurrentToken->is(tok::kw_virtual))
2012         KeywordVirtualFound = true;
2013       if (Style.isJavaScript()) {
2014         // export {...} from '...';
2015         // An export followed by "from 'some string';" is a re-export from
2016         // another module identified by a URI and is treated as a
2017         // LT_ImportStatement (i.e. prevent wraps on it for long URIs).
2018         // Just "export {...};" or "export class ..." should not be treated as
2019         // an import in this sense.
2020         if (Line.First->is(tok::kw_export) &&
2021             CurrentToken->is(Keywords.kw_from) && CurrentToken->Next &&
2022             CurrentToken->Next->isStringLiteral()) {
2023           ImportStatement = true;
2024         }
2025         if (isClosureImportStatement(*CurrentToken))
2026           ImportStatement = true;
2027       }
2028       if (!consumeToken())
2029         return LT_Invalid;
2030     }
2031     if (const auto Type = Line.Type; Type == LT_AccessModifier ||
2032                                      Type == LT_RequiresExpression ||
2033                                      Type == LT_SimpleRequirement) {
2034       return Type;
2035     }
2036     if (KeywordVirtualFound)
2037       return LT_VirtualFunctionDecl;
2038     if (ImportStatement)
2039       return LT_ImportStatement;
2040 
2041     if (Line.startsWith(TT_ObjCMethodSpecifier)) {
2042       if (Contexts.back().FirstObjCSelectorName) {
2043         Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
2044             Contexts.back().LongestObjCSelectorName;
2045       }
2046       return LT_ObjCMethodDecl;
2047     }
2048 
2049     for (const auto &ctx : Contexts)
2050       if (ctx.ContextType == Context::StructArrayInitializer)
2051         return LT_ArrayOfStructInitializer;
2052 
2053     return LT_Other;
2054   }
2055 
2056 private:
isClosureImportStatement(const FormatToken & Tok)2057   bool isClosureImportStatement(const FormatToken &Tok) {
2058     // FIXME: Closure-library specific stuff should not be hard-coded but be
2059     // configurable.
2060     return Tok.TokenText == "goog" && Tok.Next && Tok.Next->is(tok::period) &&
2061            Tok.Next->Next &&
2062            (Tok.Next->Next->TokenText == "module" ||
2063             Tok.Next->Next->TokenText == "provide" ||
2064             Tok.Next->Next->TokenText == "require" ||
2065             Tok.Next->Next->TokenText == "requireType" ||
2066             Tok.Next->Next->TokenText == "forwardDeclare") &&
2067            Tok.Next->Next->Next && Tok.Next->Next->Next->is(tok::l_paren);
2068   }
2069 
resetTokenMetadata()2070   void resetTokenMetadata() {
2071     if (!CurrentToken)
2072       return;
2073 
2074     // Reset token type in case we have already looked at it and then
2075     // recovered from an error (e.g. failure to find the matching >).
2076     if (!CurrentToken->isTypeFinalized() &&
2077         !CurrentToken->isOneOf(
2078             TT_LambdaLSquare, TT_LambdaLBrace, TT_AttributeMacro, TT_IfMacro,
2079             TT_ForEachMacro, TT_TypenameMacro, TT_FunctionLBrace,
2080             TT_ImplicitStringLiteral, TT_InlineASMBrace, TT_FatArrow,
2081             TT_LambdaArrow, TT_NamespaceMacro, TT_OverloadedOperator,
2082             TT_RegexLiteral, TT_TemplateString, TT_ObjCStringLiteral,
2083             TT_UntouchableMacroFunc, TT_StatementAttributeLikeMacro,
2084             TT_FunctionLikeOrFreestandingMacro, TT_ClassLBrace, TT_EnumLBrace,
2085             TT_RecordLBrace, TT_StructLBrace, TT_UnionLBrace, TT_RequiresClause,
2086             TT_RequiresClauseInARequiresExpression, TT_RequiresExpression,
2087             TT_RequiresExpressionLParen, TT_RequiresExpressionLBrace,
2088             TT_CompoundRequirementLBrace, TT_BracedListLBrace,
2089             TT_FunctionLikeMacro)) {
2090       CurrentToken->setType(TT_Unknown);
2091     }
2092     CurrentToken->Role.reset();
2093     CurrentToken->MatchingParen = nullptr;
2094     CurrentToken->FakeLParens.clear();
2095     CurrentToken->FakeRParens = 0;
2096   }
2097 
next()2098   void next() {
2099     if (!CurrentToken)
2100       return;
2101 
2102     CurrentToken->NestingLevel = Contexts.size() - 1;
2103     CurrentToken->BindingStrength = Contexts.back().BindingStrength;
2104     modifyContext(*CurrentToken);
2105     determineTokenType(*CurrentToken);
2106     CurrentToken = CurrentToken->Next;
2107 
2108     resetTokenMetadata();
2109   }
2110 
2111   /// A struct to hold information valid in a specific context, e.g.
2112   /// a pair of parenthesis.
2113   struct Context {
Contextclang::format::__anonadd98d890111::AnnotatingParser::Context2114     Context(tok::TokenKind ContextKind, unsigned BindingStrength,
2115             bool IsExpression)
2116         : ContextKind(ContextKind), BindingStrength(BindingStrength),
2117           IsExpression(IsExpression) {}
2118 
2119     tok::TokenKind ContextKind;
2120     unsigned BindingStrength;
2121     bool IsExpression;
2122     unsigned LongestObjCSelectorName = 0;
2123     bool ColonIsForRangeExpr = false;
2124     bool ColonIsDictLiteral = false;
2125     bool ColonIsObjCMethodExpr = false;
2126     FormatToken *FirstObjCSelectorName = nullptr;
2127     FormatToken *FirstStartOfName = nullptr;
2128     bool CanBeExpression = true;
2129     bool CaretFound = false;
2130     bool InCpp11AttributeSpecifier = false;
2131     bool InCSharpAttributeSpecifier = false;
2132     bool VerilogAssignmentFound = false;
2133     // Whether the braces may mean concatenation instead of structure or array
2134     // literal.
2135     bool VerilogMayBeConcatenation = false;
2136     bool IsTableGenDAGArg = false;
2137     bool IsTableGenBangOpe = false;
2138     bool IsTableGenCondOpe = false;
2139     enum {
2140       Unknown,
2141       // Like the part after `:` in a constructor.
2142       //   Context(...) : IsExpression(IsExpression)
2143       CtorInitializer,
2144       // Like in the parentheses in a foreach.
2145       ForEachMacro,
2146       // Like the inheritance list in a class declaration.
2147       //   class Input : public IO
2148       InheritanceList,
2149       // Like in the braced list.
2150       //   int x[] = {};
2151       StructArrayInitializer,
2152       // Like in `static_cast<int>`.
2153       TemplateArgument,
2154       // C11 _Generic selection.
2155       C11GenericSelection,
2156       // Like in the outer parentheses in `ffnand ff1(.q());`.
2157       VerilogInstancePortList,
2158     } ContextType = Unknown;
2159   };
2160 
2161   /// Puts a new \c Context onto the stack \c Contexts for the lifetime
2162   /// of each instance.
2163   struct ScopedContextCreator {
2164     AnnotatingParser &P;
2165 
ScopedContextCreatorclang::format::__anonadd98d890111::AnnotatingParser::ScopedContextCreator2166     ScopedContextCreator(AnnotatingParser &P, tok::TokenKind ContextKind,
2167                          unsigned Increase)
2168         : P(P) {
2169       P.Contexts.push_back(Context(ContextKind,
2170                                    P.Contexts.back().BindingStrength + Increase,
2171                                    P.Contexts.back().IsExpression));
2172     }
2173 
~ScopedContextCreatorclang::format::__anonadd98d890111::AnnotatingParser::ScopedContextCreator2174     ~ScopedContextCreator() {
2175       if (P.Style.AlignArrayOfStructures != FormatStyle::AIAS_None) {
2176         if (P.Contexts.back().ContextType == Context::StructArrayInitializer) {
2177           P.Contexts.pop_back();
2178           P.Contexts.back().ContextType = Context::StructArrayInitializer;
2179           return;
2180         }
2181       }
2182       P.Contexts.pop_back();
2183     }
2184   };
2185 
modifyContext(const FormatToken & Current)2186   void modifyContext(const FormatToken &Current) {
2187     auto AssignmentStartsExpression = [&]() {
2188       if (Current.getPrecedence() != prec::Assignment)
2189         return false;
2190 
2191       if (Line.First->isOneOf(tok::kw_using, tok::kw_return))
2192         return false;
2193       if (Line.First->is(tok::kw_template)) {
2194         assert(Current.Previous);
2195         if (Current.Previous->is(tok::kw_operator)) {
2196           // `template ... operator=` cannot be an expression.
2197           return false;
2198         }
2199 
2200         // `template` keyword can start a variable template.
2201         const FormatToken *Tok = Line.First->getNextNonComment();
2202         assert(Tok); // Current token is on the same line.
2203         if (Tok->isNot(TT_TemplateOpener)) {
2204           // Explicit template instantiations do not have `<>`.
2205           return false;
2206         }
2207 
2208         // This is the default value of a template parameter, determine if it's
2209         // type or non-type.
2210         if (Contexts.back().ContextKind == tok::less) {
2211           assert(Current.Previous->Previous);
2212           return !Current.Previous->Previous->isOneOf(tok::kw_typename,
2213                                                       tok::kw_class);
2214         }
2215 
2216         Tok = Tok->MatchingParen;
2217         if (!Tok)
2218           return false;
2219         Tok = Tok->getNextNonComment();
2220         if (!Tok)
2221           return false;
2222 
2223         if (Tok->isOneOf(tok::kw_class, tok::kw_enum, tok::kw_struct,
2224                          tok::kw_using)) {
2225           return false;
2226         }
2227 
2228         return true;
2229       }
2230 
2231       // Type aliases use `type X = ...;` in TypeScript and can be exported
2232       // using `export type ...`.
2233       if (Style.isJavaScript() &&
2234           (Line.startsWith(Keywords.kw_type, tok::identifier) ||
2235            Line.startsWith(tok::kw_export, Keywords.kw_type,
2236                            tok::identifier))) {
2237         return false;
2238       }
2239 
2240       return !Current.Previous || Current.Previous->isNot(tok::kw_operator);
2241     };
2242 
2243     if (AssignmentStartsExpression()) {
2244       Contexts.back().IsExpression = true;
2245       if (!Line.startsWith(TT_UnaryOperator)) {
2246         for (FormatToken *Previous = Current.Previous;
2247              Previous && Previous->Previous &&
2248              !Previous->Previous->isOneOf(tok::comma, tok::semi);
2249              Previous = Previous->Previous) {
2250           if (Previous->isOneOf(tok::r_square, tok::r_paren, tok::greater)) {
2251             Previous = Previous->MatchingParen;
2252             if (!Previous)
2253               break;
2254           }
2255           if (Previous->opensScope())
2256             break;
2257           if (Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator) &&
2258               Previous->isPointerOrReference() && Previous->Previous &&
2259               Previous->Previous->isNot(tok::equal)) {
2260             Previous->setType(TT_PointerOrReference);
2261           }
2262         }
2263       }
2264     } else if (Current.is(tok::lessless) &&
2265                (!Current.Previous ||
2266                 Current.Previous->isNot(tok::kw_operator))) {
2267       Contexts.back().IsExpression = true;
2268     } else if (Current.isOneOf(tok::kw_return, tok::kw_throw)) {
2269       Contexts.back().IsExpression = true;
2270     } else if (Current.is(TT_TrailingReturnArrow)) {
2271       Contexts.back().IsExpression = false;
2272     } else if (Current.isOneOf(TT_LambdaArrow, Keywords.kw_assert)) {
2273       Contexts.back().IsExpression = Style.isJava();
2274     } else if (Current.Previous &&
2275                Current.Previous->is(TT_CtorInitializerColon)) {
2276       Contexts.back().IsExpression = true;
2277       Contexts.back().ContextType = Context::CtorInitializer;
2278     } else if (Current.Previous && Current.Previous->is(TT_InheritanceColon)) {
2279       Contexts.back().ContextType = Context::InheritanceList;
2280     } else if (Current.isOneOf(tok::r_paren, tok::greater, tok::comma)) {
2281       for (FormatToken *Previous = Current.Previous;
2282            Previous && Previous->isOneOf(tok::star, tok::amp);
2283            Previous = Previous->Previous) {
2284         Previous->setType(TT_PointerOrReference);
2285       }
2286       if (Line.MustBeDeclaration &&
2287           Contexts.front().ContextType != Context::CtorInitializer) {
2288         Contexts.back().IsExpression = false;
2289       }
2290     } else if (Current.is(tok::kw_new)) {
2291       Contexts.back().CanBeExpression = false;
2292     } else if (Current.is(tok::semi) ||
2293                (Current.is(tok::exclaim) && Current.Previous &&
2294                 Current.Previous->isNot(tok::kw_operator))) {
2295       // This should be the condition or increment in a for-loop.
2296       // But not operator !() (can't use TT_OverloadedOperator here as its not
2297       // been annotated yet).
2298       Contexts.back().IsExpression = true;
2299     }
2300   }
2301 
untilMatchingParen(FormatToken * Current)2302   static FormatToken *untilMatchingParen(FormatToken *Current) {
2303     // Used when `MatchingParen` is not yet established.
2304     int ParenLevel = 0;
2305     while (Current) {
2306       if (Current->is(tok::l_paren))
2307         ++ParenLevel;
2308       if (Current->is(tok::r_paren))
2309         --ParenLevel;
2310       if (ParenLevel < 1)
2311         break;
2312       Current = Current->Next;
2313     }
2314     return Current;
2315   }
2316 
isDeductionGuide(FormatToken & Current)2317   static bool isDeductionGuide(FormatToken &Current) {
2318     // Look for a deduction guide template<T> A(...) -> A<...>;
2319     if (Current.Previous && Current.Previous->is(tok::r_paren) &&
2320         Current.startsSequence(tok::arrow, tok::identifier, tok::less)) {
2321       // Find the TemplateCloser.
2322       FormatToken *TemplateCloser = Current.Next->Next;
2323       int NestingLevel = 0;
2324       while (TemplateCloser) {
2325         // Skip over an expressions in parens  A<(3 < 2)>;
2326         if (TemplateCloser->is(tok::l_paren)) {
2327           // No Matching Paren yet so skip to matching paren
2328           TemplateCloser = untilMatchingParen(TemplateCloser);
2329           if (!TemplateCloser)
2330             break;
2331         }
2332         if (TemplateCloser->is(tok::less))
2333           ++NestingLevel;
2334         if (TemplateCloser->is(tok::greater))
2335           --NestingLevel;
2336         if (NestingLevel < 1)
2337           break;
2338         TemplateCloser = TemplateCloser->Next;
2339       }
2340       // Assuming we have found the end of the template ensure its followed
2341       // with a semi-colon.
2342       if (TemplateCloser && TemplateCloser->Next &&
2343           TemplateCloser->Next->is(tok::semi) &&
2344           Current.Previous->MatchingParen) {
2345         // Determine if the identifier `A` prior to the A<..>; is the same as
2346         // prior to the A(..)
2347         FormatToken *LeadingIdentifier =
2348             Current.Previous->MatchingParen->Previous;
2349 
2350         return LeadingIdentifier &&
2351                LeadingIdentifier->TokenText == Current.Next->TokenText;
2352       }
2353     }
2354     return false;
2355   }
2356 
determineTokenType(FormatToken & Current)2357   void determineTokenType(FormatToken &Current) {
2358     if (Current.isNot(TT_Unknown)) {
2359       // The token type is already known.
2360       return;
2361     }
2362 
2363     if ((Style.isJavaScript() || Style.isCSharp()) &&
2364         Current.is(tok::exclaim)) {
2365       if (Current.Previous) {
2366         bool IsIdentifier =
2367             Style.isJavaScript()
2368                 ? Keywords.isJavaScriptIdentifier(
2369                       *Current.Previous, /* AcceptIdentifierName= */ true)
2370                 : Current.Previous->is(tok::identifier);
2371         if (IsIdentifier ||
2372             Current.Previous->isOneOf(
2373                 tok::kw_default, tok::kw_namespace, tok::r_paren, tok::r_square,
2374                 tok::r_brace, tok::kw_false, tok::kw_true, Keywords.kw_type,
2375                 Keywords.kw_get, Keywords.kw_init, Keywords.kw_set) ||
2376             Current.Previous->Tok.isLiteral()) {
2377           Current.setType(TT_NonNullAssertion);
2378           return;
2379         }
2380       }
2381       if (Current.Next &&
2382           Current.Next->isOneOf(TT_BinaryOperator, Keywords.kw_as)) {
2383         Current.setType(TT_NonNullAssertion);
2384         return;
2385       }
2386     }
2387 
2388     // Line.MightBeFunctionDecl can only be true after the parentheses of a
2389     // function declaration have been found. In this case, 'Current' is a
2390     // trailing token of this declaration and thus cannot be a name.
2391     if ((Style.isJavaScript() || Style.isJava()) &&
2392         Current.is(Keywords.kw_instanceof)) {
2393       Current.setType(TT_BinaryOperator);
2394     } else if (isStartOfName(Current) &&
2395                (!Line.MightBeFunctionDecl || Current.NestingLevel != 0)) {
2396       Contexts.back().FirstStartOfName = &Current;
2397       Current.setType(TT_StartOfName);
2398     } else if (Current.is(tok::semi)) {
2399       // Reset FirstStartOfName after finding a semicolon so that a for loop
2400       // with multiple increment statements is not confused with a for loop
2401       // having multiple variable declarations.
2402       Contexts.back().FirstStartOfName = nullptr;
2403     } else if (Current.isOneOf(tok::kw_auto, tok::kw___auto_type)) {
2404       AutoFound = true;
2405     } else if (Current.is(tok::arrow) && Style.isJava()) {
2406       Current.setType(TT_LambdaArrow);
2407     } else if (Current.is(tok::arrow) && Style.isVerilog()) {
2408       // The implication operator.
2409       Current.setType(TT_BinaryOperator);
2410     } else if (Current.is(tok::arrow) && AutoFound &&
2411                Line.MightBeFunctionDecl && Current.NestingLevel == 0 &&
2412                !Current.Previous->isOneOf(tok::kw_operator, tok::identifier)) {
2413       // not auto operator->() -> xxx;
2414       Current.setType(TT_TrailingReturnArrow);
2415     } else if (Current.is(tok::arrow) && Current.Previous &&
2416                Current.Previous->is(tok::r_brace) &&
2417                Current.Previous->is(BK_Block)) {
2418       // Concept implicit conversion constraint needs to be treated like
2419       // a trailing return type  ... } -> <type>.
2420       Current.setType(TT_TrailingReturnArrow);
2421     } else if (isDeductionGuide(Current)) {
2422       // Deduction guides trailing arrow " A(...) -> A<T>;".
2423       Current.setType(TT_TrailingReturnArrow);
2424     } else if (Current.isPointerOrReference()) {
2425       Current.setType(determineStarAmpUsage(
2426           Current,
2427           Contexts.back().CanBeExpression && Contexts.back().IsExpression,
2428           Contexts.back().ContextType == Context::TemplateArgument));
2429     } else if (Current.isOneOf(tok::minus, tok::plus, tok::caret) ||
2430                (Style.isVerilog() && Current.is(tok::pipe))) {
2431       Current.setType(determinePlusMinusCaretUsage(Current));
2432       if (Current.is(TT_UnaryOperator) && Current.is(tok::caret))
2433         Contexts.back().CaretFound = true;
2434     } else if (Current.isOneOf(tok::minusminus, tok::plusplus)) {
2435       Current.setType(determineIncrementUsage(Current));
2436     } else if (Current.isOneOf(tok::exclaim, tok::tilde)) {
2437       Current.setType(TT_UnaryOperator);
2438     } else if (Current.is(tok::question)) {
2439       if (Style.isJavaScript() && Line.MustBeDeclaration &&
2440           !Contexts.back().IsExpression) {
2441         // In JavaScript, `interface X { foo?(): bar; }` is an optional method
2442         // on the interface, not a ternary expression.
2443         Current.setType(TT_JsTypeOptionalQuestion);
2444       } else if (Style.isTableGen()) {
2445         // In TableGen, '?' is just an identifier like token.
2446         Current.setType(TT_Unknown);
2447       } else {
2448         Current.setType(TT_ConditionalExpr);
2449       }
2450     } else if (Current.isBinaryOperator() &&
2451                (!Current.Previous || Current.Previous->isNot(tok::l_square)) &&
2452                (Current.isNot(tok::greater) && !Style.isTextProto())) {
2453       if (Style.isVerilog()) {
2454         if (Current.is(tok::lessequal) && Contexts.size() == 1 &&
2455             !Contexts.back().VerilogAssignmentFound) {
2456           // In Verilog `<=` is assignment if in its own statement. It is a
2457           // statement instead of an expression, that is it can not be chained.
2458           Current.ForcedPrecedence = prec::Assignment;
2459           Current.setFinalizedType(TT_BinaryOperator);
2460         }
2461         if (Current.getPrecedence() == prec::Assignment)
2462           Contexts.back().VerilogAssignmentFound = true;
2463       }
2464       Current.setType(TT_BinaryOperator);
2465     } else if (Current.is(tok::comment)) {
2466       if (Current.TokenText.starts_with("/*")) {
2467         if (Current.TokenText.ends_with("*/")) {
2468           Current.setType(TT_BlockComment);
2469         } else {
2470           // The lexer has for some reason determined a comment here. But we
2471           // cannot really handle it, if it isn't properly terminated.
2472           Current.Tok.setKind(tok::unknown);
2473         }
2474       } else {
2475         Current.setType(TT_LineComment);
2476       }
2477     } else if (Current.is(tok::string_literal)) {
2478       if (Style.isVerilog() && Contexts.back().VerilogMayBeConcatenation &&
2479           Current.getPreviousNonComment() &&
2480           Current.getPreviousNonComment()->isOneOf(tok::comma, tok::l_brace) &&
2481           Current.getNextNonComment() &&
2482           Current.getNextNonComment()->isOneOf(tok::comma, tok::r_brace)) {
2483         Current.setType(TT_StringInConcatenation);
2484       }
2485     } else if (Current.is(tok::l_paren)) {
2486       if (lParenStartsCppCast(Current))
2487         Current.setType(TT_CppCastLParen);
2488     } else if (Current.is(tok::r_paren)) {
2489       if (rParenEndsCast(Current))
2490         Current.setType(TT_CastRParen);
2491       if (Current.MatchingParen && Current.Next &&
2492           !Current.Next->isBinaryOperator() &&
2493           !Current.Next->isOneOf(
2494               tok::semi, tok::colon, tok::l_brace, tok::l_paren, tok::comma,
2495               tok::period, tok::arrow, tok::coloncolon, tok::kw_noexcept)) {
2496         if (FormatToken *AfterParen = Current.MatchingParen->Next;
2497             AfterParen && AfterParen->isNot(tok::caret)) {
2498           // Make sure this isn't the return type of an Obj-C block declaration.
2499           if (FormatToken *BeforeParen = Current.MatchingParen->Previous;
2500               BeforeParen && BeforeParen->is(tok::identifier) &&
2501               BeforeParen->isNot(TT_TypenameMacro) &&
2502               BeforeParen->TokenText == BeforeParen->TokenText.upper() &&
2503               (!BeforeParen->Previous ||
2504                BeforeParen->Previous->ClosesTemplateDeclaration ||
2505                BeforeParen->Previous->ClosesRequiresClause)) {
2506             Current.setType(TT_FunctionAnnotationRParen);
2507           }
2508         }
2509       }
2510     } else if (Current.is(tok::at) && Current.Next && !Style.isJavaScript() &&
2511                !Style.isJava()) {
2512       // In Java & JavaScript, "@..." is a decorator or annotation. In ObjC, it
2513       // marks declarations and properties that need special formatting.
2514       switch (Current.Next->Tok.getObjCKeywordID()) {
2515       case tok::objc_interface:
2516       case tok::objc_implementation:
2517       case tok::objc_protocol:
2518         Current.setType(TT_ObjCDecl);
2519         break;
2520       case tok::objc_property:
2521         Current.setType(TT_ObjCProperty);
2522         break;
2523       default:
2524         break;
2525       }
2526     } else if (Current.is(tok::period)) {
2527       FormatToken *PreviousNoComment = Current.getPreviousNonComment();
2528       if (PreviousNoComment &&
2529           PreviousNoComment->isOneOf(tok::comma, tok::l_brace)) {
2530         Current.setType(TT_DesignatedInitializerPeriod);
2531       } else if (Style.isJava() && Current.Previous &&
2532                  Current.Previous->isOneOf(TT_JavaAnnotation,
2533                                            TT_LeadingJavaAnnotation)) {
2534         Current.setType(Current.Previous->getType());
2535       }
2536     } else if (canBeObjCSelectorComponent(Current) &&
2537                // FIXME(bug 36976): ObjC return types shouldn't use
2538                // TT_CastRParen.
2539                Current.Previous && Current.Previous->is(TT_CastRParen) &&
2540                Current.Previous->MatchingParen &&
2541                Current.Previous->MatchingParen->Previous &&
2542                Current.Previous->MatchingParen->Previous->is(
2543                    TT_ObjCMethodSpecifier)) {
2544       // This is the first part of an Objective-C selector name. (If there's no
2545       // colon after this, this is the only place which annotates the identifier
2546       // as a selector.)
2547       Current.setType(TT_SelectorName);
2548     } else if (Current.isOneOf(tok::identifier, tok::kw_const, tok::kw_noexcept,
2549                                tok::kw_requires) &&
2550                Current.Previous &&
2551                !Current.Previous->isOneOf(tok::equal, tok::at,
2552                                           TT_CtorInitializerComma,
2553                                           TT_CtorInitializerColon) &&
2554                Line.MightBeFunctionDecl && Contexts.size() == 1) {
2555       // Line.MightBeFunctionDecl can only be true after the parentheses of a
2556       // function declaration have been found.
2557       Current.setType(TT_TrailingAnnotation);
2558     } else if ((Style.isJava() || Style.isJavaScript()) && Current.Previous) {
2559       if (Current.Previous->is(tok::at) &&
2560           Current.isNot(Keywords.kw_interface)) {
2561         const FormatToken &AtToken = *Current.Previous;
2562         const FormatToken *Previous = AtToken.getPreviousNonComment();
2563         if (!Previous || Previous->is(TT_LeadingJavaAnnotation))
2564           Current.setType(TT_LeadingJavaAnnotation);
2565         else
2566           Current.setType(TT_JavaAnnotation);
2567       } else if (Current.Previous->is(tok::period) &&
2568                  Current.Previous->isOneOf(TT_JavaAnnotation,
2569                                            TT_LeadingJavaAnnotation)) {
2570         Current.setType(Current.Previous->getType());
2571       }
2572     }
2573   }
2574 
2575   /// Take a guess at whether \p Tok starts a name of a function or
2576   /// variable declaration.
2577   ///
2578   /// This is a heuristic based on whether \p Tok is an identifier following
2579   /// something that is likely a type.
isStartOfName(const FormatToken & Tok)2580   bool isStartOfName(const FormatToken &Tok) {
2581     // Handled in ExpressionParser for Verilog.
2582     if (Style.isVerilog())
2583       return false;
2584 
2585     if (!Tok.Previous || Tok.isNot(tok::identifier) || Tok.is(TT_ClassHeadName))
2586       return false;
2587 
2588     if (Tok.endsSequence(Keywords.kw_final, TT_ClassHeadName))
2589       return false;
2590 
2591     if ((Style.isJavaScript() || Style.isJava()) && Tok.is(Keywords.kw_extends))
2592       return false;
2593 
2594     if (const auto *NextNonComment = Tok.getNextNonComment();
2595         (!NextNonComment && !Line.InMacroBody) ||
2596         (NextNonComment &&
2597          (NextNonComment->isPointerOrReference() ||
2598           NextNonComment->isOneOf(TT_ClassHeadName, tok::string_literal) ||
2599           (Line.InPragmaDirective && NextNonComment->is(tok::identifier))))) {
2600       return false;
2601     }
2602 
2603     if (Tok.Previous->isOneOf(TT_LeadingJavaAnnotation, Keywords.kw_instanceof,
2604                               Keywords.kw_as)) {
2605       return false;
2606     }
2607     if (Style.isJavaScript() && Tok.Previous->is(Keywords.kw_in))
2608       return false;
2609 
2610     // Skip "const" as it does not have an influence on whether this is a name.
2611     FormatToken *PreviousNotConst = Tok.getPreviousNonComment();
2612 
2613     // For javascript const can be like "let" or "var"
2614     if (!Style.isJavaScript())
2615       while (PreviousNotConst && PreviousNotConst->is(tok::kw_const))
2616         PreviousNotConst = PreviousNotConst->getPreviousNonComment();
2617 
2618     if (!PreviousNotConst)
2619       return false;
2620 
2621     if (PreviousNotConst->ClosesRequiresClause)
2622       return false;
2623 
2624     if (Style.isTableGen()) {
2625       // keywords such as let and def* defines names.
2626       if (Keywords.isTableGenDefinition(*PreviousNotConst))
2627         return true;
2628       // Otherwise C++ style declarations is available only inside the brace.
2629       if (Contexts.back().ContextKind != tok::l_brace)
2630         return false;
2631     }
2632 
2633     bool IsPPKeyword = PreviousNotConst->is(tok::identifier) &&
2634                        PreviousNotConst->Previous &&
2635                        PreviousNotConst->Previous->is(tok::hash);
2636 
2637     if (PreviousNotConst->is(TT_TemplateCloser)) {
2638       return PreviousNotConst && PreviousNotConst->MatchingParen &&
2639              PreviousNotConst->MatchingParen->Previous &&
2640              PreviousNotConst->MatchingParen->Previous->isNot(tok::period) &&
2641              PreviousNotConst->MatchingParen->Previous->isNot(tok::kw_template);
2642     }
2643 
2644     if ((PreviousNotConst->is(tok::r_paren) &&
2645          PreviousNotConst->is(TT_TypeDeclarationParen)) ||
2646         PreviousNotConst->is(TT_AttributeRParen)) {
2647       return true;
2648     }
2649 
2650     // If is a preprocess keyword like #define.
2651     if (IsPPKeyword)
2652       return false;
2653 
2654     // int a or auto a.
2655     if (PreviousNotConst->isOneOf(tok::identifier, tok::kw_auto) &&
2656         PreviousNotConst->isNot(TT_StatementAttributeLikeMacro)) {
2657       return true;
2658     }
2659 
2660     // *a or &a or &&a.
2661     if (PreviousNotConst->is(TT_PointerOrReference))
2662       return true;
2663 
2664     // MyClass a;
2665     if (PreviousNotConst->isTypeName(LangOpts))
2666       return true;
2667 
2668     // type[] a in Java
2669     if (Style.isJava() && PreviousNotConst->is(tok::r_square))
2670       return true;
2671 
2672     // const a = in JavaScript.
2673     return Style.isJavaScript() && PreviousNotConst->is(tok::kw_const);
2674   }
2675 
2676   /// Determine whether '(' is starting a C++ cast.
lParenStartsCppCast(const FormatToken & Tok)2677   bool lParenStartsCppCast(const FormatToken &Tok) {
2678     // C-style casts are only used in C++.
2679     if (!IsCpp)
2680       return false;
2681 
2682     FormatToken *LeftOfParens = Tok.getPreviousNonComment();
2683     if (LeftOfParens && LeftOfParens->is(TT_TemplateCloser) &&
2684         LeftOfParens->MatchingParen) {
2685       auto *Prev = LeftOfParens->MatchingParen->getPreviousNonComment();
2686       if (Prev &&
2687           Prev->isOneOf(tok::kw_const_cast, tok::kw_dynamic_cast,
2688                         tok::kw_reinterpret_cast, tok::kw_static_cast)) {
2689         // FIXME: Maybe we should handle identifiers ending with "_cast",
2690         // e.g. any_cast?
2691         return true;
2692       }
2693     }
2694     return false;
2695   }
2696 
2697   /// Determine whether ')' is ending a cast.
rParenEndsCast(const FormatToken & Tok)2698   bool rParenEndsCast(const FormatToken &Tok) {
2699     assert(Tok.is(tok::r_paren));
2700 
2701     if (!Tok.MatchingParen || !Tok.Previous)
2702       return false;
2703 
2704     // C-style casts are only used in C++, C# and Java.
2705     if (!IsCpp && !Style.isCSharp() && !Style.isJava())
2706       return false;
2707 
2708     const auto *LParen = Tok.MatchingParen;
2709     const auto *BeforeRParen = Tok.Previous;
2710     const auto *AfterRParen = Tok.Next;
2711 
2712     // Empty parens aren't casts and there are no casts at the end of the line.
2713     if (BeforeRParen == LParen || !AfterRParen)
2714       return false;
2715 
2716     if (LParen->is(TT_OverloadedOperatorLParen))
2717       return false;
2718 
2719     auto *LeftOfParens = LParen->getPreviousNonComment();
2720     if (LeftOfParens) {
2721       // If there is a closing parenthesis left of the current
2722       // parentheses, look past it as these might be chained casts.
2723       if (LeftOfParens->is(tok::r_paren) &&
2724           LeftOfParens->isNot(TT_CastRParen)) {
2725         if (!LeftOfParens->MatchingParen ||
2726             !LeftOfParens->MatchingParen->Previous) {
2727           return false;
2728         }
2729         LeftOfParens = LeftOfParens->MatchingParen->Previous;
2730       }
2731 
2732       if (LeftOfParens->is(tok::r_square)) {
2733         //   delete[] (void *)ptr;
2734         auto MayBeArrayDelete = [](FormatToken *Tok) -> FormatToken * {
2735           if (Tok->isNot(tok::r_square))
2736             return nullptr;
2737 
2738           Tok = Tok->getPreviousNonComment();
2739           if (!Tok || Tok->isNot(tok::l_square))
2740             return nullptr;
2741 
2742           Tok = Tok->getPreviousNonComment();
2743           if (!Tok || Tok->isNot(tok::kw_delete))
2744             return nullptr;
2745           return Tok;
2746         };
2747         if (FormatToken *MaybeDelete = MayBeArrayDelete(LeftOfParens))
2748           LeftOfParens = MaybeDelete;
2749       }
2750 
2751       // The Condition directly below this one will see the operator arguments
2752       // as a (void *foo) cast.
2753       //   void operator delete(void *foo) ATTRIB;
2754       if (LeftOfParens->Tok.getIdentifierInfo() && LeftOfParens->Previous &&
2755           LeftOfParens->Previous->is(tok::kw_operator)) {
2756         return false;
2757       }
2758 
2759       // If there is an identifier (or with a few exceptions a keyword) right
2760       // before the parentheses, this is unlikely to be a cast.
2761       if (LeftOfParens->Tok.getIdentifierInfo() &&
2762           !LeftOfParens->isOneOf(Keywords.kw_in, tok::kw_return, tok::kw_case,
2763                                  tok::kw_delete, tok::kw_throw)) {
2764         return false;
2765       }
2766 
2767       // Certain other tokens right before the parentheses are also signals that
2768       // this cannot be a cast.
2769       if (LeftOfParens->isOneOf(tok::at, tok::r_square, TT_OverloadedOperator,
2770                                 TT_TemplateCloser, tok::ellipsis)) {
2771         return false;
2772       }
2773     }
2774 
2775     if (AfterRParen->is(tok::question) ||
2776         (AfterRParen->is(tok::ampamp) && !BeforeRParen->isTypeName(LangOpts))) {
2777       return false;
2778     }
2779 
2780     // `foreach((A a, B b) in someList)` should not be seen as a cast.
2781     if (AfterRParen->is(Keywords.kw_in) && Style.isCSharp())
2782       return false;
2783 
2784     // Functions which end with decorations like volatile, noexcept are unlikely
2785     // to be casts.
2786     if (AfterRParen->isOneOf(tok::kw_noexcept, tok::kw_volatile, tok::kw_const,
2787                              tok::kw_requires, tok::kw_throw, tok::arrow,
2788                              Keywords.kw_override, Keywords.kw_final) ||
2789         isCppAttribute(IsCpp, *AfterRParen)) {
2790       return false;
2791     }
2792 
2793     // As Java has no function types, a "(" after the ")" likely means that this
2794     // is a cast.
2795     if (Style.isJava() && AfterRParen->is(tok::l_paren))
2796       return true;
2797 
2798     // If a (non-string) literal follows, this is likely a cast.
2799     if (AfterRParen->isOneOf(tok::kw_sizeof, tok::kw_alignof) ||
2800         (AfterRParen->Tok.isLiteral() &&
2801          AfterRParen->isNot(tok::string_literal))) {
2802       return true;
2803     }
2804 
2805     auto IsNonVariableTemplate = [](const FormatToken &Tok) {
2806       if (Tok.isNot(TT_TemplateCloser))
2807         return false;
2808       const auto *Less = Tok.MatchingParen;
2809       if (!Less)
2810         return false;
2811       const auto *BeforeLess = Less->getPreviousNonComment();
2812       return BeforeLess && BeforeLess->isNot(TT_VariableTemplate);
2813     };
2814 
2815     // Heuristically try to determine whether the parentheses contain a type.
2816     auto IsQualifiedPointerOrReference = [](const FormatToken *T,
2817                                             const LangOptions &LangOpts) {
2818       // This is used to handle cases such as x = (foo *const)&y;
2819       assert(!T->isTypeName(LangOpts) && "Should have already been checked");
2820       // Strip trailing qualifiers such as const or volatile when checking
2821       // whether the parens could be a cast to a pointer/reference type.
2822       while (T) {
2823         if (T->is(TT_AttributeRParen)) {
2824           // Handle `x = (foo *__attribute__((foo)))&v;`:
2825           assert(T->is(tok::r_paren));
2826           assert(T->MatchingParen);
2827           assert(T->MatchingParen->is(tok::l_paren));
2828           assert(T->MatchingParen->is(TT_AttributeLParen));
2829           if (const auto *Tok = T->MatchingParen->Previous;
2830               Tok && Tok->isAttribute()) {
2831             T = Tok->Previous;
2832             continue;
2833           }
2834         } else if (T->is(TT_AttributeSquare)) {
2835           // Handle `x = (foo *[[clang::foo]])&v;`:
2836           if (T->MatchingParen && T->MatchingParen->Previous) {
2837             T = T->MatchingParen->Previous;
2838             continue;
2839           }
2840         } else if (T->canBePointerOrReferenceQualifier()) {
2841           T = T->Previous;
2842           continue;
2843         }
2844         break;
2845       }
2846       return T && T->is(TT_PointerOrReference);
2847     };
2848 
2849     bool ParensAreType = IsNonVariableTemplate(*BeforeRParen) ||
2850                          BeforeRParen->is(TT_TypeDeclarationParen) ||
2851                          BeforeRParen->isTypeName(LangOpts) ||
2852                          IsQualifiedPointerOrReference(BeforeRParen, LangOpts);
2853     bool ParensCouldEndDecl =
2854         AfterRParen->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
2855     if (ParensAreType && !ParensCouldEndDecl)
2856       return true;
2857 
2858     // At this point, we heuristically assume that there are no casts at the
2859     // start of the line. We assume that we have found most cases where there
2860     // are by the logic above, e.g. "(void)x;".
2861     if (!LeftOfParens)
2862       return false;
2863 
2864     // Certain token types inside the parentheses mean that this can't be a
2865     // cast.
2866     for (const auto *Token = LParen->Next; Token != &Tok; Token = Token->Next)
2867       if (Token->is(TT_BinaryOperator))
2868         return false;
2869 
2870     // If the following token is an identifier or 'this', this is a cast. All
2871     // cases where this can be something else are handled above.
2872     if (AfterRParen->isOneOf(tok::identifier, tok::kw_this))
2873       return true;
2874 
2875     // Look for a cast `( x ) (`, where x may be a qualified identifier.
2876     if (AfterRParen->is(tok::l_paren)) {
2877       for (const auto *Prev = BeforeRParen; Prev->is(tok::identifier);) {
2878         Prev = Prev->Previous;
2879         if (Prev->is(tok::coloncolon))
2880           Prev = Prev->Previous;
2881         if (Prev == LParen)
2882           return true;
2883       }
2884     }
2885 
2886     if (!AfterRParen->Next)
2887       return false;
2888 
2889     if (AfterRParen->is(tok::l_brace) &&
2890         AfterRParen->getBlockKind() == BK_BracedInit) {
2891       return true;
2892     }
2893 
2894     // If the next token after the parenthesis is a unary operator, assume
2895     // that this is cast, unless there are unexpected tokens inside the
2896     // parenthesis.
2897     const bool NextIsAmpOrStar = AfterRParen->isOneOf(tok::amp, tok::star);
2898     if (!(AfterRParen->isUnaryOperator() || NextIsAmpOrStar) ||
2899         AfterRParen->is(tok::plus) ||
2900         !AfterRParen->Next->isOneOf(tok::identifier, tok::numeric_constant)) {
2901       return false;
2902     }
2903 
2904     if (NextIsAmpOrStar &&
2905         (AfterRParen->Next->is(tok::numeric_constant) || Line.InPPDirective)) {
2906       return false;
2907     }
2908 
2909     if (Line.InPPDirective && AfterRParen->is(tok::minus))
2910       return false;
2911 
2912     const auto *Prev = BeforeRParen;
2913 
2914     // Look for a function pointer type, e.g. `(*)()`.
2915     if (Prev->is(tok::r_paren)) {
2916       if (Prev->is(TT_CastRParen))
2917         return false;
2918       Prev = Prev->MatchingParen;
2919       if (!Prev)
2920         return false;
2921       Prev = Prev->Previous;
2922       if (!Prev || Prev->isNot(tok::r_paren))
2923         return false;
2924       Prev = Prev->MatchingParen;
2925       return Prev && Prev->is(TT_FunctionTypeLParen);
2926     }
2927 
2928     // Search for unexpected tokens.
2929     for (Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous)
2930       if (!Prev->isOneOf(tok::kw_const, tok::identifier, tok::coloncolon))
2931         return false;
2932 
2933     return true;
2934   }
2935 
2936   /// Returns true if the token is used as a unary operator.
determineUnaryOperatorByUsage(const FormatToken & Tok)2937   bool determineUnaryOperatorByUsage(const FormatToken &Tok) {
2938     const FormatToken *PrevToken = Tok.getPreviousNonComment();
2939     if (!PrevToken)
2940       return true;
2941 
2942     // These keywords are deliberately not included here because they may
2943     // precede only one of unary star/amp and plus/minus but not both.  They are
2944     // either included in determineStarAmpUsage or determinePlusMinusCaretUsage.
2945     //
2946     // @ - It may be followed by a unary `-` in Objective-C literals. We don't
2947     //   know how they can be followed by a star or amp.
2948     if (PrevToken->isOneOf(
2949             TT_ConditionalExpr, tok::l_paren, tok::comma, tok::colon, tok::semi,
2950             tok::equal, tok::question, tok::l_square, tok::l_brace,
2951             tok::kw_case, tok::kw_co_await, tok::kw_co_return, tok::kw_co_yield,
2952             tok::kw_delete, tok::kw_return, tok::kw_throw)) {
2953       return true;
2954     }
2955 
2956     // We put sizeof here instead of only in determineStarAmpUsage. In the cases
2957     // where the unary `+` operator is overloaded, it is reasonable to write
2958     // things like `sizeof +x`. Like commit 446d6ec996c6c3.
2959     if (PrevToken->is(tok::kw_sizeof))
2960       return true;
2961 
2962     // A sequence of leading unary operators.
2963     if (PrevToken->isOneOf(TT_CastRParen, TT_UnaryOperator))
2964       return true;
2965 
2966     // There can't be two consecutive binary operators.
2967     if (PrevToken->is(TT_BinaryOperator))
2968       return true;
2969 
2970     return false;
2971   }
2972 
2973   /// Return the type of the given token assuming it is * or &.
determineStarAmpUsage(const FormatToken & Tok,bool IsExpression,bool InTemplateArgument)2974   TokenType determineStarAmpUsage(const FormatToken &Tok, bool IsExpression,
2975                                   bool InTemplateArgument) {
2976     if (Style.isJavaScript())
2977       return TT_BinaryOperator;
2978 
2979     // && in C# must be a binary operator.
2980     if (Style.isCSharp() && Tok.is(tok::ampamp))
2981       return TT_BinaryOperator;
2982 
2983     if (Style.isVerilog()) {
2984       // In Verilog, `*` can only be a binary operator.  `&` can be either unary
2985       // or binary.  `*` also includes `*>` in module path declarations in
2986       // specify blocks because merged tokens take the type of the first one by
2987       // default.
2988       if (Tok.is(tok::star))
2989         return TT_BinaryOperator;
2990       return determineUnaryOperatorByUsage(Tok) ? TT_UnaryOperator
2991                                                 : TT_BinaryOperator;
2992     }
2993 
2994     const FormatToken *PrevToken = Tok.getPreviousNonComment();
2995     if (!PrevToken)
2996       return TT_UnaryOperator;
2997     if (PrevToken->isTypeName(LangOpts))
2998       return TT_PointerOrReference;
2999     if (PrevToken->isPlacementOperator() && Tok.is(tok::ampamp))
3000       return TT_BinaryOperator;
3001 
3002     auto *NextToken = Tok.getNextNonComment();
3003     if (!NextToken)
3004       return TT_PointerOrReference;
3005     if (NextToken->is(tok::greater)) {
3006       NextToken->setFinalizedType(TT_TemplateCloser);
3007       return TT_PointerOrReference;
3008     }
3009 
3010     if (InTemplateArgument && NextToken->is(tok::kw_noexcept))
3011       return TT_BinaryOperator;
3012 
3013     if (NextToken->isOneOf(tok::arrow, tok::equal, tok::comma, tok::r_paren,
3014                            TT_RequiresClause) ||
3015         (NextToken->is(tok::kw_noexcept) && !IsExpression) ||
3016         NextToken->canBePointerOrReferenceQualifier() ||
3017         (NextToken->is(tok::l_brace) && !NextToken->getNextNonComment())) {
3018       return TT_PointerOrReference;
3019     }
3020 
3021     if (PrevToken->is(tok::coloncolon))
3022       return TT_PointerOrReference;
3023 
3024     if (PrevToken->is(tok::r_paren) && PrevToken->is(TT_TypeDeclarationParen))
3025       return TT_PointerOrReference;
3026 
3027     if (determineUnaryOperatorByUsage(Tok))
3028       return TT_UnaryOperator;
3029 
3030     if (NextToken->is(tok::l_square) && NextToken->isNot(TT_LambdaLSquare))
3031       return TT_PointerOrReference;
3032     if (NextToken->is(tok::kw_operator) && !IsExpression)
3033       return TT_PointerOrReference;
3034     if (NextToken->isOneOf(tok::comma, tok::semi))
3035       return TT_PointerOrReference;
3036 
3037     // After right braces, star tokens are likely to be pointers to struct,
3038     // union, or class.
3039     //   struct {} *ptr;
3040     // This by itself is not sufficient to distinguish from multiplication
3041     // following a brace-initialized expression, as in:
3042     // int i = int{42} * 2;
3043     // In the struct case, the part of the struct declaration until the `{` and
3044     // the `}` are put on separate unwrapped lines; in the brace-initialized
3045     // case, the matching `{` is on the same unwrapped line, so check for the
3046     // presence of the matching brace to distinguish between those.
3047     if (PrevToken->is(tok::r_brace) && Tok.is(tok::star) &&
3048         !PrevToken->MatchingParen) {
3049       return TT_PointerOrReference;
3050     }
3051 
3052     if (PrevToken->endsSequence(tok::r_square, tok::l_square, tok::kw_delete))
3053       return TT_UnaryOperator;
3054 
3055     if (PrevToken->Tok.isLiteral() ||
3056         PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::kw_true,
3057                            tok::kw_false, tok::r_brace)) {
3058       return TT_BinaryOperator;
3059     }
3060 
3061     const FormatToken *NextNonParen = NextToken;
3062     while (NextNonParen && NextNonParen->is(tok::l_paren))
3063       NextNonParen = NextNonParen->getNextNonComment();
3064     if (NextNonParen && (NextNonParen->Tok.isLiteral() ||
3065                          NextNonParen->isOneOf(tok::kw_true, tok::kw_false) ||
3066                          NextNonParen->isUnaryOperator())) {
3067       return TT_BinaryOperator;
3068     }
3069 
3070     // If we know we're in a template argument, there are no named declarations.
3071     // Thus, having an identifier on the right-hand side indicates a binary
3072     // operator.
3073     if (InTemplateArgument && NextToken->Tok.isAnyIdentifier())
3074       return TT_BinaryOperator;
3075 
3076     // "&&" followed by "(", "*", or "&" is quite unlikely to be two successive
3077     // unary "&".
3078     if (Tok.is(tok::ampamp) &&
3079         NextToken->isOneOf(tok::l_paren, tok::star, tok::amp)) {
3080       return TT_BinaryOperator;
3081     }
3082 
3083     // This catches some cases where evaluation order is used as control flow:
3084     //   aaa && aaa->f();
3085     // Or expressions like:
3086     //   width * height * length
3087     if (NextToken->Tok.isAnyIdentifier()) {
3088       auto *NextNextToken = NextToken->getNextNonComment();
3089       if (NextNextToken) {
3090         if (NextNextToken->is(tok::arrow))
3091           return TT_BinaryOperator;
3092         if (NextNextToken->isPointerOrReference() &&
3093             !NextToken->isObjCLifetimeQualifier(Style)) {
3094           NextNextToken->setFinalizedType(TT_BinaryOperator);
3095           return TT_BinaryOperator;
3096         }
3097       }
3098     }
3099 
3100     // It is very unlikely that we are going to find a pointer or reference type
3101     // definition on the RHS of an assignment.
3102     if (IsExpression && !Contexts.back().CaretFound)
3103       return TT_BinaryOperator;
3104 
3105     // Opeartors at class scope are likely pointer or reference members.
3106     if (!Scopes.empty() && Scopes.back() == ST_Class)
3107       return TT_PointerOrReference;
3108 
3109     // Tokens that indicate member access or chained operator& use.
3110     auto IsChainedOperatorAmpOrMember = [](const FormatToken *token) {
3111       return !token || token->isOneOf(tok::amp, tok::period, tok::arrow,
3112                                       tok::arrowstar, tok::periodstar);
3113     };
3114 
3115     // It's more likely that & represents operator& than an uninitialized
3116     // reference.
3117     if (Tok.is(tok::amp) && PrevToken->Tok.isAnyIdentifier() &&
3118         IsChainedOperatorAmpOrMember(PrevToken->getPreviousNonComment()) &&
3119         NextToken && NextToken->Tok.isAnyIdentifier()) {
3120       if (auto NextNext = NextToken->getNextNonComment();
3121           NextNext &&
3122           (IsChainedOperatorAmpOrMember(NextNext) || NextNext->is(tok::semi))) {
3123         return TT_BinaryOperator;
3124       }
3125     }
3126 
3127     if (Line.Type == LT_SimpleRequirement ||
3128         (!Scopes.empty() && Scopes.back() == ST_CompoundRequirement)) {
3129       return TT_BinaryOperator;
3130     }
3131 
3132     return TT_PointerOrReference;
3133   }
3134 
determinePlusMinusCaretUsage(const FormatToken & Tok)3135   TokenType determinePlusMinusCaretUsage(const FormatToken &Tok) {
3136     if (determineUnaryOperatorByUsage(Tok))
3137       return TT_UnaryOperator;
3138 
3139     const FormatToken *PrevToken = Tok.getPreviousNonComment();
3140     if (!PrevToken)
3141       return TT_UnaryOperator;
3142 
3143     if (PrevToken->is(tok::at))
3144       return TT_UnaryOperator;
3145 
3146     // Fall back to marking the token as binary operator.
3147     return TT_BinaryOperator;
3148   }
3149 
3150   /// Determine whether ++/-- are pre- or post-increments/-decrements.
determineIncrementUsage(const FormatToken & Tok)3151   TokenType determineIncrementUsage(const FormatToken &Tok) {
3152     const FormatToken *PrevToken = Tok.getPreviousNonComment();
3153     if (!PrevToken || PrevToken->is(TT_CastRParen))
3154       return TT_UnaryOperator;
3155     if (PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::identifier))
3156       return TT_TrailingUnaryOperator;
3157 
3158     return TT_UnaryOperator;
3159   }
3160 
3161   SmallVector<Context, 8> Contexts;
3162 
3163   const FormatStyle &Style;
3164   AnnotatedLine &Line;
3165   FormatToken *CurrentToken;
3166   bool AutoFound;
3167   bool IsCpp;
3168   LangOptions LangOpts;
3169   const AdditionalKeywords &Keywords;
3170 
3171   SmallVector<ScopeType> &Scopes;
3172 
3173   // Set of "<" tokens that do not open a template parameter list. If parseAngle
3174   // determines that a specific token can't be a template opener, it will make
3175   // same decision irrespective of the decisions for tokens leading up to it.
3176   // Store this information to prevent this from causing exponential runtime.
3177   llvm::SmallPtrSet<FormatToken *, 16> NonTemplateLess;
3178 
3179   int TemplateDeclarationDepth;
3180 };
3181 
3182 static const int PrecedenceUnaryOperator = prec::PointerToMember + 1;
3183 static const int PrecedenceArrowAndPeriod = prec::PointerToMember + 2;
3184 
3185 /// Parses binary expressions by inserting fake parenthesis based on
3186 /// operator precedence.
3187 class ExpressionParser {
3188 public:
ExpressionParser(const FormatStyle & Style,const AdditionalKeywords & Keywords,AnnotatedLine & Line)3189   ExpressionParser(const FormatStyle &Style, const AdditionalKeywords &Keywords,
3190                    AnnotatedLine &Line)
3191       : Style(Style), Keywords(Keywords), Line(Line), Current(Line.First) {}
3192 
3193   /// Parse expressions with the given operator precedence.
parse(int Precedence=0)3194   void parse(int Precedence = 0) {
3195     // Skip 'return' and ObjC selector colons as they are not part of a binary
3196     // expression.
3197     while (Current && (Current->is(tok::kw_return) ||
3198                        (Current->is(tok::colon) &&
3199                         Current->isOneOf(TT_ObjCMethodExpr, TT_DictLiteral)))) {
3200       next();
3201     }
3202 
3203     if (!Current || Precedence > PrecedenceArrowAndPeriod)
3204       return;
3205 
3206     // Conditional expressions need to be parsed separately for proper nesting.
3207     if (Precedence == prec::Conditional) {
3208       parseConditionalExpr();
3209       return;
3210     }
3211 
3212     // Parse unary operators, which all have a higher precedence than binary
3213     // operators.
3214     if (Precedence == PrecedenceUnaryOperator) {
3215       parseUnaryOperator();
3216       return;
3217     }
3218 
3219     FormatToken *Start = Current;
3220     FormatToken *LatestOperator = nullptr;
3221     unsigned OperatorIndex = 0;
3222     // The first name of the current type in a port list.
3223     FormatToken *VerilogFirstOfType = nullptr;
3224 
3225     while (Current) {
3226       // In Verilog ports in a module header that don't have a type take the
3227       // type of the previous one.  For example,
3228       //   module a(output b,
3229       //                   c,
3230       //            output d);
3231       // In this case there need to be fake parentheses around b and c.
3232       if (Style.isVerilog() && Precedence == prec::Comma) {
3233         VerilogFirstOfType =
3234             verilogGroupDecl(VerilogFirstOfType, LatestOperator);
3235       }
3236 
3237       // Consume operators with higher precedence.
3238       parse(Precedence + 1);
3239 
3240       int CurrentPrecedence = getCurrentPrecedence();
3241       if (Style.BreakBinaryOperations == FormatStyle::BBO_OnePerLine &&
3242           CurrentPrecedence > prec::Conditional &&
3243           CurrentPrecedence < prec::PointerToMember) {
3244         // When BreakBinaryOperations is set to BreakAll,
3245         // all operations will be on the same line or on individual lines.
3246         // Override precedence to avoid adding fake parenthesis which could
3247         // group operations of a different precedence level on the same line
3248         CurrentPrecedence = prec::Additive;
3249       }
3250 
3251       if (Precedence == CurrentPrecedence && Current &&
3252           Current->is(TT_SelectorName)) {
3253         if (LatestOperator)
3254           addFakeParenthesis(Start, prec::Level(Precedence));
3255         Start = Current;
3256       }
3257 
3258       if ((Style.isCSharp() || Style.isJavaScript() || Style.isJava()) &&
3259           Precedence == prec::Additive && Current) {
3260         // A string can be broken without parentheses around it when it is
3261         // already in a sequence of strings joined by `+` signs.
3262         FormatToken *Prev = Current->getPreviousNonComment();
3263         if (Prev && Prev->is(tok::string_literal) &&
3264             (Prev == Start || Prev->endsSequence(tok::string_literal, tok::plus,
3265                                                  TT_StringInConcatenation))) {
3266           Prev->setType(TT_StringInConcatenation);
3267         }
3268       }
3269 
3270       // At the end of the line or when an operator with lower precedence is
3271       // found, insert fake parenthesis and return.
3272       if (!Current ||
3273           (Current->closesScope() &&
3274            (Current->MatchingParen || Current->is(TT_TemplateString))) ||
3275           (CurrentPrecedence != -1 && CurrentPrecedence < Precedence) ||
3276           (CurrentPrecedence == prec::Conditional &&
3277            Precedence == prec::Assignment && Current->is(tok::colon))) {
3278         break;
3279       }
3280 
3281       // Consume scopes: (), [], <> and {}
3282       // In addition to that we handle require clauses as scope, so that the
3283       // constraints in that are correctly indented.
3284       if (Current->opensScope() ||
3285           Current->isOneOf(TT_RequiresClause,
3286                            TT_RequiresClauseInARequiresExpression)) {
3287         // In fragment of a JavaScript template string can look like '}..${' and
3288         // thus close a scope and open a new one at the same time.
3289         while (Current && (!Current->closesScope() || Current->opensScope())) {
3290           next();
3291           parse();
3292         }
3293         next();
3294       } else {
3295         // Operator found.
3296         if (CurrentPrecedence == Precedence) {
3297           if (LatestOperator)
3298             LatestOperator->NextOperator = Current;
3299           LatestOperator = Current;
3300           Current->OperatorIndex = OperatorIndex;
3301           ++OperatorIndex;
3302         }
3303         next(/*SkipPastLeadingComments=*/Precedence > 0);
3304       }
3305     }
3306 
3307     // Group variables of the same type.
3308     if (Style.isVerilog() && Precedence == prec::Comma && VerilogFirstOfType)
3309       addFakeParenthesis(VerilogFirstOfType, prec::Comma);
3310 
3311     if (LatestOperator && (Current || Precedence > 0)) {
3312       // The requires clauses do not neccessarily end in a semicolon or a brace,
3313       // but just go over to struct/class or a function declaration, we need to
3314       // intervene so that the fake right paren is inserted correctly.
3315       auto End =
3316           (Start->Previous &&
3317            Start->Previous->isOneOf(TT_RequiresClause,
3318                                     TT_RequiresClauseInARequiresExpression))
3319               ? [this]() {
3320                   auto Ret = Current ? Current : Line.Last;
3321                   while (!Ret->ClosesRequiresClause && Ret->Previous)
3322                     Ret = Ret->Previous;
3323                   return Ret;
3324                 }()
3325               : nullptr;
3326 
3327       if (Precedence == PrecedenceArrowAndPeriod) {
3328         // Call expressions don't have a binary operator precedence.
3329         addFakeParenthesis(Start, prec::Unknown, End);
3330       } else {
3331         addFakeParenthesis(Start, prec::Level(Precedence), End);
3332       }
3333     }
3334   }
3335 
3336 private:
3337   /// Gets the precedence (+1) of the given token for binary operators
3338   /// and other tokens that we treat like binary operators.
getCurrentPrecedence()3339   int getCurrentPrecedence() {
3340     if (Current) {
3341       const FormatToken *NextNonComment = Current->getNextNonComment();
3342       if (Current->is(TT_ConditionalExpr))
3343         return prec::Conditional;
3344       if (NextNonComment && Current->is(TT_SelectorName) &&
3345           (NextNonComment->isOneOf(TT_DictLiteral, TT_JsTypeColon) ||
3346            (Style.isProto() && NextNonComment->is(tok::less)))) {
3347         return prec::Assignment;
3348       }
3349       if (Current->is(TT_JsComputedPropertyName))
3350         return prec::Assignment;
3351       if (Current->is(TT_LambdaArrow))
3352         return prec::Comma;
3353       if (Current->is(TT_FatArrow))
3354         return prec::Assignment;
3355       if (Current->isOneOf(tok::semi, TT_InlineASMColon, TT_SelectorName) ||
3356           (Current->is(tok::comment) && NextNonComment &&
3357            NextNonComment->is(TT_SelectorName))) {
3358         return 0;
3359       }
3360       if (Current->is(TT_RangeBasedForLoopColon))
3361         return prec::Comma;
3362       if ((Style.isJava() || Style.isJavaScript()) &&
3363           Current->is(Keywords.kw_instanceof)) {
3364         return prec::Relational;
3365       }
3366       if (Style.isJavaScript() &&
3367           Current->isOneOf(Keywords.kw_in, Keywords.kw_as)) {
3368         return prec::Relational;
3369       }
3370       if (Current->is(TT_BinaryOperator) || Current->is(tok::comma))
3371         return Current->getPrecedence();
3372       if (Current->isOneOf(tok::period, tok::arrow) &&
3373           Current->isNot(TT_TrailingReturnArrow)) {
3374         return PrecedenceArrowAndPeriod;
3375       }
3376       if ((Style.isJava() || Style.isJavaScript()) &&
3377           Current->isOneOf(Keywords.kw_extends, Keywords.kw_implements,
3378                            Keywords.kw_throws)) {
3379         return 0;
3380       }
3381       // In Verilog case labels are not on separate lines straight out of
3382       // UnwrappedLineParser. The colon is not part of an expression.
3383       if (Style.isVerilog() && Current->is(tok::colon))
3384         return 0;
3385     }
3386     return -1;
3387   }
3388 
addFakeParenthesis(FormatToken * Start,prec::Level Precedence,FormatToken * End=nullptr)3389   void addFakeParenthesis(FormatToken *Start, prec::Level Precedence,
3390                           FormatToken *End = nullptr) {
3391     // Do not assign fake parenthesis to tokens that are part of an
3392     // unexpanded macro call. The line within the macro call contains
3393     // the parenthesis and commas, and we will not find operators within
3394     // that structure.
3395     if (Start->MacroParent)
3396       return;
3397 
3398     Start->FakeLParens.push_back(Precedence);
3399     if (Precedence > prec::Unknown)
3400       Start->StartsBinaryExpression = true;
3401     if (!End && Current)
3402       End = Current->getPreviousNonComment();
3403     if (End) {
3404       ++End->FakeRParens;
3405       if (Precedence > prec::Unknown)
3406         End->EndsBinaryExpression = true;
3407     }
3408   }
3409 
3410   /// Parse unary operator expressions and surround them with fake
3411   /// parentheses if appropriate.
parseUnaryOperator()3412   void parseUnaryOperator() {
3413     SmallVector<FormatToken *, 2> Tokens;
3414     while (Current && Current->is(TT_UnaryOperator)) {
3415       Tokens.push_back(Current);
3416       next();
3417     }
3418     parse(PrecedenceArrowAndPeriod);
3419     for (FormatToken *Token : reverse(Tokens)) {
3420       // The actual precedence doesn't matter.
3421       addFakeParenthesis(Token, prec::Unknown);
3422     }
3423   }
3424 
parseConditionalExpr()3425   void parseConditionalExpr() {
3426     while (Current && Current->isTrailingComment())
3427       next();
3428     FormatToken *Start = Current;
3429     parse(prec::LogicalOr);
3430     if (!Current || Current->isNot(tok::question))
3431       return;
3432     next();
3433     parse(prec::Assignment);
3434     if (!Current || Current->isNot(TT_ConditionalExpr))
3435       return;
3436     next();
3437     parse(prec::Assignment);
3438     addFakeParenthesis(Start, prec::Conditional);
3439   }
3440 
next(bool SkipPastLeadingComments=true)3441   void next(bool SkipPastLeadingComments = true) {
3442     if (Current)
3443       Current = Current->Next;
3444     while (Current &&
3445            (Current->NewlinesBefore == 0 || SkipPastLeadingComments) &&
3446            Current->isTrailingComment()) {
3447       Current = Current->Next;
3448     }
3449   }
3450 
3451   // Add fake parenthesis around declarations of the same type for example in a
3452   // module prototype. Return the first port / variable of the current type.
verilogGroupDecl(FormatToken * FirstOfType,FormatToken * PreviousComma)3453   FormatToken *verilogGroupDecl(FormatToken *FirstOfType,
3454                                 FormatToken *PreviousComma) {
3455     if (!Current)
3456       return nullptr;
3457 
3458     FormatToken *Start = Current;
3459 
3460     // Skip attributes.
3461     while (Start->startsSequence(tok::l_paren, tok::star)) {
3462       if (!(Start = Start->MatchingParen) ||
3463           !(Start = Start->getNextNonComment())) {
3464         return nullptr;
3465       }
3466     }
3467 
3468     FormatToken *Tok = Start;
3469 
3470     if (Tok->is(Keywords.kw_assign))
3471       Tok = Tok->getNextNonComment();
3472 
3473     // Skip any type qualifiers to find the first identifier. It may be either a
3474     // new type name or a variable name. There can be several type qualifiers
3475     // preceding a variable name, and we can not tell them apart by looking at
3476     // the word alone since a macro can be defined as either a type qualifier or
3477     // a variable name. Thus we use the last word before the dimensions instead
3478     // of the first word as the candidate for the variable or type name.
3479     FormatToken *First = nullptr;
3480     while (Tok) {
3481       FormatToken *Next = Tok->getNextNonComment();
3482 
3483       if (Tok->is(tok::hash)) {
3484         // Start of a macro expansion.
3485         First = Tok;
3486         Tok = Next;
3487         if (Tok)
3488           Tok = Tok->getNextNonComment();
3489       } else if (Tok->is(tok::hashhash)) {
3490         // Concatenation. Skip.
3491         Tok = Next;
3492         if (Tok)
3493           Tok = Tok->getNextNonComment();
3494       } else if (Keywords.isVerilogQualifier(*Tok) ||
3495                  Keywords.isVerilogIdentifier(*Tok)) {
3496         First = Tok;
3497         Tok = Next;
3498         // The name may have dots like `interface_foo.modport_foo`.
3499         while (Tok && Tok->isOneOf(tok::period, tok::coloncolon) &&
3500                (Tok = Tok->getNextNonComment())) {
3501           if (Keywords.isVerilogIdentifier(*Tok))
3502             Tok = Tok->getNextNonComment();
3503         }
3504       } else if (!Next) {
3505         Tok = nullptr;
3506       } else if (Tok->is(tok::l_paren)) {
3507         // Make sure the parenthesized list is a drive strength. Otherwise the
3508         // statement may be a module instantiation in which case we have already
3509         // found the instance name.
3510         if (Next->isOneOf(
3511                 Keywords.kw_highz0, Keywords.kw_highz1, Keywords.kw_large,
3512                 Keywords.kw_medium, Keywords.kw_pull0, Keywords.kw_pull1,
3513                 Keywords.kw_small, Keywords.kw_strong0, Keywords.kw_strong1,
3514                 Keywords.kw_supply0, Keywords.kw_supply1, Keywords.kw_weak0,
3515                 Keywords.kw_weak1)) {
3516           Tok->setType(TT_VerilogStrength);
3517           Tok = Tok->MatchingParen;
3518           if (Tok) {
3519             Tok->setType(TT_VerilogStrength);
3520             Tok = Tok->getNextNonComment();
3521           }
3522         } else {
3523           break;
3524         }
3525       } else if (Tok->is(Keywords.kw_verilogHash)) {
3526         // Delay control.
3527         if (Next->is(tok::l_paren))
3528           Next = Next->MatchingParen;
3529         if (Next)
3530           Tok = Next->getNextNonComment();
3531       } else {
3532         break;
3533       }
3534     }
3535 
3536     // Find the second identifier. If it exists it will be the name.
3537     FormatToken *Second = nullptr;
3538     // Dimensions.
3539     while (Tok && Tok->is(tok::l_square) && (Tok = Tok->MatchingParen))
3540       Tok = Tok->getNextNonComment();
3541     if (Tok && (Tok->is(tok::hash) || Keywords.isVerilogIdentifier(*Tok)))
3542       Second = Tok;
3543 
3544     // If the second identifier doesn't exist and there are qualifiers, the type
3545     // is implied.
3546     FormatToken *TypedName = nullptr;
3547     if (Second) {
3548       TypedName = Second;
3549       if (First && First->is(TT_Unknown))
3550         First->setType(TT_VerilogDimensionedTypeName);
3551     } else if (First != Start) {
3552       // If 'First' is null, then this isn't a declaration, 'TypedName' gets set
3553       // to null as intended.
3554       TypedName = First;
3555     }
3556 
3557     if (TypedName) {
3558       // This is a declaration with a new type.
3559       if (TypedName->is(TT_Unknown))
3560         TypedName->setType(TT_StartOfName);
3561       // Group variables of the previous type.
3562       if (FirstOfType && PreviousComma) {
3563         PreviousComma->setType(TT_VerilogTypeComma);
3564         addFakeParenthesis(FirstOfType, prec::Comma, PreviousComma->Previous);
3565       }
3566 
3567       FirstOfType = TypedName;
3568 
3569       // Don't let higher precedence handle the qualifiers. For example if we
3570       // have:
3571       //    parameter x = 0
3572       // We skip `parameter` here. This way the fake parentheses for the
3573       // assignment will be around `x = 0`.
3574       while (Current && Current != FirstOfType) {
3575         if (Current->opensScope()) {
3576           next();
3577           parse();
3578         }
3579         next();
3580       }
3581     }
3582 
3583     return FirstOfType;
3584   }
3585 
3586   const FormatStyle &Style;
3587   const AdditionalKeywords &Keywords;
3588   const AnnotatedLine &Line;
3589   FormatToken *Current;
3590 };
3591 
3592 } // end anonymous namespace
3593 
setCommentLineLevels(SmallVectorImpl<AnnotatedLine * > & Lines) const3594 void TokenAnnotator::setCommentLineLevels(
3595     SmallVectorImpl<AnnotatedLine *> &Lines) const {
3596   const AnnotatedLine *NextNonCommentLine = nullptr;
3597   for (AnnotatedLine *Line : reverse(Lines)) {
3598     assert(Line->First);
3599 
3600     // If the comment is currently aligned with the line immediately following
3601     // it, that's probably intentional and we should keep it.
3602     if (NextNonCommentLine && NextNonCommentLine->First->NewlinesBefore < 2 &&
3603         Line->isComment() && !isClangFormatOff(Line->First->TokenText) &&
3604         NextNonCommentLine->First->OriginalColumn ==
3605             Line->First->OriginalColumn) {
3606       const bool PPDirectiveOrImportStmt =
3607           NextNonCommentLine->Type == LT_PreprocessorDirective ||
3608           NextNonCommentLine->Type == LT_ImportStatement;
3609       if (PPDirectiveOrImportStmt)
3610         Line->Type = LT_CommentAbovePPDirective;
3611       // Align comments for preprocessor lines with the # in column 0 if
3612       // preprocessor lines are not indented. Otherwise, align with the next
3613       // line.
3614       Line->Level = Style.IndentPPDirectives != FormatStyle::PPDIS_BeforeHash &&
3615                             PPDirectiveOrImportStmt
3616                         ? 0
3617                         : NextNonCommentLine->Level;
3618     } else {
3619       NextNonCommentLine = Line->First->isNot(tok::r_brace) ? Line : nullptr;
3620     }
3621 
3622     setCommentLineLevels(Line->Children);
3623   }
3624 }
3625 
maxNestingDepth(const AnnotatedLine & Line)3626 static unsigned maxNestingDepth(const AnnotatedLine &Line) {
3627   unsigned Result = 0;
3628   for (const auto *Tok = Line.First; Tok; Tok = Tok->Next)
3629     Result = std::max(Result, Tok->NestingLevel);
3630   return Result;
3631 }
3632 
3633 // Returns the name of a function with no return type, e.g. a constructor or
3634 // destructor.
getFunctionName(const AnnotatedLine & Line,FormatToken * & OpeningParen)3635 static FormatToken *getFunctionName(const AnnotatedLine &Line,
3636                                     FormatToken *&OpeningParen) {
3637   for (FormatToken *Tok = Line.getFirstNonComment(), *Name = nullptr; Tok;
3638        Tok = Tok->getNextNonComment()) {
3639     // Skip C++11 attributes both before and after the function name.
3640     if (Tok->is(tok::l_square) && Tok->is(TT_AttributeSquare)) {
3641       Tok = Tok->MatchingParen;
3642       if (!Tok)
3643         break;
3644       continue;
3645     }
3646 
3647     // Make sure the name is followed by a pair of parentheses.
3648     if (Name) {
3649       if (Tok->is(tok::l_paren) && Tok->is(TT_Unknown) && Tok->MatchingParen) {
3650         OpeningParen = Tok;
3651         return Name;
3652       }
3653       return nullptr;
3654     }
3655 
3656     // Skip keywords that may precede the constructor/destructor name.
3657     if (Tok->isOneOf(tok::kw_friend, tok::kw_inline, tok::kw_virtual,
3658                      tok::kw_constexpr, tok::kw_consteval, tok::kw_explicit)) {
3659       continue;
3660     }
3661 
3662     // A qualified name may start from the global namespace.
3663     if (Tok->is(tok::coloncolon)) {
3664       Tok = Tok->Next;
3665       if (!Tok)
3666         break;
3667     }
3668 
3669     // Skip to the unqualified part of the name.
3670     while (Tok->startsSequence(tok::identifier, tok::coloncolon)) {
3671       assert(Tok->Next);
3672       Tok = Tok->Next->Next;
3673       if (!Tok)
3674         return nullptr;
3675     }
3676 
3677     // Skip the `~` if a destructor name.
3678     if (Tok->is(tok::tilde)) {
3679       Tok = Tok->Next;
3680       if (!Tok)
3681         break;
3682     }
3683 
3684     // Make sure the name is not already annotated, e.g. as NamespaceMacro.
3685     if (Tok->isNot(tok::identifier) || Tok->isNot(TT_Unknown))
3686       break;
3687 
3688     Name = Tok;
3689   }
3690 
3691   return nullptr;
3692 }
3693 
3694 // Checks if Tok is a constructor/destructor name qualified by its class name.
isCtorOrDtorName(const FormatToken * Tok)3695 static bool isCtorOrDtorName(const FormatToken *Tok) {
3696   assert(Tok && Tok->is(tok::identifier));
3697   const auto *Prev = Tok->Previous;
3698 
3699   if (Prev && Prev->is(tok::tilde))
3700     Prev = Prev->Previous;
3701 
3702   if (!Prev || !Prev->endsSequence(tok::coloncolon, tok::identifier))
3703     return false;
3704 
3705   assert(Prev->Previous);
3706   return Prev->Previous->TokenText == Tok->TokenText;
3707 }
3708 
annotate(AnnotatedLine & Line)3709 void TokenAnnotator::annotate(AnnotatedLine &Line) {
3710   if (!Line.InMacroBody)
3711     MacroBodyScopes.clear();
3712 
3713   auto &ScopeStack = Line.InMacroBody ? MacroBodyScopes : Scopes;
3714   AnnotatingParser Parser(Style, Line, Keywords, ScopeStack);
3715   Line.Type = Parser.parseLine();
3716 
3717   if (!Line.Children.empty()) {
3718     ScopeStack.push_back(ST_Other);
3719     const bool InRequiresExpression = Line.Type == LT_RequiresExpression;
3720     for (auto &Child : Line.Children) {
3721       if (InRequiresExpression &&
3722           !Child->First->isOneOf(tok::kw_typename, tok::kw_requires,
3723                                  TT_CompoundRequirementLBrace)) {
3724         Child->Type = LT_SimpleRequirement;
3725       }
3726       annotate(*Child);
3727     }
3728     // ScopeStack can become empty if Child has an unmatched `}`.
3729     if (!ScopeStack.empty())
3730       ScopeStack.pop_back();
3731   }
3732 
3733   // With very deep nesting, ExpressionParser uses lots of stack and the
3734   // formatting algorithm is very slow. We're not going to do a good job here
3735   // anyway - it's probably generated code being formatted by mistake.
3736   // Just skip the whole line.
3737   if (maxNestingDepth(Line) > 50)
3738     Line.Type = LT_Invalid;
3739 
3740   if (Line.Type == LT_Invalid)
3741     return;
3742 
3743   ExpressionParser ExprParser(Style, Keywords, Line);
3744   ExprParser.parse();
3745 
3746   if (IsCpp) {
3747     FormatToken *OpeningParen = nullptr;
3748     auto *Tok = getFunctionName(Line, OpeningParen);
3749     if (Tok && ((!ScopeStack.empty() && ScopeStack.back() == ST_Class) ||
3750                 Line.endsWith(TT_FunctionLBrace) || isCtorOrDtorName(Tok))) {
3751       Tok->setFinalizedType(TT_CtorDtorDeclName);
3752       assert(OpeningParen);
3753       OpeningParen->setFinalizedType(TT_FunctionDeclarationLParen);
3754     }
3755   }
3756 
3757   if (Line.startsWith(TT_ObjCMethodSpecifier))
3758     Line.Type = LT_ObjCMethodDecl;
3759   else if (Line.startsWith(TT_ObjCDecl))
3760     Line.Type = LT_ObjCDecl;
3761   else if (Line.startsWith(TT_ObjCProperty))
3762     Line.Type = LT_ObjCProperty;
3763 
3764   auto *First = Line.First;
3765   First->SpacesRequiredBefore = 1;
3766   First->CanBreakBefore = First->MustBreakBefore;
3767 }
3768 
3769 // This function heuristically determines whether 'Current' starts the name of a
3770 // function declaration.
isFunctionDeclarationName(const LangOptions & LangOpts,const FormatToken & Current,const AnnotatedLine & Line,FormatToken * & ClosingParen)3771 static bool isFunctionDeclarationName(const LangOptions &LangOpts,
3772                                       const FormatToken &Current,
3773                                       const AnnotatedLine &Line,
3774                                       FormatToken *&ClosingParen) {
3775   if (Current.is(TT_FunctionDeclarationName))
3776     return true;
3777 
3778   if (!Current.isOneOf(tok::identifier, tok::kw_operator))
3779     return false;
3780 
3781   const auto *Prev = Current.getPreviousNonComment();
3782   assert(Prev);
3783 
3784   const auto &Previous = *Prev;
3785 
3786   if (const auto *PrevPrev = Previous.getPreviousNonComment();
3787       PrevPrev && PrevPrev->is(TT_ObjCDecl)) {
3788     return false;
3789   }
3790 
3791   auto skipOperatorName =
3792       [&LangOpts](const FormatToken *Next) -> const FormatToken * {
3793     for (; Next; Next = Next->Next) {
3794       if (Next->is(TT_OverloadedOperatorLParen))
3795         return Next;
3796       if (Next->is(TT_OverloadedOperator))
3797         continue;
3798       if (Next->isPlacementOperator() || Next->is(tok::kw_co_await)) {
3799         // For 'new[]' and 'delete[]'.
3800         if (Next->Next &&
3801             Next->Next->startsSequence(tok::l_square, tok::r_square)) {
3802           Next = Next->Next->Next;
3803         }
3804         continue;
3805       }
3806       if (Next->startsSequence(tok::l_square, tok::r_square)) {
3807         // For operator[]().
3808         Next = Next->Next;
3809         continue;
3810       }
3811       if ((Next->isTypeName(LangOpts) || Next->is(tok::identifier)) &&
3812           Next->Next && Next->Next->isPointerOrReference()) {
3813         // For operator void*(), operator char*(), operator Foo*().
3814         Next = Next->Next;
3815         continue;
3816       }
3817       if (Next->is(TT_TemplateOpener) && Next->MatchingParen) {
3818         Next = Next->MatchingParen;
3819         continue;
3820       }
3821 
3822       break;
3823     }
3824     return nullptr;
3825   };
3826 
3827   const auto *Next = Current.Next;
3828   const bool IsCpp = LangOpts.CXXOperatorNames || LangOpts.C11;
3829 
3830   // Find parentheses of parameter list.
3831   if (Current.is(tok::kw_operator)) {
3832     if (Line.startsWith(tok::kw_friend))
3833       return true;
3834     if (Previous.Tok.getIdentifierInfo() &&
3835         !Previous.isOneOf(tok::kw_return, tok::kw_co_return)) {
3836       return true;
3837     }
3838     if (Previous.is(tok::r_paren) && Previous.is(TT_TypeDeclarationParen)) {
3839       assert(Previous.MatchingParen);
3840       assert(Previous.MatchingParen->is(tok::l_paren));
3841       assert(Previous.MatchingParen->is(TT_TypeDeclarationParen));
3842       return true;
3843     }
3844     if (!Previous.isPointerOrReference() && Previous.isNot(TT_TemplateCloser))
3845       return false;
3846     Next = skipOperatorName(Next);
3847   } else {
3848     if (Current.isNot(TT_StartOfName) || Current.NestingLevel != 0)
3849       return false;
3850     while (Next && Next->startsSequence(tok::hashhash, tok::identifier))
3851       Next = Next->Next->Next;
3852     for (; Next; Next = Next->Next) {
3853       if (Next->is(TT_TemplateOpener) && Next->MatchingParen) {
3854         Next = Next->MatchingParen;
3855       } else if (Next->is(tok::coloncolon)) {
3856         Next = Next->Next;
3857         if (!Next)
3858           return false;
3859         if (Next->is(tok::kw_operator)) {
3860           Next = skipOperatorName(Next->Next);
3861           break;
3862         }
3863         if (Next->isNot(tok::identifier))
3864           return false;
3865       } else if (isCppAttribute(IsCpp, *Next)) {
3866         Next = Next->MatchingParen;
3867         if (!Next)
3868           return false;
3869       } else if (Next->is(tok::l_paren)) {
3870         break;
3871       } else {
3872         return false;
3873       }
3874     }
3875   }
3876 
3877   // Check whether parameter list can belong to a function declaration.
3878   if (!Next || Next->isNot(tok::l_paren) || !Next->MatchingParen)
3879     return false;
3880   ClosingParen = Next->MatchingParen;
3881   assert(ClosingParen->is(tok::r_paren));
3882   // If the lines ends with "{", this is likely a function definition.
3883   if (Line.Last->is(tok::l_brace))
3884     return true;
3885   if (Next->Next == ClosingParen)
3886     return true; // Empty parentheses.
3887   // If there is an &/&& after the r_paren, this is likely a function.
3888   if (ClosingParen->Next && ClosingParen->Next->is(TT_PointerOrReference))
3889     return true;
3890 
3891   // Check for K&R C function definitions (and C++ function definitions with
3892   // unnamed parameters), e.g.:
3893   //   int f(i)
3894   //   {
3895   //     return i + 1;
3896   //   }
3897   //   bool g(size_t = 0, bool b = false)
3898   //   {
3899   //     return !b;
3900   //   }
3901   if (IsCpp && Next->Next && Next->Next->is(tok::identifier) &&
3902       !Line.endsWith(tok::semi)) {
3903     return true;
3904   }
3905 
3906   for (const FormatToken *Tok = Next->Next; Tok && Tok != ClosingParen;
3907        Tok = Tok->Next) {
3908     if (Tok->is(TT_TypeDeclarationParen))
3909       return true;
3910     if (Tok->isOneOf(tok::l_paren, TT_TemplateOpener) && Tok->MatchingParen) {
3911       Tok = Tok->MatchingParen;
3912       continue;
3913     }
3914     if (Tok->is(tok::kw_const) || Tok->isTypeName(LangOpts) ||
3915         Tok->isOneOf(TT_PointerOrReference, TT_StartOfName, tok::ellipsis)) {
3916       return true;
3917     }
3918     if (Tok->isOneOf(tok::l_brace, TT_ObjCMethodExpr) || Tok->Tok.isLiteral())
3919       return false;
3920   }
3921   return false;
3922 }
3923 
mustBreakForReturnType(const AnnotatedLine & Line) const3924 bool TokenAnnotator::mustBreakForReturnType(const AnnotatedLine &Line) const {
3925   assert(Line.MightBeFunctionDecl);
3926 
3927   if ((Style.BreakAfterReturnType == FormatStyle::RTBS_TopLevel ||
3928        Style.BreakAfterReturnType == FormatStyle::RTBS_TopLevelDefinitions) &&
3929       Line.Level > 0) {
3930     return false;
3931   }
3932 
3933   switch (Style.BreakAfterReturnType) {
3934   case FormatStyle::RTBS_None:
3935   case FormatStyle::RTBS_Automatic:
3936   case FormatStyle::RTBS_ExceptShortType:
3937     return false;
3938   case FormatStyle::RTBS_All:
3939   case FormatStyle::RTBS_TopLevel:
3940     return true;
3941   case FormatStyle::RTBS_AllDefinitions:
3942   case FormatStyle::RTBS_TopLevelDefinitions:
3943     return Line.mightBeFunctionDefinition();
3944   }
3945 
3946   return false;
3947 }
3948 
calculateFormattingInformation(AnnotatedLine & Line) const3949 void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) const {
3950   if (Line.Computed)
3951     return;
3952 
3953   Line.Computed = true;
3954 
3955   for (AnnotatedLine *ChildLine : Line.Children)
3956     calculateFormattingInformation(*ChildLine);
3957 
3958   auto *First = Line.First;
3959   First->TotalLength = First->IsMultiline
3960                            ? Style.ColumnLimit
3961                            : Line.FirstStartColumn + First->ColumnWidth;
3962   bool AlignArrayOfStructures =
3963       (Style.AlignArrayOfStructures != FormatStyle::AIAS_None &&
3964        Line.Type == LT_ArrayOfStructInitializer);
3965   if (AlignArrayOfStructures)
3966     calculateArrayInitializerColumnList(Line);
3967 
3968   const auto *FirstNonComment = Line.getFirstNonComment();
3969   bool SeenName = false;
3970   bool LineIsFunctionDeclaration = false;
3971   FormatToken *AfterLastAttribute = nullptr;
3972   FormatToken *ClosingParen = nullptr;
3973 
3974   for (auto *Tok = FirstNonComment && FirstNonComment->isNot(tok::kw_using)
3975                        ? FirstNonComment->Next
3976                        : nullptr;
3977        Tok && Tok->isNot(BK_BracedInit); Tok = Tok->Next) {
3978     if (Tok->is(TT_StartOfName))
3979       SeenName = true;
3980     if (Tok->Previous->EndsCppAttributeGroup)
3981       AfterLastAttribute = Tok;
3982     if (const bool IsCtorOrDtor = Tok->is(TT_CtorDtorDeclName);
3983         IsCtorOrDtor ||
3984         isFunctionDeclarationName(LangOpts, *Tok, Line, ClosingParen)) {
3985       if (!IsCtorOrDtor)
3986         Tok->setFinalizedType(TT_FunctionDeclarationName);
3987       LineIsFunctionDeclaration = true;
3988       SeenName = true;
3989       if (ClosingParen) {
3990         auto *OpeningParen = ClosingParen->MatchingParen;
3991         assert(OpeningParen);
3992         if (OpeningParen->is(TT_Unknown))
3993           OpeningParen->setType(TT_FunctionDeclarationLParen);
3994       }
3995       break;
3996     }
3997   }
3998 
3999   if (IsCpp) {
4000     if ((LineIsFunctionDeclaration ||
4001          (FirstNonComment && FirstNonComment->is(TT_CtorDtorDeclName))) &&
4002         Line.endsWith(tok::semi, tok::r_brace)) {
4003       auto *Tok = Line.Last->Previous;
4004       while (Tok->isNot(tok::r_brace))
4005         Tok = Tok->Previous;
4006       if (auto *LBrace = Tok->MatchingParen; LBrace && LBrace->is(TT_Unknown)) {
4007         assert(LBrace->is(tok::l_brace));
4008         Tok->setBlockKind(BK_Block);
4009         LBrace->setBlockKind(BK_Block);
4010         LBrace->setFinalizedType(TT_FunctionLBrace);
4011       }
4012     }
4013 
4014     if (SeenName && AfterLastAttribute &&
4015         mustBreakAfterAttributes(*AfterLastAttribute, Style)) {
4016       AfterLastAttribute->MustBreakBefore = true;
4017       if (LineIsFunctionDeclaration)
4018         Line.ReturnTypeWrapped = true;
4019     }
4020 
4021     if (!LineIsFunctionDeclaration) {
4022       // Annotate */&/&& in `operator` function calls as binary operators.
4023       for (const auto *Tok = FirstNonComment; Tok; Tok = Tok->Next) {
4024         if (Tok->isNot(tok::kw_operator))
4025           continue;
4026         do {
4027           Tok = Tok->Next;
4028         } while (Tok && Tok->isNot(TT_OverloadedOperatorLParen));
4029         if (!Tok || !Tok->MatchingParen)
4030           break;
4031         const auto *LeftParen = Tok;
4032         for (Tok = Tok->Next; Tok && Tok != LeftParen->MatchingParen;
4033              Tok = Tok->Next) {
4034           if (Tok->isNot(tok::identifier))
4035             continue;
4036           auto *Next = Tok->Next;
4037           const bool NextIsBinaryOperator =
4038               Next && Next->isPointerOrReference() && Next->Next &&
4039               Next->Next->is(tok::identifier);
4040           if (!NextIsBinaryOperator)
4041             continue;
4042           Next->setType(TT_BinaryOperator);
4043           Tok = Next;
4044         }
4045       }
4046     } else if (ClosingParen) {
4047       for (auto *Tok = ClosingParen->Next; Tok; Tok = Tok->Next) {
4048         if (Tok->is(TT_CtorInitializerColon))
4049           break;
4050         if (Tok->is(tok::arrow)) {
4051           Tok->setType(TT_TrailingReturnArrow);
4052           break;
4053         }
4054         if (Tok->isNot(TT_TrailingAnnotation))
4055           continue;
4056         const auto *Next = Tok->Next;
4057         if (!Next || Next->isNot(tok::l_paren))
4058           continue;
4059         Tok = Next->MatchingParen;
4060         if (!Tok)
4061           break;
4062       }
4063     }
4064   }
4065 
4066   if (First->is(TT_ElseLBrace)) {
4067     First->CanBreakBefore = true;
4068     First->MustBreakBefore = true;
4069   }
4070 
4071   bool InFunctionDecl = Line.MightBeFunctionDecl;
4072   bool InParameterList = false;
4073   for (auto *Current = First->Next; Current; Current = Current->Next) {
4074     const FormatToken *Prev = Current->Previous;
4075     if (Current->is(TT_LineComment)) {
4076       if (Prev->is(BK_BracedInit) && Prev->opensScope()) {
4077         Current->SpacesRequiredBefore =
4078             (Style.Cpp11BracedListStyle && !Style.SpacesInParensOptions.Other)
4079                 ? 0
4080                 : 1;
4081       } else if (Prev->is(TT_VerilogMultiLineListLParen)) {
4082         Current->SpacesRequiredBefore = 0;
4083       } else {
4084         Current->SpacesRequiredBefore = Style.SpacesBeforeTrailingComments;
4085       }
4086 
4087       // If we find a trailing comment, iterate backwards to determine whether
4088       // it seems to relate to a specific parameter. If so, break before that
4089       // parameter to avoid changing the comment's meaning. E.g. don't move 'b'
4090       // to the previous line in:
4091       //   SomeFunction(a,
4092       //                b, // comment
4093       //                c);
4094       if (!Current->HasUnescapedNewline) {
4095         for (FormatToken *Parameter = Current->Previous; Parameter;
4096              Parameter = Parameter->Previous) {
4097           if (Parameter->isOneOf(tok::comment, tok::r_brace))
4098             break;
4099           if (Parameter->Previous && Parameter->Previous->is(tok::comma)) {
4100             if (Parameter->Previous->isNot(TT_CtorInitializerComma) &&
4101                 Parameter->HasUnescapedNewline) {
4102               Parameter->MustBreakBefore = true;
4103             }
4104             break;
4105           }
4106         }
4107       }
4108     } else if (!Current->Finalized && Current->SpacesRequiredBefore == 0 &&
4109                spaceRequiredBefore(Line, *Current)) {
4110       Current->SpacesRequiredBefore = 1;
4111     }
4112 
4113     const auto &Children = Prev->Children;
4114     if (!Children.empty() && Children.back()->Last->is(TT_LineComment)) {
4115       Current->MustBreakBefore = true;
4116     } else {
4117       Current->MustBreakBefore =
4118           Current->MustBreakBefore || mustBreakBefore(Line, *Current);
4119       if (!Current->MustBreakBefore && InFunctionDecl &&
4120           Current->is(TT_FunctionDeclarationName)) {
4121         Current->MustBreakBefore = mustBreakForReturnType(Line);
4122       }
4123     }
4124 
4125     Current->CanBreakBefore =
4126         Current->MustBreakBefore || canBreakBefore(Line, *Current);
4127 
4128     if (Current->is(TT_FunctionDeclarationLParen)) {
4129       InParameterList = true;
4130     } else if (Current->is(tok::r_paren)) {
4131       const auto *LParen = Current->MatchingParen;
4132       if (LParen && LParen->is(TT_FunctionDeclarationLParen))
4133         InParameterList = false;
4134     } else if (InParameterList &&
4135                Current->endsSequence(TT_AttributeMacro,
4136                                      TT_PointerOrReference)) {
4137       Current->CanBreakBefore = false;
4138     }
4139 
4140     unsigned ChildSize = 0;
4141     if (Prev->Children.size() == 1) {
4142       FormatToken &LastOfChild = *Prev->Children[0]->Last;
4143       ChildSize = LastOfChild.isTrailingComment() ? Style.ColumnLimit
4144                                                   : LastOfChild.TotalLength + 1;
4145     }
4146     if (Current->MustBreakBefore || Prev->Children.size() > 1 ||
4147         (Prev->Children.size() == 1 &&
4148          Prev->Children[0]->First->MustBreakBefore) ||
4149         Current->IsMultiline) {
4150       Current->TotalLength = Prev->TotalLength + Style.ColumnLimit;
4151     } else {
4152       Current->TotalLength = Prev->TotalLength + Current->ColumnWidth +
4153                              ChildSize + Current->SpacesRequiredBefore;
4154     }
4155 
4156     if (Current->is(TT_ControlStatementLBrace)) {
4157       if (Style.ColumnLimit > 0 &&
4158           Style.BraceWrapping.AfterControlStatement ==
4159               FormatStyle::BWACS_MultiLine &&
4160           Line.Level * Style.IndentWidth + Line.Last->TotalLength >
4161               Style.ColumnLimit) {
4162         Current->CanBreakBefore = true;
4163         Current->MustBreakBefore = true;
4164       }
4165     } else if (Current->is(TT_CtorInitializerColon)) {
4166       InFunctionDecl = false;
4167     }
4168 
4169     // FIXME: Only calculate this if CanBreakBefore is true once static
4170     // initializers etc. are sorted out.
4171     // FIXME: Move magic numbers to a better place.
4172 
4173     // Reduce penalty for aligning ObjC method arguments using the colon
4174     // alignment as this is the canonical way (still prefer fitting everything
4175     // into one line if possible). Trying to fit a whole expression into one
4176     // line should not force other line breaks (e.g. when ObjC method
4177     // expression is a part of other expression).
4178     Current->SplitPenalty = splitPenalty(Line, *Current, InFunctionDecl);
4179     if (Style.Language == FormatStyle::LK_ObjC &&
4180         Current->is(TT_SelectorName) && Current->ParameterIndex > 0) {
4181       if (Current->ParameterIndex == 1)
4182         Current->SplitPenalty += 5 * Current->BindingStrength;
4183     } else {
4184       Current->SplitPenalty += 20 * Current->BindingStrength;
4185     }
4186   }
4187 
4188   calculateUnbreakableTailLengths(Line);
4189   unsigned IndentLevel = Line.Level;
4190   for (auto *Current = First; Current; Current = Current->Next) {
4191     if (Current->Role)
4192       Current->Role->precomputeFormattingInfos(Current);
4193     if (Current->MatchingParen &&
4194         Current->MatchingParen->opensBlockOrBlockTypeList(Style) &&
4195         IndentLevel > 0) {
4196       --IndentLevel;
4197     }
4198     Current->IndentLevel = IndentLevel;
4199     if (Current->opensBlockOrBlockTypeList(Style))
4200       ++IndentLevel;
4201   }
4202 
4203   LLVM_DEBUG({ printDebugInfo(Line); });
4204 }
4205 
calculateUnbreakableTailLengths(AnnotatedLine & Line) const4206 void TokenAnnotator::calculateUnbreakableTailLengths(
4207     AnnotatedLine &Line) const {
4208   unsigned UnbreakableTailLength = 0;
4209   FormatToken *Current = Line.Last;
4210   while (Current) {
4211     Current->UnbreakableTailLength = UnbreakableTailLength;
4212     if (Current->CanBreakBefore ||
4213         Current->isOneOf(tok::comment, tok::string_literal)) {
4214       UnbreakableTailLength = 0;
4215     } else {
4216       UnbreakableTailLength +=
4217           Current->ColumnWidth + Current->SpacesRequiredBefore;
4218     }
4219     Current = Current->Previous;
4220   }
4221 }
4222 
calculateArrayInitializerColumnList(AnnotatedLine & Line) const4223 void TokenAnnotator::calculateArrayInitializerColumnList(
4224     AnnotatedLine &Line) const {
4225   if (Line.First == Line.Last)
4226     return;
4227   auto *CurrentToken = Line.First;
4228   CurrentToken->ArrayInitializerLineStart = true;
4229   unsigned Depth = 0;
4230   while (CurrentToken && CurrentToken != Line.Last) {
4231     if (CurrentToken->is(tok::l_brace)) {
4232       CurrentToken->IsArrayInitializer = true;
4233       if (CurrentToken->Next)
4234         CurrentToken->Next->MustBreakBefore = true;
4235       CurrentToken =
4236           calculateInitializerColumnList(Line, CurrentToken->Next, Depth + 1);
4237     } else {
4238       CurrentToken = CurrentToken->Next;
4239     }
4240   }
4241 }
4242 
calculateInitializerColumnList(AnnotatedLine & Line,FormatToken * CurrentToken,unsigned Depth) const4243 FormatToken *TokenAnnotator::calculateInitializerColumnList(
4244     AnnotatedLine &Line, FormatToken *CurrentToken, unsigned Depth) const {
4245   while (CurrentToken && CurrentToken != Line.Last) {
4246     if (CurrentToken->is(tok::l_brace))
4247       ++Depth;
4248     else if (CurrentToken->is(tok::r_brace))
4249       --Depth;
4250     if (Depth == 2 && CurrentToken->isOneOf(tok::l_brace, tok::comma)) {
4251       CurrentToken = CurrentToken->Next;
4252       if (!CurrentToken)
4253         break;
4254       CurrentToken->StartsColumn = true;
4255       CurrentToken = CurrentToken->Previous;
4256     }
4257     CurrentToken = CurrentToken->Next;
4258   }
4259   return CurrentToken;
4260 }
4261 
splitPenalty(const AnnotatedLine & Line,const FormatToken & Tok,bool InFunctionDecl) const4262 unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line,
4263                                       const FormatToken &Tok,
4264                                       bool InFunctionDecl) const {
4265   const FormatToken &Left = *Tok.Previous;
4266   const FormatToken &Right = Tok;
4267 
4268   if (Left.is(tok::semi))
4269     return 0;
4270 
4271   // Language specific handling.
4272   if (Style.isJava()) {
4273     if (Right.isOneOf(Keywords.kw_extends, Keywords.kw_throws))
4274       return 1;
4275     if (Right.is(Keywords.kw_implements))
4276       return 2;
4277     if (Left.is(tok::comma) && Left.NestingLevel == 0)
4278       return 3;
4279   } else if (Style.isJavaScript()) {
4280     if (Right.is(Keywords.kw_function) && Left.isNot(tok::comma))
4281       return 100;
4282     if (Left.is(TT_JsTypeColon))
4283       return 35;
4284     if ((Left.is(TT_TemplateString) && Left.TokenText.ends_with("${")) ||
4285         (Right.is(TT_TemplateString) && Right.TokenText.starts_with("}"))) {
4286       return 100;
4287     }
4288     // Prefer breaking call chains (".foo") over empty "{}", "[]" or "()".
4289     if (Left.opensScope() && Right.closesScope())
4290       return 200;
4291   } else if (Style.Language == FormatStyle::LK_Proto) {
4292     if (Right.is(tok::l_square))
4293       return 1;
4294     if (Right.is(tok::period))
4295       return 500;
4296   }
4297 
4298   if (Right.is(tok::identifier) && Right.Next && Right.Next->is(TT_DictLiteral))
4299     return 1;
4300   if (Right.is(tok::l_square)) {
4301     if (Left.is(tok::r_square))
4302       return 200;
4303     // Slightly prefer formatting local lambda definitions like functions.
4304     if (Right.is(TT_LambdaLSquare) && Left.is(tok::equal))
4305       return 35;
4306     if (!Right.isOneOf(TT_ObjCMethodExpr, TT_LambdaLSquare,
4307                        TT_ArrayInitializerLSquare,
4308                        TT_DesignatedInitializerLSquare, TT_AttributeSquare)) {
4309       return 500;
4310     }
4311   }
4312 
4313   if (Left.is(tok::coloncolon))
4314     return Style.PenaltyBreakScopeResolution;
4315   if (Right.isOneOf(TT_StartOfName, TT_FunctionDeclarationName) ||
4316       Right.is(tok::kw_operator)) {
4317     if (Line.startsWith(tok::kw_for) && Right.PartOfMultiVariableDeclStmt)
4318       return 3;
4319     if (Left.is(TT_StartOfName))
4320       return 110;
4321     if (InFunctionDecl && Right.NestingLevel == 0)
4322       return Style.PenaltyReturnTypeOnItsOwnLine;
4323     return 200;
4324   }
4325   if (Right.is(TT_PointerOrReference))
4326     return 190;
4327   if (Right.is(TT_LambdaArrow))
4328     return 110;
4329   if (Left.is(tok::equal) && Right.is(tok::l_brace))
4330     return 160;
4331   if (Left.is(TT_CastRParen))
4332     return 100;
4333   if (Left.isOneOf(tok::kw_class, tok::kw_struct, tok::kw_union))
4334     return 5000;
4335   if (Left.is(tok::comment))
4336     return 1000;
4337 
4338   if (Left.isOneOf(TT_RangeBasedForLoopColon, TT_InheritanceColon,
4339                    TT_CtorInitializerColon)) {
4340     return 2;
4341   }
4342 
4343   if (Right.isMemberAccess()) {
4344     // Breaking before the "./->" of a chained call/member access is reasonably
4345     // cheap, as formatting those with one call per line is generally
4346     // desirable. In particular, it should be cheaper to break before the call
4347     // than it is to break inside a call's parameters, which could lead to weird
4348     // "hanging" indents. The exception is the very last "./->" to support this
4349     // frequent pattern:
4350     //
4351     //   aaaaaaaa.aaaaaaaa.bbbbbbb().ccccccccccccccccccccc(
4352     //       dddddddd);
4353     //
4354     // which might otherwise be blown up onto many lines. Here, clang-format
4355     // won't produce "hanging" indents anyway as there is no other trailing
4356     // call.
4357     //
4358     // Also apply higher penalty is not a call as that might lead to a wrapping
4359     // like:
4360     //
4361     //   aaaaaaa
4362     //       .aaaaaaaaa.bbbbbbbb(cccccccc);
4363     const auto *NextOperator = Right.NextOperator;
4364     const auto Penalty = Style.PenaltyBreakBeforeMemberAccess;
4365     return NextOperator && NextOperator->Previous->closesScope()
4366                ? std::min(Penalty, 35u)
4367                : Penalty;
4368   }
4369 
4370   if (Right.is(TT_TrailingAnnotation) &&
4371       (!Right.Next || Right.Next->isNot(tok::l_paren))) {
4372     // Moving trailing annotations to the next line is fine for ObjC method
4373     // declarations.
4374     if (Line.startsWith(TT_ObjCMethodSpecifier))
4375       return 10;
4376     // Generally, breaking before a trailing annotation is bad unless it is
4377     // function-like. It seems to be especially preferable to keep standard
4378     // annotations (i.e. "const", "final" and "override") on the same line.
4379     // Use a slightly higher penalty after ")" so that annotations like
4380     // "const override" are kept together.
4381     bool is_short_annotation = Right.TokenText.size() < 10;
4382     return (Left.is(tok::r_paren) ? 100 : 120) + (is_short_annotation ? 50 : 0);
4383   }
4384 
4385   // In for-loops, prefer breaking at ',' and ';'.
4386   if (Line.startsWith(tok::kw_for) && Left.is(tok::equal))
4387     return 4;
4388 
4389   // In Objective-C method expressions, prefer breaking before "param:" over
4390   // breaking after it.
4391   if (Right.is(TT_SelectorName))
4392     return 0;
4393   if (Left.is(tok::colon) && Left.is(TT_ObjCMethodExpr))
4394     return Line.MightBeFunctionDecl ? 50 : 500;
4395 
4396   // In Objective-C type declarations, avoid breaking after the category's
4397   // open paren (we'll prefer breaking after the protocol list's opening
4398   // angle bracket, if present).
4399   if (Line.Type == LT_ObjCDecl && Left.is(tok::l_paren) && Left.Previous &&
4400       Left.Previous->isOneOf(tok::identifier, tok::greater)) {
4401     return 500;
4402   }
4403 
4404   if (Left.is(tok::l_paren) && Style.PenaltyBreakOpenParenthesis != 0)
4405     return Style.PenaltyBreakOpenParenthesis;
4406   if (Left.is(tok::l_paren) && InFunctionDecl &&
4407       Style.AlignAfterOpenBracket != FormatStyle::BAS_DontAlign) {
4408     return 100;
4409   }
4410   if (Left.is(tok::l_paren) && Left.Previous &&
4411       (Left.Previous->isOneOf(tok::kw_for, tok::kw__Generic) ||
4412        Left.Previous->isIf())) {
4413     return 1000;
4414   }
4415   if (Left.is(tok::equal) && InFunctionDecl)
4416     return 110;
4417   if (Right.is(tok::r_brace))
4418     return 1;
4419   if (Left.is(TT_TemplateOpener))
4420     return 100;
4421   if (Left.opensScope()) {
4422     // If we aren't aligning after opening parens/braces we can always break
4423     // here unless the style does not want us to place all arguments on the
4424     // next line.
4425     if (Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign &&
4426         (Left.ParameterCount <= 1 || Style.AllowAllArgumentsOnNextLine)) {
4427       return 0;
4428     }
4429     if (Left.is(tok::l_brace) && !Style.Cpp11BracedListStyle)
4430       return 19;
4431     return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter
4432                                    : 19;
4433   }
4434   if (Left.is(TT_JavaAnnotation))
4435     return 50;
4436 
4437   if (Left.is(TT_UnaryOperator))
4438     return 60;
4439   if (Left.isOneOf(tok::plus, tok::comma) && Left.Previous &&
4440       Left.Previous->isLabelString() &&
4441       (Left.NextOperator || Left.OperatorIndex != 0)) {
4442     return 50;
4443   }
4444   if (Right.is(tok::plus) && Left.isLabelString() &&
4445       (Right.NextOperator || Right.OperatorIndex != 0)) {
4446     return 25;
4447   }
4448   if (Left.is(tok::comma))
4449     return 1;
4450   if (Right.is(tok::lessless) && Left.isLabelString() &&
4451       (Right.NextOperator || Right.OperatorIndex != 1)) {
4452     return 25;
4453   }
4454   if (Right.is(tok::lessless)) {
4455     // Breaking at a << is really cheap.
4456     if (Left.isNot(tok::r_paren) || Right.OperatorIndex > 0) {
4457       // Slightly prefer to break before the first one in log-like statements.
4458       return 2;
4459     }
4460     return 1;
4461   }
4462   if (Left.ClosesTemplateDeclaration)
4463     return Style.PenaltyBreakTemplateDeclaration;
4464   if (Left.ClosesRequiresClause)
4465     return 0;
4466   if (Left.is(TT_ConditionalExpr))
4467     return prec::Conditional;
4468   prec::Level Level = Left.getPrecedence();
4469   if (Level == prec::Unknown)
4470     Level = Right.getPrecedence();
4471   if (Level == prec::Assignment)
4472     return Style.PenaltyBreakAssignment;
4473   if (Level != prec::Unknown)
4474     return Level;
4475 
4476   return 3;
4477 }
4478 
spaceRequiredBeforeParens(const FormatToken & Right) const4479 bool TokenAnnotator::spaceRequiredBeforeParens(const FormatToken &Right) const {
4480   if (Style.SpaceBeforeParens == FormatStyle::SBPO_Always)
4481     return true;
4482   if (Right.is(TT_OverloadedOperatorLParen) &&
4483       Style.SpaceBeforeParensOptions.AfterOverloadedOperator) {
4484     return true;
4485   }
4486   if (Style.SpaceBeforeParensOptions.BeforeNonEmptyParentheses &&
4487       Right.ParameterCount > 0) {
4488     return true;
4489   }
4490   return false;
4491 }
4492 
spaceRequiredBetween(const AnnotatedLine & Line,const FormatToken & Left,const FormatToken & Right) const4493 bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
4494                                           const FormatToken &Left,
4495                                           const FormatToken &Right) const {
4496   if (Left.is(tok::kw_return) &&
4497       !Right.isOneOf(tok::semi, tok::r_paren, tok::hashhash)) {
4498     return true;
4499   }
4500   if (Left.is(tok::kw_throw) && Right.is(tok::l_paren) && Right.MatchingParen &&
4501       Right.MatchingParen->is(TT_CastRParen)) {
4502     return true;
4503   }
4504   if (Left.is(Keywords.kw_assert) && Style.isJava())
4505     return true;
4506   if (Style.ObjCSpaceAfterProperty && Line.Type == LT_ObjCProperty &&
4507       Left.is(tok::objc_property)) {
4508     return true;
4509   }
4510   if (Right.is(tok::hashhash))
4511     return Left.is(tok::hash);
4512   if (Left.isOneOf(tok::hashhash, tok::hash))
4513     return Right.is(tok::hash);
4514   if (Left.is(BK_Block) && Right.is(tok::r_brace) &&
4515       Right.MatchingParen == &Left && Line.Children.empty()) {
4516     return Style.SpaceInEmptyBlock;
4517   }
4518   if (Style.SpacesInParens == FormatStyle::SIPO_Custom) {
4519     if ((Left.is(tok::l_paren) && Right.is(tok::r_paren)) ||
4520         (Left.is(tok::l_brace) && Left.isNot(BK_Block) &&
4521          Right.is(tok::r_brace) && Right.isNot(BK_Block))) {
4522       return Style.SpacesInParensOptions.InEmptyParentheses;
4523     }
4524     if (Style.SpacesInParensOptions.ExceptDoubleParentheses &&
4525         Left.is(tok::r_paren) && Right.is(tok::r_paren)) {
4526       auto *InnerLParen = Left.MatchingParen;
4527       if (InnerLParen && InnerLParen->Previous == Right.MatchingParen) {
4528         InnerLParen->SpacesRequiredBefore = 0;
4529         return false;
4530       }
4531     }
4532     const FormatToken *LeftParen = nullptr;
4533     if (Left.is(tok::l_paren))
4534       LeftParen = &Left;
4535     else if (Right.is(tok::r_paren) && Right.MatchingParen)
4536       LeftParen = Right.MatchingParen;
4537     if (LeftParen && (LeftParen->is(TT_ConditionLParen) ||
4538                       (LeftParen->Previous &&
4539                        isKeywordWithCondition(*LeftParen->Previous)))) {
4540       return Style.SpacesInParensOptions.InConditionalStatements;
4541     }
4542   }
4543 
4544   // trailing return type 'auto': []() -> auto {}, auto foo() -> auto {}
4545   if (Left.is(tok::kw_auto) && Right.isOneOf(TT_LambdaLBrace, TT_FunctionLBrace,
4546                                              // function return type 'auto'
4547                                              TT_FunctionTypeLParen)) {
4548     return true;
4549   }
4550 
4551   // auto{x} auto(x)
4552   if (Left.is(tok::kw_auto) && Right.isOneOf(tok::l_paren, tok::l_brace))
4553     return false;
4554 
4555   const auto *BeforeLeft = Left.Previous;
4556 
4557   // operator co_await(x)
4558   if (Right.is(tok::l_paren) && Left.is(tok::kw_co_await) && BeforeLeft &&
4559       BeforeLeft->is(tok::kw_operator)) {
4560     return false;
4561   }
4562   // co_await (x), co_yield (x), co_return (x)
4563   if (Left.isOneOf(tok::kw_co_await, tok::kw_co_yield, tok::kw_co_return) &&
4564       !Right.isOneOf(tok::semi, tok::r_paren)) {
4565     return true;
4566   }
4567 
4568   if (Left.is(tok::l_paren) || Right.is(tok::r_paren)) {
4569     return (Right.is(TT_CastRParen) ||
4570             (Left.MatchingParen && Left.MatchingParen->is(TT_CastRParen)))
4571                ? Style.SpacesInParensOptions.InCStyleCasts
4572                : Style.SpacesInParensOptions.Other;
4573   }
4574   if (Right.isOneOf(tok::semi, tok::comma))
4575     return false;
4576   if (Right.is(tok::less) && Line.Type == LT_ObjCDecl) {
4577     bool IsLightweightGeneric = Right.MatchingParen &&
4578                                 Right.MatchingParen->Next &&
4579                                 Right.MatchingParen->Next->is(tok::colon);
4580     return !IsLightweightGeneric && Style.ObjCSpaceBeforeProtocolList;
4581   }
4582   if (Right.is(tok::less) && Left.is(tok::kw_template))
4583     return Style.SpaceAfterTemplateKeyword;
4584   if (Left.isOneOf(tok::exclaim, tok::tilde))
4585     return false;
4586   if (Left.is(tok::at) &&
4587       Right.isOneOf(tok::identifier, tok::string_literal, tok::char_constant,
4588                     tok::numeric_constant, tok::l_paren, tok::l_brace,
4589                     tok::kw_true, tok::kw_false)) {
4590     return false;
4591   }
4592   if (Left.is(tok::colon))
4593     return Left.isNot(TT_ObjCMethodExpr);
4594   if (Left.is(tok::coloncolon))
4595     return false;
4596   if (Left.is(tok::less) || Right.isOneOf(tok::greater, tok::less)) {
4597     if (Style.isTextProto() ||
4598         (Style.Language == FormatStyle::LK_Proto &&
4599          (Left.is(TT_DictLiteral) || Right.is(TT_DictLiteral)))) {
4600       // Format empty list as `<>`.
4601       if (Left.is(tok::less) && Right.is(tok::greater))
4602         return false;
4603       return !Style.Cpp11BracedListStyle;
4604     }
4605     // Don't attempt to format operator<(), as it is handled later.
4606     if (Right.isNot(TT_OverloadedOperatorLParen))
4607       return false;
4608   }
4609   if (Right.is(tok::ellipsis)) {
4610     return Left.Tok.isLiteral() || (Left.is(tok::identifier) && BeforeLeft &&
4611                                     BeforeLeft->is(tok::kw_case));
4612   }
4613   if (Left.is(tok::l_square) && Right.is(tok::amp))
4614     return Style.SpacesInSquareBrackets;
4615   if (Right.is(TT_PointerOrReference)) {
4616     if (Left.is(tok::r_paren) && Line.MightBeFunctionDecl) {
4617       if (!Left.MatchingParen)
4618         return true;
4619       FormatToken *TokenBeforeMatchingParen =
4620           Left.MatchingParen->getPreviousNonComment();
4621       if (!TokenBeforeMatchingParen || Left.isNot(TT_TypeDeclarationParen))
4622         return true;
4623     }
4624     // Add a space if the previous token is a pointer qualifier or the closing
4625     // parenthesis of __attribute__(()) expression and the style requires spaces
4626     // after pointer qualifiers.
4627     if ((Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_After ||
4628          Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both) &&
4629         (Left.is(TT_AttributeRParen) ||
4630          Left.canBePointerOrReferenceQualifier())) {
4631       return true;
4632     }
4633     if (Left.Tok.isLiteral())
4634       return true;
4635     // for (auto a = 0, b = 0; const auto & c : {1, 2, 3})
4636     if (Left.isTypeOrIdentifier(LangOpts) && Right.Next && Right.Next->Next &&
4637         Right.Next->Next->is(TT_RangeBasedForLoopColon)) {
4638       return getTokenPointerOrReferenceAlignment(Right) !=
4639              FormatStyle::PAS_Left;
4640     }
4641     return !Left.isOneOf(TT_PointerOrReference, tok::l_paren) &&
4642            (getTokenPointerOrReferenceAlignment(Right) !=
4643                 FormatStyle::PAS_Left ||
4644             (Line.IsMultiVariableDeclStmt &&
4645              (Left.NestingLevel == 0 ||
4646               (Left.NestingLevel == 1 && startsWithInitStatement(Line)))));
4647   }
4648   if (Right.is(TT_FunctionTypeLParen) && Left.isNot(tok::l_paren) &&
4649       (Left.isNot(TT_PointerOrReference) ||
4650        (getTokenPointerOrReferenceAlignment(Left) != FormatStyle::PAS_Right &&
4651         !Line.IsMultiVariableDeclStmt))) {
4652     return true;
4653   }
4654   if (Left.is(TT_PointerOrReference)) {
4655     // Add a space if the next token is a pointer qualifier and the style
4656     // requires spaces before pointer qualifiers.
4657     if ((Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Before ||
4658          Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both) &&
4659         Right.canBePointerOrReferenceQualifier()) {
4660       return true;
4661     }
4662     // & 1
4663     if (Right.Tok.isLiteral())
4664       return true;
4665     // & /* comment
4666     if (Right.is(TT_BlockComment))
4667       return true;
4668     // foo() -> const Bar * override/final
4669     // S::foo() & noexcept/requires
4670     if (Right.isOneOf(Keywords.kw_override, Keywords.kw_final, tok::kw_noexcept,
4671                       TT_RequiresClause) &&
4672         Right.isNot(TT_StartOfName)) {
4673       return true;
4674     }
4675     // & {
4676     if (Right.is(tok::l_brace) && Right.is(BK_Block))
4677       return true;
4678     // for (auto a = 0, b = 0; const auto& c : {1, 2, 3})
4679     if (BeforeLeft && BeforeLeft->isTypeOrIdentifier(LangOpts) && Right.Next &&
4680         Right.Next->is(TT_RangeBasedForLoopColon)) {
4681       return getTokenPointerOrReferenceAlignment(Left) !=
4682              FormatStyle::PAS_Right;
4683     }
4684     if (Right.isOneOf(TT_PointerOrReference, TT_ArraySubscriptLSquare,
4685                       tok::l_paren)) {
4686       return false;
4687     }
4688     if (getTokenPointerOrReferenceAlignment(Left) == FormatStyle::PAS_Right)
4689       return false;
4690     // FIXME: Setting IsMultiVariableDeclStmt for the whole line is error-prone,
4691     // because it does not take into account nested scopes like lambdas.
4692     // In multi-variable declaration statements, attach */& to the variable
4693     // independently of the style. However, avoid doing it if we are in a nested
4694     // scope, e.g. lambda. We still need to special-case statements with
4695     // initializers.
4696     if (Line.IsMultiVariableDeclStmt &&
4697         (Left.NestingLevel == Line.First->NestingLevel ||
4698          ((Left.NestingLevel == Line.First->NestingLevel + 1) &&
4699           startsWithInitStatement(Line)))) {
4700       return false;
4701     }
4702     if (!BeforeLeft)
4703       return false;
4704     if (BeforeLeft->is(tok::coloncolon)) {
4705       if (Left.isNot(tok::star))
4706         return false;
4707       assert(Style.PointerAlignment != FormatStyle::PAS_Right);
4708       if (!Right.startsSequence(tok::identifier, tok::r_paren))
4709         return true;
4710       assert(Right.Next);
4711       const auto *LParen = Right.Next->MatchingParen;
4712       return !LParen || LParen->isNot(TT_FunctionTypeLParen);
4713     }
4714     return !BeforeLeft->isOneOf(tok::l_paren, tok::l_square);
4715   }
4716   // Ensure right pointer alignment with ellipsis e.g. int *...P
4717   if (Left.is(tok::ellipsis) && BeforeLeft &&
4718       BeforeLeft->isPointerOrReference()) {
4719     return Style.PointerAlignment != FormatStyle::PAS_Right;
4720   }
4721 
4722   if (Right.is(tok::star) && Left.is(tok::l_paren))
4723     return false;
4724   if (Left.is(tok::star) && Right.isPointerOrReference())
4725     return false;
4726   if (Right.isPointerOrReference()) {
4727     const FormatToken *Previous = &Left;
4728     while (Previous && Previous->isNot(tok::kw_operator)) {
4729       if (Previous->is(tok::identifier) || Previous->isTypeName(LangOpts)) {
4730         Previous = Previous->getPreviousNonComment();
4731         continue;
4732       }
4733       if (Previous->is(TT_TemplateCloser) && Previous->MatchingParen) {
4734         Previous = Previous->MatchingParen->getPreviousNonComment();
4735         continue;
4736       }
4737       if (Previous->is(tok::coloncolon)) {
4738         Previous = Previous->getPreviousNonComment();
4739         continue;
4740       }
4741       break;
4742     }
4743     // Space between the type and the * in:
4744     //   operator void*()
4745     //   operator char*()
4746     //   operator void const*()
4747     //   operator void volatile*()
4748     //   operator /*comment*/ const char*()
4749     //   operator volatile /*comment*/ char*()
4750     //   operator Foo*()
4751     //   operator C<T>*()
4752     //   operator std::Foo*()
4753     //   operator C<T>::D<U>*()
4754     // dependent on PointerAlignment style.
4755     if (Previous) {
4756       if (Previous->endsSequence(tok::kw_operator))
4757         return Style.PointerAlignment != FormatStyle::PAS_Left;
4758       if (Previous->is(tok::kw_const) || Previous->is(tok::kw_volatile)) {
4759         return (Style.PointerAlignment != FormatStyle::PAS_Left) ||
4760                (Style.SpaceAroundPointerQualifiers ==
4761                 FormatStyle::SAPQ_After) ||
4762                (Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both);
4763       }
4764     }
4765   }
4766   if (Style.isCSharp() && Left.is(Keywords.kw_is) && Right.is(tok::l_square))
4767     return true;
4768   const auto SpaceRequiredForArrayInitializerLSquare =
4769       [](const FormatToken &LSquareTok, const FormatStyle &Style) {
4770         return Style.SpacesInContainerLiterals ||
4771                (Style.isProto() && !Style.Cpp11BracedListStyle &&
4772                 LSquareTok.endsSequence(tok::l_square, tok::colon,
4773                                         TT_SelectorName));
4774       };
4775   if (Left.is(tok::l_square)) {
4776     return (Left.is(TT_ArrayInitializerLSquare) && Right.isNot(tok::r_square) &&
4777             SpaceRequiredForArrayInitializerLSquare(Left, Style)) ||
4778            (Left.isOneOf(TT_ArraySubscriptLSquare, TT_StructuredBindingLSquare,
4779                          TT_LambdaLSquare) &&
4780             Style.SpacesInSquareBrackets && Right.isNot(tok::r_square));
4781   }
4782   if (Right.is(tok::r_square)) {
4783     return Right.MatchingParen &&
4784            ((Right.MatchingParen->is(TT_ArrayInitializerLSquare) &&
4785              SpaceRequiredForArrayInitializerLSquare(*Right.MatchingParen,
4786                                                      Style)) ||
4787             (Style.SpacesInSquareBrackets &&
4788              Right.MatchingParen->isOneOf(TT_ArraySubscriptLSquare,
4789                                           TT_StructuredBindingLSquare,
4790                                           TT_LambdaLSquare)));
4791   }
4792   if (Right.is(tok::l_square) &&
4793       !Right.isOneOf(TT_ObjCMethodExpr, TT_LambdaLSquare,
4794                      TT_DesignatedInitializerLSquare,
4795                      TT_StructuredBindingLSquare, TT_AttributeSquare) &&
4796       !Left.isOneOf(tok::numeric_constant, TT_DictLiteral) &&
4797       !(Left.isNot(tok::r_square) && Style.SpaceBeforeSquareBrackets &&
4798         Right.is(TT_ArraySubscriptLSquare))) {
4799     return false;
4800   }
4801   if (Left.is(tok::l_brace) && Right.is(tok::r_brace))
4802     return !Left.Children.empty(); // No spaces in "{}".
4803   if ((Left.is(tok::l_brace) && Left.isNot(BK_Block)) ||
4804       (Right.is(tok::r_brace) && Right.MatchingParen &&
4805        Right.MatchingParen->isNot(BK_Block))) {
4806     return !Style.Cpp11BracedListStyle || Style.SpacesInParensOptions.Other;
4807   }
4808   if (Left.is(TT_BlockComment)) {
4809     // No whitespace in x(/*foo=*/1), except for JavaScript.
4810     return Style.isJavaScript() || !Left.TokenText.ends_with("=*/");
4811   }
4812 
4813   // Space between template and attribute.
4814   // e.g. template <typename T> [[nodiscard]] ...
4815   if (Left.is(TT_TemplateCloser) && Right.is(TT_AttributeSquare))
4816     return true;
4817   // Space before parentheses common for all languages
4818   if (Right.is(tok::l_paren)) {
4819     if (Left.is(TT_TemplateCloser) && Right.isNot(TT_FunctionTypeLParen))
4820       return spaceRequiredBeforeParens(Right);
4821     if (Left.isOneOf(TT_RequiresClause,
4822                      TT_RequiresClauseInARequiresExpression)) {
4823       return Style.SpaceBeforeParensOptions.AfterRequiresInClause ||
4824              spaceRequiredBeforeParens(Right);
4825     }
4826     if (Left.is(TT_RequiresExpression)) {
4827       return Style.SpaceBeforeParensOptions.AfterRequiresInExpression ||
4828              spaceRequiredBeforeParens(Right);
4829     }
4830     if (Left.is(TT_AttributeRParen) ||
4831         (Left.is(tok::r_square) && Left.is(TT_AttributeSquare))) {
4832       return true;
4833     }
4834     if (Left.is(TT_ForEachMacro)) {
4835       return Style.SpaceBeforeParensOptions.AfterForeachMacros ||
4836              spaceRequiredBeforeParens(Right);
4837     }
4838     if (Left.is(TT_IfMacro)) {
4839       return Style.SpaceBeforeParensOptions.AfterIfMacros ||
4840              spaceRequiredBeforeParens(Right);
4841     }
4842     if (Style.SpaceBeforeParens == FormatStyle::SBPO_Custom &&
4843         Left.isPlacementOperator() &&
4844         Right.isNot(TT_OverloadedOperatorLParen) &&
4845         !(Line.MightBeFunctionDecl && Left.is(TT_FunctionDeclarationName))) {
4846       const auto *RParen = Right.MatchingParen;
4847       return Style.SpaceBeforeParensOptions.AfterPlacementOperator ||
4848              (RParen && RParen->is(TT_CastRParen));
4849     }
4850     if (Line.Type == LT_ObjCDecl)
4851       return true;
4852     if (Left.is(tok::semi))
4853       return true;
4854     if (Left.isOneOf(tok::pp_elif, tok::kw_for, tok::kw_while, tok::kw_switch,
4855                      tok::kw_case, TT_ForEachMacro, TT_ObjCForIn) ||
4856         Left.isIf(Line.Type != LT_PreprocessorDirective) ||
4857         Right.is(TT_ConditionLParen)) {
4858       return Style.SpaceBeforeParensOptions.AfterControlStatements ||
4859              spaceRequiredBeforeParens(Right);
4860     }
4861 
4862     // TODO add Operator overloading specific Options to
4863     // SpaceBeforeParensOptions
4864     if (Right.is(TT_OverloadedOperatorLParen))
4865       return spaceRequiredBeforeParens(Right);
4866     // Function declaration or definition
4867     if (Line.MightBeFunctionDecl && Right.is(TT_FunctionDeclarationLParen)) {
4868       if (spaceRequiredBeforeParens(Right))
4869         return true;
4870       const auto &Options = Style.SpaceBeforeParensOptions;
4871       return Line.mightBeFunctionDefinition()
4872                  ? Options.AfterFunctionDefinitionName
4873                  : Options.AfterFunctionDeclarationName;
4874     }
4875     // Lambda
4876     if (Line.Type != LT_PreprocessorDirective && Left.is(tok::r_square) &&
4877         Left.MatchingParen && Left.MatchingParen->is(TT_LambdaLSquare)) {
4878       return Style.SpaceBeforeParensOptions.AfterFunctionDefinitionName ||
4879              spaceRequiredBeforeParens(Right);
4880     }
4881     if (!BeforeLeft || !BeforeLeft->isOneOf(tok::period, tok::arrow)) {
4882       if (Left.isOneOf(tok::kw_try, Keywords.kw___except, tok::kw_catch)) {
4883         return Style.SpaceBeforeParensOptions.AfterControlStatements ||
4884                spaceRequiredBeforeParens(Right);
4885       }
4886       if (Left.isPlacementOperator() ||
4887           (Left.is(tok::r_square) && Left.MatchingParen &&
4888            Left.MatchingParen->Previous &&
4889            Left.MatchingParen->Previous->is(tok::kw_delete))) {
4890         return Style.SpaceBeforeParens != FormatStyle::SBPO_Never ||
4891                spaceRequiredBeforeParens(Right);
4892       }
4893     }
4894     // Handle builtins like identifiers.
4895     if (Line.Type != LT_PreprocessorDirective &&
4896         (Left.Tok.getIdentifierInfo() || Left.is(tok::r_paren))) {
4897       return spaceRequiredBeforeParens(Right);
4898     }
4899     return false;
4900   }
4901   if (Left.is(tok::at) && Right.isNot(tok::objc_not_keyword))
4902     return false;
4903   if (Right.is(TT_UnaryOperator)) {
4904     return !Left.isOneOf(tok::l_paren, tok::l_square, tok::at) &&
4905            (Left.isNot(tok::colon) || Left.isNot(TT_ObjCMethodExpr));
4906   }
4907   // No space between the variable name and the initializer list.
4908   // A a1{1};
4909   // Verilog doesn't have such syntax, but it has word operators that are C++
4910   // identifiers like `a inside {b, c}`. So the rule is not applicable.
4911   if (!Style.isVerilog() &&
4912       (Left.isOneOf(tok::identifier, tok::greater, tok::r_square,
4913                     tok::r_paren) ||
4914        Left.isTypeName(LangOpts)) &&
4915       Right.is(tok::l_brace) && Right.getNextNonComment() &&
4916       Right.isNot(BK_Block)) {
4917     return false;
4918   }
4919   if (Left.is(tok::period) || Right.is(tok::period))
4920     return false;
4921   // u#str, U#str, L#str, u8#str
4922   // uR#str, UR#str, LR#str, u8R#str
4923   if (Right.is(tok::hash) && Left.is(tok::identifier) &&
4924       (Left.TokenText == "L" || Left.TokenText == "u" ||
4925        Left.TokenText == "U" || Left.TokenText == "u8" ||
4926        Left.TokenText == "LR" || Left.TokenText == "uR" ||
4927        Left.TokenText == "UR" || Left.TokenText == "u8R")) {
4928     return false;
4929   }
4930   if (Left.is(TT_TemplateCloser) && Left.MatchingParen &&
4931       Left.MatchingParen->Previous &&
4932       (Left.MatchingParen->Previous->is(tok::period) ||
4933        Left.MatchingParen->Previous->is(tok::coloncolon))) {
4934     // Java call to generic function with explicit type:
4935     // A.<B<C<...>>>DoSomething();
4936     // A::<B<C<...>>>DoSomething();  // With a Java 8 method reference.
4937     return false;
4938   }
4939   if (Left.is(TT_TemplateCloser) && Right.is(tok::l_square))
4940     return false;
4941   if (Left.is(tok::l_brace) && Left.endsSequence(TT_DictLiteral, tok::at)) {
4942     // Objective-C dictionary literal -> no space after opening brace.
4943     return false;
4944   }
4945   if (Right.is(tok::r_brace) && Right.MatchingParen &&
4946       Right.MatchingParen->endsSequence(TT_DictLiteral, tok::at)) {
4947     // Objective-C dictionary literal -> no space before closing brace.
4948     return false;
4949   }
4950   if (Right.is(TT_TrailingAnnotation) && Right.isOneOf(tok::amp, tok::ampamp) &&
4951       Left.isOneOf(tok::kw_const, tok::kw_volatile) &&
4952       (!Right.Next || Right.Next->is(tok::semi))) {
4953     // Match const and volatile ref-qualifiers without any additional
4954     // qualifiers such as
4955     // void Fn() const &;
4956     return getTokenReferenceAlignment(Right) != FormatStyle::PAS_Left;
4957   }
4958 
4959   return true;
4960 }
4961 
spaceRequiredBefore(const AnnotatedLine & Line,const FormatToken & Right) const4962 bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
4963                                          const FormatToken &Right) const {
4964   const FormatToken &Left = *Right.Previous;
4965 
4966   // If the token is finalized don't touch it (as it could be in a
4967   // clang-format-off section).
4968   if (Left.Finalized)
4969     return Right.hasWhitespaceBefore();
4970 
4971   const bool IsVerilog = Style.isVerilog();
4972   assert(!IsVerilog || !IsCpp);
4973 
4974   // Never ever merge two words.
4975   if (Keywords.isWordLike(Right, IsVerilog) &&
4976       Keywords.isWordLike(Left, IsVerilog)) {
4977     return true;
4978   }
4979 
4980   // Leave a space between * and /* to avoid C4138 `comment end` found outside
4981   // of comment.
4982   if (Left.is(tok::star) && Right.is(tok::comment))
4983     return true;
4984 
4985   const auto *BeforeLeft = Left.Previous;
4986 
4987   if (IsCpp) {
4988     if (Left.is(TT_OverloadedOperator) &&
4989         Right.isOneOf(TT_TemplateOpener, TT_TemplateCloser)) {
4990       return true;
4991     }
4992     // Space between UDL and dot: auto b = 4s .count();
4993     if (Right.is(tok::period) && Left.is(tok::numeric_constant))
4994       return true;
4995     // Space between import <iostream>.
4996     // or import .....;
4997     if (Left.is(Keywords.kw_import) && Right.isOneOf(tok::less, tok::ellipsis))
4998       return true;
4999     // Space between `module :` and `import :`.
5000     if (Left.isOneOf(Keywords.kw_module, Keywords.kw_import) &&
5001         Right.is(TT_ModulePartitionColon)) {
5002       return true;
5003     }
5004 
5005     if (Right.is(TT_AfterPPDirective))
5006       return true;
5007 
5008     // No space between import foo:bar but keep a space between import :bar;
5009     if (Left.is(tok::identifier) && Right.is(TT_ModulePartitionColon))
5010       return false;
5011     // No space between :bar;
5012     if (Left.is(TT_ModulePartitionColon) &&
5013         Right.isOneOf(tok::identifier, tok::kw_private)) {
5014       return false;
5015     }
5016     if (Left.is(tok::ellipsis) && Right.is(tok::identifier) &&
5017         Line.First->is(Keywords.kw_import)) {
5018       return false;
5019     }
5020     // Space in __attribute__((attr)) ::type.
5021     if (Left.isOneOf(TT_AttributeRParen, TT_AttributeMacro) &&
5022         Right.is(tok::coloncolon)) {
5023       return true;
5024     }
5025 
5026     if (Left.is(tok::kw_operator))
5027       return Right.is(tok::coloncolon) || Style.SpaceAfterOperatorKeyword;
5028     if (Right.is(tok::l_brace) && Right.is(BK_BracedInit) &&
5029         !Left.opensScope() && Style.SpaceBeforeCpp11BracedList) {
5030       return true;
5031     }
5032     if (Left.is(tok::less) && Left.is(TT_OverloadedOperator) &&
5033         Right.is(TT_TemplateOpener)) {
5034       return true;
5035     }
5036     // C++ Core Guidelines suppression tag, e.g. `[[suppress(type.5)]]`.
5037     if (Left.is(tok::identifier) && Right.is(tok::numeric_constant))
5038       return Right.TokenText[0] != '.';
5039     // `Left` is a keyword (including C++ alternative operator) or identifier.
5040     if (Left.Tok.getIdentifierInfo() && Right.Tok.isLiteral())
5041       return true;
5042   } else if (Style.isProto()) {
5043     if (Right.is(tok::period) && !(BeforeLeft && BeforeLeft->is(tok::period)) &&
5044         Left.isOneOf(Keywords.kw_optional, Keywords.kw_required,
5045                      Keywords.kw_repeated, Keywords.kw_extend)) {
5046       return true;
5047     }
5048     if (Right.is(tok::l_paren) &&
5049         Left.isOneOf(Keywords.kw_returns, Keywords.kw_option)) {
5050       return true;
5051     }
5052     if (Right.isOneOf(tok::l_brace, tok::less) && Left.is(TT_SelectorName))
5053       return true;
5054     // Slashes occur in text protocol extension syntax: [type/type] { ... }.
5055     if (Left.is(tok::slash) || Right.is(tok::slash))
5056       return false;
5057     if (Left.MatchingParen &&
5058         Left.MatchingParen->is(TT_ProtoExtensionLSquare) &&
5059         Right.isOneOf(tok::l_brace, tok::less)) {
5060       return !Style.Cpp11BracedListStyle;
5061     }
5062     // A percent is probably part of a formatting specification, such as %lld.
5063     if (Left.is(tok::percent))
5064       return false;
5065     // Preserve the existence of a space before a percent for cases like 0x%04x
5066     // and "%d %d"
5067     if (Left.is(tok::numeric_constant) && Right.is(tok::percent))
5068       return Right.hasWhitespaceBefore();
5069   } else if (Style.isJson()) {
5070     if (Right.is(tok::colon) && Left.is(tok::string_literal))
5071       return Style.SpaceBeforeJsonColon;
5072   } else if (Style.isCSharp()) {
5073     // Require spaces around '{' and  before '}' unless they appear in
5074     // interpolated strings. Interpolated strings are merged into a single token
5075     // so cannot have spaces inserted by this function.
5076 
5077     // No space between 'this' and '['
5078     if (Left.is(tok::kw_this) && Right.is(tok::l_square))
5079       return false;
5080 
5081     // No space between 'new' and '('
5082     if (Left.is(tok::kw_new) && Right.is(tok::l_paren))
5083       return false;
5084 
5085     // Space before { (including space within '{ {').
5086     if (Right.is(tok::l_brace))
5087       return true;
5088 
5089     // Spaces inside braces.
5090     if (Left.is(tok::l_brace) && Right.isNot(tok::r_brace))
5091       return true;
5092 
5093     if (Left.isNot(tok::l_brace) && Right.is(tok::r_brace))
5094       return true;
5095 
5096     // Spaces around '=>'.
5097     if (Left.is(TT_FatArrow) || Right.is(TT_FatArrow))
5098       return true;
5099 
5100     // No spaces around attribute target colons
5101     if (Left.is(TT_AttributeColon) || Right.is(TT_AttributeColon))
5102       return false;
5103 
5104     // space between type and variable e.g. Dictionary<string,string> foo;
5105     if (Left.is(TT_TemplateCloser) && Right.is(TT_StartOfName))
5106       return true;
5107 
5108     // spaces inside square brackets.
5109     if (Left.is(tok::l_square) || Right.is(tok::r_square))
5110       return Style.SpacesInSquareBrackets;
5111 
5112     // No space before ? in nullable types.
5113     if (Right.is(TT_CSharpNullable))
5114       return false;
5115 
5116     // No space before null forgiving '!'.
5117     if (Right.is(TT_NonNullAssertion))
5118       return false;
5119 
5120     // No space between consecutive commas '[,,]'.
5121     if (Left.is(tok::comma) && Right.is(tok::comma))
5122       return false;
5123 
5124     // space after var in `var (key, value)`
5125     if (Left.is(Keywords.kw_var) && Right.is(tok::l_paren))
5126       return true;
5127 
5128     // space between keywords and paren e.g. "using ("
5129     if (Right.is(tok::l_paren)) {
5130       if (Left.isOneOf(tok::kw_using, Keywords.kw_async, Keywords.kw_when,
5131                        Keywords.kw_lock)) {
5132         return Style.SpaceBeforeParensOptions.AfterControlStatements ||
5133                spaceRequiredBeforeParens(Right);
5134       }
5135     }
5136 
5137     // space between method modifier and opening parenthesis of a tuple return
5138     // type
5139     if ((Left.isAccessSpecifierKeyword() ||
5140          Left.isOneOf(tok::kw_virtual, tok::kw_extern, tok::kw_static,
5141                       Keywords.kw_internal, Keywords.kw_abstract,
5142                       Keywords.kw_sealed, Keywords.kw_override,
5143                       Keywords.kw_async, Keywords.kw_unsafe)) &&
5144         Right.is(tok::l_paren)) {
5145       return true;
5146     }
5147   } else if (Style.isJavaScript()) {
5148     if (Left.is(TT_FatArrow))
5149       return true;
5150     // for await ( ...
5151     if (Right.is(tok::l_paren) && Left.is(Keywords.kw_await) && BeforeLeft &&
5152         BeforeLeft->is(tok::kw_for)) {
5153       return true;
5154     }
5155     if (Left.is(Keywords.kw_async) && Right.is(tok::l_paren) &&
5156         Right.MatchingParen) {
5157       const FormatToken *Next = Right.MatchingParen->getNextNonComment();
5158       // An async arrow function, for example: `x = async () => foo();`,
5159       // as opposed to calling a function called async: `x = async();`
5160       if (Next && Next->is(TT_FatArrow))
5161         return true;
5162     }
5163     if ((Left.is(TT_TemplateString) && Left.TokenText.ends_with("${")) ||
5164         (Right.is(TT_TemplateString) && Right.TokenText.starts_with("}"))) {
5165       return false;
5166     }
5167     // In tagged template literals ("html`bar baz`"), there is no space between
5168     // the tag identifier and the template string.
5169     if (Keywords.isJavaScriptIdentifier(Left,
5170                                         /* AcceptIdentifierName= */ false) &&
5171         Right.is(TT_TemplateString)) {
5172       return false;
5173     }
5174     if (Right.is(tok::star) &&
5175         Left.isOneOf(Keywords.kw_function, Keywords.kw_yield)) {
5176       return false;
5177     }
5178     if (Right.isOneOf(tok::l_brace, tok::l_square) &&
5179         Left.isOneOf(Keywords.kw_function, Keywords.kw_yield,
5180                      Keywords.kw_extends, Keywords.kw_implements)) {
5181       return true;
5182     }
5183     if (Right.is(tok::l_paren)) {
5184       // JS methods can use some keywords as names (e.g. `delete()`).
5185       if (Line.MustBeDeclaration && Left.Tok.getIdentifierInfo())
5186         return false;
5187       // Valid JS method names can include keywords, e.g. `foo.delete()` or
5188       // `bar.instanceof()`. Recognize call positions by preceding period.
5189       if (BeforeLeft && BeforeLeft->is(tok::period) &&
5190           Left.Tok.getIdentifierInfo()) {
5191         return false;
5192       }
5193       // Additional unary JavaScript operators that need a space after.
5194       if (Left.isOneOf(tok::kw_throw, Keywords.kw_await, Keywords.kw_typeof,
5195                        tok::kw_void)) {
5196         return true;
5197       }
5198     }
5199     // `foo as const;` casts into a const type.
5200     if (Left.endsSequence(tok::kw_const, Keywords.kw_as))
5201       return false;
5202     if ((Left.isOneOf(Keywords.kw_let, Keywords.kw_var, Keywords.kw_in,
5203                       tok::kw_const) ||
5204          // "of" is only a keyword if it appears after another identifier
5205          // (e.g. as "const x of y" in a for loop), or after a destructuring
5206          // operation (const [x, y] of z, const {a, b} of c).
5207          (Left.is(Keywords.kw_of) && BeforeLeft &&
5208           (BeforeLeft->is(tok::identifier) ||
5209            BeforeLeft->isOneOf(tok::r_square, tok::r_brace)))) &&
5210         (!BeforeLeft || BeforeLeft->isNot(tok::period))) {
5211       return true;
5212     }
5213     if (Left.isOneOf(tok::kw_for, Keywords.kw_as) && BeforeLeft &&
5214         BeforeLeft->is(tok::period) && Right.is(tok::l_paren)) {
5215       return false;
5216     }
5217     if (Left.is(Keywords.kw_as) &&
5218         Right.isOneOf(tok::l_square, tok::l_brace, tok::l_paren)) {
5219       return true;
5220     }
5221     if (Left.is(tok::kw_default) && BeforeLeft &&
5222         BeforeLeft->is(tok::kw_export)) {
5223       return true;
5224     }
5225     if (Left.is(Keywords.kw_is) && Right.is(tok::l_brace))
5226       return true;
5227     if (Right.isOneOf(TT_JsTypeColon, TT_JsTypeOptionalQuestion))
5228       return false;
5229     if (Left.is(TT_JsTypeOperator) || Right.is(TT_JsTypeOperator))
5230       return false;
5231     if ((Left.is(tok::l_brace) || Right.is(tok::r_brace)) &&
5232         Line.First->isOneOf(Keywords.kw_import, tok::kw_export)) {
5233       return false;
5234     }
5235     if (Left.is(tok::ellipsis))
5236       return false;
5237     if (Left.is(TT_TemplateCloser) &&
5238         !Right.isOneOf(tok::equal, tok::l_brace, tok::comma, tok::l_square,
5239                        Keywords.kw_implements, Keywords.kw_extends)) {
5240       // Type assertions ('<type>expr') are not followed by whitespace. Other
5241       // locations that should have whitespace following are identified by the
5242       // above set of follower tokens.
5243       return false;
5244     }
5245     if (Right.is(TT_NonNullAssertion))
5246       return false;
5247     if (Left.is(TT_NonNullAssertion) &&
5248         Right.isOneOf(Keywords.kw_as, Keywords.kw_in)) {
5249       return true; // "x! as string", "x! in y"
5250     }
5251   } else if (Style.isJava()) {
5252     if (Left.is(TT_CaseLabelArrow) || Right.is(TT_CaseLabelArrow))
5253       return true;
5254     if (Left.is(tok::r_square) && Right.is(tok::l_brace))
5255       return true;
5256     // spaces inside square brackets.
5257     if (Left.is(tok::l_square) || Right.is(tok::r_square))
5258       return Style.SpacesInSquareBrackets;
5259 
5260     if (Left.is(Keywords.kw_synchronized) && Right.is(tok::l_paren)) {
5261       return Style.SpaceBeforeParensOptions.AfterControlStatements ||
5262              spaceRequiredBeforeParens(Right);
5263     }
5264     if ((Left.isAccessSpecifierKeyword() ||
5265          Left.isOneOf(tok::kw_static, Keywords.kw_final, Keywords.kw_abstract,
5266                       Keywords.kw_native)) &&
5267         Right.is(TT_TemplateOpener)) {
5268       return true;
5269     }
5270   } else if (IsVerilog) {
5271     // An escaped identifier ends with whitespace.
5272     if (Left.is(tok::identifier) && Left.TokenText[0] == '\\')
5273       return true;
5274     // Add space between things in a primitive's state table unless in a
5275     // transition like `(0?)`.
5276     if ((Left.is(TT_VerilogTableItem) &&
5277          !Right.isOneOf(tok::r_paren, tok::semi)) ||
5278         (Right.is(TT_VerilogTableItem) && Left.isNot(tok::l_paren))) {
5279       const FormatToken *Next = Right.getNextNonComment();
5280       return !(Next && Next->is(tok::r_paren));
5281     }
5282     // Don't add space within a delay like `#0`.
5283     if (Left.isNot(TT_BinaryOperator) &&
5284         Left.isOneOf(Keywords.kw_verilogHash, Keywords.kw_verilogHashHash)) {
5285       return false;
5286     }
5287     // Add space after a delay.
5288     if (Right.isNot(tok::semi) &&
5289         (Left.endsSequence(tok::numeric_constant, Keywords.kw_verilogHash) ||
5290          Left.endsSequence(tok::numeric_constant,
5291                            Keywords.kw_verilogHashHash) ||
5292          (Left.is(tok::r_paren) && Left.MatchingParen &&
5293           Left.MatchingParen->endsSequence(tok::l_paren, tok::at)))) {
5294       return true;
5295     }
5296     // Don't add embedded spaces in a number literal like `16'h1?ax` or an array
5297     // literal like `'{}`.
5298     if (Left.is(Keywords.kw_apostrophe) ||
5299         (Left.is(TT_VerilogNumberBase) && Right.is(tok::numeric_constant))) {
5300       return false;
5301     }
5302     // Add spaces around the implication operator `->`.
5303     if (Left.is(tok::arrow) || Right.is(tok::arrow))
5304       return true;
5305     // Don't add spaces between two at signs. Like in a coverage event.
5306     // Don't add spaces between at and a sensitivity list like
5307     // `@(posedge clk)`.
5308     if (Left.is(tok::at) && Right.isOneOf(tok::l_paren, tok::star, tok::at))
5309       return false;
5310     // Add space between the type name and dimension like `logic [1:0]`.
5311     if (Right.is(tok::l_square) &&
5312         Left.isOneOf(TT_VerilogDimensionedTypeName, Keywords.kw_function)) {
5313       return true;
5314     }
5315     // In a tagged union expression, there should be a space after the tag.
5316     if (Right.isOneOf(tok::period, Keywords.kw_apostrophe) &&
5317         Keywords.isVerilogIdentifier(Left) && Left.getPreviousNonComment() &&
5318         Left.getPreviousNonComment()->is(Keywords.kw_tagged)) {
5319       return true;
5320     }
5321     // Don't add spaces between a casting type and the quote or repetition count
5322     // and the brace. The case of tagged union expressions is handled by the
5323     // previous rule.
5324     if ((Right.is(Keywords.kw_apostrophe) ||
5325          (Right.is(BK_BracedInit) && Right.is(tok::l_brace))) &&
5326         !(Left.isOneOf(Keywords.kw_assign, Keywords.kw_unique) ||
5327           Keywords.isVerilogWordOperator(Left)) &&
5328         (Left.isOneOf(tok::r_square, tok::r_paren, tok::r_brace,
5329                       tok::numeric_constant) ||
5330          Keywords.isWordLike(Left))) {
5331       return false;
5332     }
5333     // Don't add spaces in imports like `import foo::*;`.
5334     if ((Right.is(tok::star) && Left.is(tok::coloncolon)) ||
5335         (Left.is(tok::star) && Right.is(tok::semi))) {
5336       return false;
5337     }
5338     // Add space in attribute like `(* ASYNC_REG = "TRUE" *)`.
5339     if (Left.endsSequence(tok::star, tok::l_paren) && Right.is(tok::identifier))
5340       return true;
5341     // Add space before drive strength like in `wire (strong1, pull0)`.
5342     if (Right.is(tok::l_paren) && Right.is(TT_VerilogStrength))
5343       return true;
5344     // Don't add space in a streaming concatenation like `{>>{j}}`.
5345     if ((Left.is(tok::l_brace) &&
5346          Right.isOneOf(tok::lessless, tok::greatergreater)) ||
5347         (Left.endsSequence(tok::lessless, tok::l_brace) ||
5348          Left.endsSequence(tok::greatergreater, tok::l_brace))) {
5349       return false;
5350     }
5351   } else if (Style.isTableGen()) {
5352     // Avoid to connect [ and {. [{ is start token of multiline string.
5353     if (Left.is(tok::l_square) && Right.is(tok::l_brace))
5354       return true;
5355     if (Left.is(tok::r_brace) && Right.is(tok::r_square))
5356       return true;
5357     // Do not insert around colon in DAGArg and cond operator.
5358     if (Right.isOneOf(TT_TableGenDAGArgListColon,
5359                       TT_TableGenDAGArgListColonToAlign) ||
5360         Left.isOneOf(TT_TableGenDAGArgListColon,
5361                      TT_TableGenDAGArgListColonToAlign)) {
5362       return false;
5363     }
5364     if (Right.is(TT_TableGenCondOperatorColon))
5365       return false;
5366     if (Left.isOneOf(TT_TableGenDAGArgOperatorID,
5367                      TT_TableGenDAGArgOperatorToBreak) &&
5368         Right.isNot(TT_TableGenDAGArgCloser)) {
5369       return true;
5370     }
5371     // Do not insert bang operators and consequent openers.
5372     if (Right.isOneOf(tok::l_paren, tok::less) &&
5373         Left.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator)) {
5374       return false;
5375     }
5376     // Trailing paste requires space before '{' or ':', the case in name values.
5377     // Not before ';', the case in normal values.
5378     if (Left.is(TT_TableGenTrailingPasteOperator) &&
5379         Right.isOneOf(tok::l_brace, tok::colon)) {
5380       return true;
5381     }
5382     // Otherwise paste operator does not prefer space around.
5383     if (Left.is(tok::hash) || Right.is(tok::hash))
5384       return false;
5385     // Sure not to connect after defining keywords.
5386     if (Keywords.isTableGenDefinition(Left))
5387       return true;
5388   }
5389 
5390   if (Left.is(TT_ImplicitStringLiteral))
5391     return Right.hasWhitespaceBefore();
5392   if (Line.Type == LT_ObjCMethodDecl) {
5393     if (Left.is(TT_ObjCMethodSpecifier))
5394       return true;
5395     if (Left.is(tok::r_paren) && Left.isNot(TT_AttributeRParen) &&
5396         canBeObjCSelectorComponent(Right)) {
5397       // Don't space between ')' and <id> or ')' and 'new'. 'new' is not a
5398       // keyword in Objective-C, and '+ (instancetype)new;' is a standard class
5399       // method declaration.
5400       return false;
5401     }
5402   }
5403   if (Line.Type == LT_ObjCProperty &&
5404       (Right.is(tok::equal) || Left.is(tok::equal))) {
5405     return false;
5406   }
5407 
5408   if (Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow) ||
5409       Left.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow)) {
5410     return true;
5411   }
5412   if (Left.is(tok::comma) && Right.isNot(TT_OverloadedOperatorLParen) &&
5413       // In an unexpanded macro call we only find the parentheses and commas
5414       // in a line; the commas and closing parenthesis do not require a space.
5415       (Left.Children.empty() || !Left.MacroParent)) {
5416     return true;
5417   }
5418   if (Right.is(tok::comma))
5419     return false;
5420   if (Right.is(TT_ObjCBlockLParen))
5421     return true;
5422   if (Right.is(TT_CtorInitializerColon))
5423     return Style.SpaceBeforeCtorInitializerColon;
5424   if (Right.is(TT_InheritanceColon) && !Style.SpaceBeforeInheritanceColon)
5425     return false;
5426   if (Right.is(TT_RangeBasedForLoopColon) &&
5427       !Style.SpaceBeforeRangeBasedForLoopColon) {
5428     return false;
5429   }
5430   if (Left.is(TT_BitFieldColon)) {
5431     return Style.BitFieldColonSpacing == FormatStyle::BFCS_Both ||
5432            Style.BitFieldColonSpacing == FormatStyle::BFCS_After;
5433   }
5434   if (Right.is(tok::colon)) {
5435     if (Right.is(TT_CaseLabelColon))
5436       return Style.SpaceBeforeCaseColon;
5437     if (Right.is(TT_GotoLabelColon))
5438       return false;
5439     // `private:` and `public:`.
5440     if (!Right.getNextNonComment())
5441       return false;
5442     if (Right.is(TT_ObjCMethodExpr))
5443       return false;
5444     if (Left.is(tok::question))
5445       return false;
5446     if (Right.is(TT_InlineASMColon) && Left.is(tok::coloncolon))
5447       return false;
5448     if (Right.is(TT_DictLiteral))
5449       return Style.SpacesInContainerLiterals;
5450     if (Right.is(TT_AttributeColon))
5451       return false;
5452     if (Right.is(TT_CSharpNamedArgumentColon))
5453       return false;
5454     if (Right.is(TT_GenericSelectionColon))
5455       return false;
5456     if (Right.is(TT_BitFieldColon)) {
5457       return Style.BitFieldColonSpacing == FormatStyle::BFCS_Both ||
5458              Style.BitFieldColonSpacing == FormatStyle::BFCS_Before;
5459     }
5460     return true;
5461   }
5462   // Do not merge "- -" into "--".
5463   if ((Left.isOneOf(tok::minus, tok::minusminus) &&
5464        Right.isOneOf(tok::minus, tok::minusminus)) ||
5465       (Left.isOneOf(tok::plus, tok::plusplus) &&
5466        Right.isOneOf(tok::plus, tok::plusplus))) {
5467     return true;
5468   }
5469   if (Left.is(TT_UnaryOperator)) {
5470     // Lambda captures allow for a lone &, so "&]" needs to be properly
5471     // handled.
5472     if (Left.is(tok::amp) && Right.is(tok::r_square))
5473       return Style.SpacesInSquareBrackets;
5474     if (Left.isNot(tok::exclaim))
5475       return false;
5476     if (Left.TokenText == "!")
5477       return Style.SpaceAfterLogicalNot;
5478     assert(Left.TokenText == "not");
5479     return Right.isOneOf(tok::coloncolon, TT_UnaryOperator) ||
5480            (Right.is(tok::l_paren) && Style.SpaceBeforeParensOptions.AfterNot);
5481   }
5482 
5483   // If the next token is a binary operator or a selector name, we have
5484   // incorrectly classified the parenthesis as a cast. FIXME: Detect correctly.
5485   if (Left.is(TT_CastRParen)) {
5486     return Style.SpaceAfterCStyleCast ||
5487            Right.isOneOf(TT_BinaryOperator, TT_SelectorName);
5488   }
5489 
5490   auto ShouldAddSpacesInAngles = [this, &Right]() {
5491     if (this->Style.SpacesInAngles == FormatStyle::SIAS_Always)
5492       return true;
5493     if (this->Style.SpacesInAngles == FormatStyle::SIAS_Leave)
5494       return Right.hasWhitespaceBefore();
5495     return false;
5496   };
5497 
5498   if (Left.is(tok::greater) && Right.is(tok::greater)) {
5499     if (Style.isTextProto() ||
5500         (Style.Language == FormatStyle::LK_Proto && Left.is(TT_DictLiteral))) {
5501       return !Style.Cpp11BracedListStyle;
5502     }
5503     return Right.is(TT_TemplateCloser) && Left.is(TT_TemplateCloser) &&
5504            ((Style.Standard < FormatStyle::LS_Cpp11) ||
5505             ShouldAddSpacesInAngles());
5506   }
5507   if (Right.isOneOf(tok::arrow, tok::arrowstar, tok::periodstar) ||
5508       Left.isOneOf(tok::arrow, tok::period, tok::arrowstar, tok::periodstar) ||
5509       (Right.is(tok::period) && Right.isNot(TT_DesignatedInitializerPeriod))) {
5510     return false;
5511   }
5512   if (!Style.SpaceBeforeAssignmentOperators && Left.isNot(TT_TemplateCloser) &&
5513       Right.getPrecedence() == prec::Assignment) {
5514     return false;
5515   }
5516   if (Style.isJava() && Right.is(tok::coloncolon) &&
5517       (Left.is(tok::identifier) || Left.is(tok::kw_this))) {
5518     return false;
5519   }
5520   if (Right.is(tok::coloncolon) && Left.is(tok::identifier)) {
5521     // Generally don't remove existing spaces between an identifier and "::".
5522     // The identifier might actually be a macro name such as ALWAYS_INLINE. If
5523     // this turns out to be too lenient, add analysis of the identifier itself.
5524     return Right.hasWhitespaceBefore();
5525   }
5526   if (Right.is(tok::coloncolon) &&
5527       !Left.isOneOf(tok::l_brace, tok::comment, tok::l_paren)) {
5528     // Put a space between < and :: in vector< ::std::string >
5529     return (Left.is(TT_TemplateOpener) &&
5530             ((Style.Standard < FormatStyle::LS_Cpp11) ||
5531              ShouldAddSpacesInAngles())) ||
5532            !(Left.isOneOf(tok::l_paren, tok::r_paren, tok::l_square,
5533                           tok::kw___super, TT_TemplateOpener,
5534                           TT_TemplateCloser)) ||
5535            (Left.is(tok::l_paren) && Style.SpacesInParensOptions.Other);
5536   }
5537   if ((Left.is(TT_TemplateOpener)) != (Right.is(TT_TemplateCloser)))
5538     return ShouldAddSpacesInAngles();
5539   if (Left.is(tok::r_paren) && Left.isNot(TT_TypeDeclarationParen) &&
5540       Right.is(TT_PointerOrReference) && Right.isOneOf(tok::amp, tok::ampamp)) {
5541     return true;
5542   }
5543   // Space before TT_StructuredBindingLSquare.
5544   if (Right.is(TT_StructuredBindingLSquare)) {
5545     return !Left.isOneOf(tok::amp, tok::ampamp) ||
5546            getTokenReferenceAlignment(Left) != FormatStyle::PAS_Right;
5547   }
5548   // Space before & or && following a TT_StructuredBindingLSquare.
5549   if (Right.Next && Right.Next->is(TT_StructuredBindingLSquare) &&
5550       Right.isOneOf(tok::amp, tok::ampamp)) {
5551     return getTokenReferenceAlignment(Right) != FormatStyle::PAS_Left;
5552   }
5553   if ((Right.is(TT_BinaryOperator) && Left.isNot(tok::l_paren)) ||
5554       (Left.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) &&
5555        Right.isNot(tok::r_paren))) {
5556     return true;
5557   }
5558   if (Right.is(TT_TemplateOpener) && Left.is(tok::r_paren) &&
5559       Left.MatchingParen &&
5560       Left.MatchingParen->is(TT_OverloadedOperatorLParen)) {
5561     return false;
5562   }
5563   if (Right.is(tok::less) && Left.isNot(tok::l_paren) &&
5564       Line.Type == LT_ImportStatement) {
5565     return true;
5566   }
5567   if (Right.is(TT_TrailingUnaryOperator))
5568     return false;
5569   if (Left.is(TT_RegexLiteral))
5570     return false;
5571   return spaceRequiredBetween(Line, Left, Right);
5572 }
5573 
5574 // Returns 'true' if 'Tok' is a brace we'd want to break before in Allman style.
isAllmanBrace(const FormatToken & Tok)5575 static bool isAllmanBrace(const FormatToken &Tok) {
5576   return Tok.is(tok::l_brace) && Tok.is(BK_Block) &&
5577          !Tok.isOneOf(TT_ObjCBlockLBrace, TT_LambdaLBrace, TT_DictLiteral);
5578 }
5579 
5580 // Returns 'true' if 'Tok' is a function argument.
IsFunctionArgument(const FormatToken & Tok)5581 static bool IsFunctionArgument(const FormatToken &Tok) {
5582   return Tok.MatchingParen && Tok.MatchingParen->Next &&
5583          Tok.MatchingParen->Next->isOneOf(tok::comma, tok::r_paren,
5584                                           tok::r_brace);
5585 }
5586 
5587 static bool
isItAnEmptyLambdaAllowed(const FormatToken & Tok,FormatStyle::ShortLambdaStyle ShortLambdaOption)5588 isItAnEmptyLambdaAllowed(const FormatToken &Tok,
5589                          FormatStyle::ShortLambdaStyle ShortLambdaOption) {
5590   return Tok.Children.empty() && ShortLambdaOption != FormatStyle::SLS_None;
5591 }
5592 
isAllmanLambdaBrace(const FormatToken & Tok)5593 static bool isAllmanLambdaBrace(const FormatToken &Tok) {
5594   return Tok.is(tok::l_brace) && Tok.is(BK_Block) &&
5595          !Tok.isOneOf(TT_ObjCBlockLBrace, TT_DictLiteral);
5596 }
5597 
mustBreakBefore(const AnnotatedLine & Line,const FormatToken & Right) const5598 bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line,
5599                                      const FormatToken &Right) const {
5600   if (Right.NewlinesBefore > 1 && Style.MaxEmptyLinesToKeep > 0 &&
5601       (!Style.RemoveEmptyLinesInUnwrappedLines || &Right == Line.First)) {
5602     return true;
5603   }
5604 
5605   const FormatToken &Left = *Right.Previous;
5606 
5607   if (Style.BreakFunctionDefinitionParameters && Line.MightBeFunctionDecl &&
5608       Line.mightBeFunctionDefinition() && Left.MightBeFunctionDeclParen &&
5609       Left.ParameterCount > 0) {
5610     return true;
5611   }
5612 
5613   // Ignores the first parameter as this will be handled separately by
5614   // BreakFunctionDefinitionParameters or AlignAfterOpenBracket.
5615   if (Style.BinPackParameters == FormatStyle::BPPS_AlwaysOnePerLine &&
5616       Line.MightBeFunctionDecl && !Left.opensScope() &&
5617       startsNextParameter(Right, Style)) {
5618     return true;
5619   }
5620 
5621   const auto *BeforeLeft = Left.Previous;
5622   const auto *AfterRight = Right.Next;
5623 
5624   if (Style.isCSharp()) {
5625     if (Left.is(TT_FatArrow) && Right.is(tok::l_brace) &&
5626         Style.BraceWrapping.AfterFunction) {
5627       return true;
5628     }
5629     if (Right.is(TT_CSharpNamedArgumentColon) ||
5630         Left.is(TT_CSharpNamedArgumentColon)) {
5631       return false;
5632     }
5633     if (Right.is(TT_CSharpGenericTypeConstraint))
5634       return true;
5635     if (AfterRight && AfterRight->is(TT_FatArrow) &&
5636         (Right.is(tok::numeric_constant) ||
5637          (Right.is(tok::identifier) && Right.TokenText == "_"))) {
5638       return true;
5639     }
5640 
5641     // Break after C# [...] and before public/protected/private/internal.
5642     if (Left.is(TT_AttributeSquare) && Left.is(tok::r_square) &&
5643         (Right.isAccessSpecifier(/*ColonRequired=*/false) ||
5644          Right.is(Keywords.kw_internal))) {
5645       return true;
5646     }
5647     // Break between ] and [ but only when there are really 2 attributes.
5648     if (Left.is(TT_AttributeSquare) && Right.is(TT_AttributeSquare) &&
5649         Left.is(tok::r_square) && Right.is(tok::l_square)) {
5650       return true;
5651     }
5652   } else if (Style.isJavaScript()) {
5653     // FIXME: This might apply to other languages and token kinds.
5654     if (Right.is(tok::string_literal) && Left.is(tok::plus) && BeforeLeft &&
5655         BeforeLeft->is(tok::string_literal)) {
5656       return true;
5657     }
5658     if (Left.is(TT_DictLiteral) && Left.is(tok::l_brace) && Line.Level == 0 &&
5659         BeforeLeft && BeforeLeft->is(tok::equal) &&
5660         Line.First->isOneOf(tok::identifier, Keywords.kw_import, tok::kw_export,
5661                             tok::kw_const) &&
5662         // kw_var/kw_let are pseudo-tokens that are tok::identifier, so match
5663         // above.
5664         !Line.First->isOneOf(Keywords.kw_var, Keywords.kw_let)) {
5665       // Object literals on the top level of a file are treated as "enum-style".
5666       // Each key/value pair is put on a separate line, instead of bin-packing.
5667       return true;
5668     }
5669     if (Left.is(tok::l_brace) && Line.Level == 0 &&
5670         (Line.startsWith(tok::kw_enum) ||
5671          Line.startsWith(tok::kw_const, tok::kw_enum) ||
5672          Line.startsWith(tok::kw_export, tok::kw_enum) ||
5673          Line.startsWith(tok::kw_export, tok::kw_const, tok::kw_enum))) {
5674       // JavaScript top-level enum key/value pairs are put on separate lines
5675       // instead of bin-packing.
5676       return true;
5677     }
5678     if (Right.is(tok::r_brace) && Left.is(tok::l_brace) && BeforeLeft &&
5679         BeforeLeft->is(TT_FatArrow)) {
5680       // JS arrow function (=> {...}).
5681       switch (Style.AllowShortLambdasOnASingleLine) {
5682       case FormatStyle::SLS_All:
5683         return false;
5684       case FormatStyle::SLS_None:
5685         return true;
5686       case FormatStyle::SLS_Empty:
5687         return !Left.Children.empty();
5688       case FormatStyle::SLS_Inline:
5689         // allow one-lining inline (e.g. in function call args) and empty arrow
5690         // functions.
5691         return (Left.NestingLevel == 0 && Line.Level == 0) &&
5692                !Left.Children.empty();
5693       }
5694       llvm_unreachable("Unknown FormatStyle::ShortLambdaStyle enum");
5695     }
5696 
5697     if (Right.is(tok::r_brace) && Left.is(tok::l_brace) &&
5698         !Left.Children.empty()) {
5699       // Support AllowShortFunctionsOnASingleLine for JavaScript.
5700       return Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_None ||
5701              Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_Empty ||
5702              (Left.NestingLevel == 0 && Line.Level == 0 &&
5703               Style.AllowShortFunctionsOnASingleLine &
5704                   FormatStyle::SFS_InlineOnly);
5705     }
5706   } else if (Style.isJava()) {
5707     if (Right.is(tok::plus) && Left.is(tok::string_literal) && AfterRight &&
5708         AfterRight->is(tok::string_literal)) {
5709       return true;
5710     }
5711   } else if (Style.isVerilog()) {
5712     // Break between assignments.
5713     if (Left.is(TT_VerilogAssignComma))
5714       return true;
5715     // Break between ports of different types.
5716     if (Left.is(TT_VerilogTypeComma))
5717       return true;
5718     // Break between ports in a module instantiation and after the parameter
5719     // list.
5720     if (Style.VerilogBreakBetweenInstancePorts &&
5721         (Left.is(TT_VerilogInstancePortComma) ||
5722          (Left.is(tok::r_paren) && Keywords.isVerilogIdentifier(Right) &&
5723           Left.MatchingParen &&
5724           Left.MatchingParen->is(TT_VerilogInstancePortLParen)))) {
5725       return true;
5726     }
5727     // Break after labels. In Verilog labels don't have the 'case' keyword, so
5728     // it is hard to identify them in UnwrappedLineParser.
5729     if (!Keywords.isVerilogBegin(Right) && Keywords.isVerilogEndOfLabel(Left))
5730       return true;
5731   } else if (Style.BreakAdjacentStringLiterals &&
5732              (IsCpp || Style.isProto() || Style.isTableGen())) {
5733     if (Left.isStringLiteral() && Right.isStringLiteral())
5734       return true;
5735   }
5736 
5737   // Basic JSON newline processing.
5738   if (Style.isJson()) {
5739     // Always break after a JSON record opener.
5740     // {
5741     // }
5742     if (Left.is(TT_DictLiteral) && Left.is(tok::l_brace))
5743       return true;
5744     // Always break after a JSON array opener based on BreakArrays.
5745     if ((Left.is(TT_ArrayInitializerLSquare) && Left.is(tok::l_square) &&
5746          Right.isNot(tok::r_square)) ||
5747         Left.is(tok::comma)) {
5748       if (Right.is(tok::l_brace))
5749         return true;
5750       // scan to the right if an we see an object or an array inside
5751       // then break.
5752       for (const auto *Tok = &Right; Tok; Tok = Tok->Next) {
5753         if (Tok->isOneOf(tok::l_brace, tok::l_square))
5754           return true;
5755         if (Tok->isOneOf(tok::r_brace, tok::r_square))
5756           break;
5757       }
5758       return Style.BreakArrays;
5759     }
5760   } else if (Style.isTableGen()) {
5761     // Break the comma in side cond operators.
5762     // !cond(case1:1,
5763     //       case2:0);
5764     if (Left.is(TT_TableGenCondOperatorComma))
5765       return true;
5766     if (Left.is(TT_TableGenDAGArgOperatorToBreak) &&
5767         Right.isNot(TT_TableGenDAGArgCloser)) {
5768       return true;
5769     }
5770     if (Left.is(TT_TableGenDAGArgListCommaToBreak))
5771       return true;
5772     if (Right.is(TT_TableGenDAGArgCloser) && Right.MatchingParen &&
5773         Right.MatchingParen->is(TT_TableGenDAGArgOpenerToBreak) &&
5774         &Left != Right.MatchingParen->Next) {
5775       // Check to avoid empty DAGArg such as (ins).
5776       return Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakAll;
5777     }
5778   }
5779 
5780   if (Line.startsWith(tok::kw_asm) && Right.is(TT_InlineASMColon) &&
5781       Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_Always) {
5782     return true;
5783   }
5784 
5785   // If the last token before a '}', ']', or ')' is a comma or a trailing
5786   // comment, the intention is to insert a line break after it in order to make
5787   // shuffling around entries easier. Import statements, especially in
5788   // JavaScript, can be an exception to this rule.
5789   if (Style.JavaScriptWrapImports || Line.Type != LT_ImportStatement) {
5790     const FormatToken *BeforeClosingBrace = nullptr;
5791     if ((Left.isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
5792          (Style.isJavaScript() && Left.is(tok::l_paren))) &&
5793         Left.isNot(BK_Block) && Left.MatchingParen) {
5794       BeforeClosingBrace = Left.MatchingParen->Previous;
5795     } else if (Right.MatchingParen &&
5796                (Right.MatchingParen->isOneOf(tok::l_brace,
5797                                              TT_ArrayInitializerLSquare) ||
5798                 (Style.isJavaScript() &&
5799                  Right.MatchingParen->is(tok::l_paren)))) {
5800       BeforeClosingBrace = &Left;
5801     }
5802     if (BeforeClosingBrace && (BeforeClosingBrace->is(tok::comma) ||
5803                                BeforeClosingBrace->isTrailingComment())) {
5804       return true;
5805     }
5806   }
5807 
5808   if (Right.is(tok::comment)) {
5809     return Left.isNot(BK_BracedInit) && Left.isNot(TT_CtorInitializerColon) &&
5810            (Right.NewlinesBefore > 0 && Right.HasUnescapedNewline);
5811   }
5812   if (Left.isTrailingComment())
5813     return true;
5814   if (Left.IsUnterminatedLiteral)
5815     return true;
5816 
5817   if (BeforeLeft && BeforeLeft->is(tok::lessless) &&
5818       Left.is(tok::string_literal) && Right.is(tok::lessless) && AfterRight &&
5819       AfterRight->is(tok::string_literal)) {
5820     return Right.NewlinesBefore > 0;
5821   }
5822 
5823   if (Right.is(TT_RequiresClause)) {
5824     switch (Style.RequiresClausePosition) {
5825     case FormatStyle::RCPS_OwnLine:
5826     case FormatStyle::RCPS_OwnLineWithBrace:
5827     case FormatStyle::RCPS_WithFollowing:
5828       return true;
5829     default:
5830       break;
5831     }
5832   }
5833   // Can break after template<> declaration
5834   if (Left.ClosesTemplateDeclaration && Left.MatchingParen &&
5835       Left.MatchingParen->NestingLevel == 0) {
5836     // Put concepts on the next line e.g.
5837     // template<typename T>
5838     // concept ...
5839     if (Right.is(tok::kw_concept))
5840       return Style.BreakBeforeConceptDeclarations == FormatStyle::BBCDS_Always;
5841     return Style.BreakTemplateDeclarations == FormatStyle::BTDS_Yes ||
5842            (Style.BreakTemplateDeclarations == FormatStyle::BTDS_Leave &&
5843             Right.NewlinesBefore > 0);
5844   }
5845   if (Left.ClosesRequiresClause) {
5846     switch (Style.RequiresClausePosition) {
5847     case FormatStyle::RCPS_OwnLine:
5848     case FormatStyle::RCPS_WithPreceding:
5849       return Right.isNot(tok::semi);
5850     case FormatStyle::RCPS_OwnLineWithBrace:
5851       return !Right.isOneOf(tok::semi, tok::l_brace);
5852     default:
5853       break;
5854     }
5855   }
5856   if (Style.PackConstructorInitializers == FormatStyle::PCIS_Never) {
5857     if (Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeColon &&
5858         (Left.is(TT_CtorInitializerComma) ||
5859          Right.is(TT_CtorInitializerColon))) {
5860       return true;
5861     }
5862 
5863     if (Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon &&
5864         Left.isOneOf(TT_CtorInitializerColon, TT_CtorInitializerComma)) {
5865       return true;
5866     }
5867   }
5868   if (Style.PackConstructorInitializers < FormatStyle::PCIS_CurrentLine &&
5869       Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma &&
5870       Right.isOneOf(TT_CtorInitializerComma, TT_CtorInitializerColon)) {
5871     return true;
5872   }
5873   if (Style.PackConstructorInitializers == FormatStyle::PCIS_NextLineOnly) {
5874     if ((Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeColon ||
5875          Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) &&
5876         Right.is(TT_CtorInitializerColon)) {
5877       return true;
5878     }
5879 
5880     if (Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon &&
5881         Left.is(TT_CtorInitializerColon)) {
5882       return true;
5883     }
5884   }
5885   // Break only if we have multiple inheritance.
5886   if (Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma &&
5887       Right.is(TT_InheritanceComma)) {
5888     return true;
5889   }
5890   if (Style.BreakInheritanceList == FormatStyle::BILS_AfterComma &&
5891       Left.is(TT_InheritanceComma)) {
5892     return true;
5893   }
5894   if (Right.is(tok::string_literal) && Right.TokenText.starts_with("R\"")) {
5895     // Multiline raw string literals are special wrt. line breaks. The author
5896     // has made a deliberate choice and might have aligned the contents of the
5897     // string literal accordingly. Thus, we try keep existing line breaks.
5898     return Right.IsMultiline && Right.NewlinesBefore > 0;
5899   }
5900   if ((Left.is(tok::l_brace) ||
5901        (Left.is(tok::less) && BeforeLeft && BeforeLeft->is(tok::equal))) &&
5902       Right.NestingLevel == 1 && Style.Language == FormatStyle::LK_Proto) {
5903     // Don't put enums or option definitions onto single lines in protocol
5904     // buffers.
5905     return true;
5906   }
5907   if (Right.is(TT_InlineASMBrace))
5908     return Right.HasUnescapedNewline;
5909 
5910   if (isAllmanBrace(Left) || isAllmanBrace(Right)) {
5911     auto *FirstNonComment = Line.getFirstNonComment();
5912     bool AccessSpecifier =
5913         FirstNonComment && (FirstNonComment->is(Keywords.kw_internal) ||
5914                             FirstNonComment->isAccessSpecifierKeyword());
5915 
5916     if (Style.BraceWrapping.AfterEnum) {
5917       if (Line.startsWith(tok::kw_enum) ||
5918           Line.startsWith(tok::kw_typedef, tok::kw_enum)) {
5919         return true;
5920       }
5921       // Ensure BraceWrapping for `public enum A {`.
5922       if (AccessSpecifier && FirstNonComment->Next &&
5923           FirstNonComment->Next->is(tok::kw_enum)) {
5924         return true;
5925       }
5926     }
5927 
5928     // Ensure BraceWrapping for `public interface A {`.
5929     if (Style.BraceWrapping.AfterClass &&
5930         ((AccessSpecifier && FirstNonComment->Next &&
5931           FirstNonComment->Next->is(Keywords.kw_interface)) ||
5932          Line.startsWith(Keywords.kw_interface))) {
5933       return true;
5934     }
5935 
5936     // Don't attempt to interpret struct return types as structs.
5937     if (Right.isNot(TT_FunctionLBrace)) {
5938       return (Line.startsWith(tok::kw_class) &&
5939               Style.BraceWrapping.AfterClass) ||
5940              (Line.startsWith(tok::kw_struct) &&
5941               Style.BraceWrapping.AfterStruct);
5942     }
5943   }
5944 
5945   if (Left.is(TT_ObjCBlockLBrace) &&
5946       Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never) {
5947     return true;
5948   }
5949 
5950   // Ensure wrapping after __attribute__((XX)) and @interface etc.
5951   if (Left.isOneOf(TT_AttributeRParen, TT_AttributeMacro) &&
5952       Right.is(TT_ObjCDecl)) {
5953     return true;
5954   }
5955 
5956   if (Left.is(TT_LambdaLBrace)) {
5957     if (IsFunctionArgument(Left) &&
5958         Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_Inline) {
5959       return false;
5960     }
5961 
5962     if (Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_None ||
5963         Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_Inline ||
5964         (!Left.Children.empty() &&
5965          Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_Empty)) {
5966       return true;
5967     }
5968   }
5969 
5970   if (Style.BraceWrapping.BeforeLambdaBody && Right.is(TT_LambdaLBrace) &&
5971       (Left.isPointerOrReference() || Left.is(TT_TemplateCloser))) {
5972     return true;
5973   }
5974 
5975   // Put multiple Java annotation on a new line.
5976   if ((Style.isJava() || Style.isJavaScript()) &&
5977       Left.is(TT_LeadingJavaAnnotation) &&
5978       Right.isNot(TT_LeadingJavaAnnotation) && Right.isNot(tok::l_paren) &&
5979       (Line.Last->is(tok::l_brace) || Style.BreakAfterJavaFieldAnnotations)) {
5980     return true;
5981   }
5982 
5983   if (Right.is(TT_ProtoExtensionLSquare))
5984     return true;
5985 
5986   // In text proto instances if a submessage contains at least 2 entries and at
5987   // least one of them is a submessage, like A { ... B { ... } ... },
5988   // put all of the entries of A on separate lines by forcing the selector of
5989   // the submessage B to be put on a newline.
5990   //
5991   // Example: these can stay on one line:
5992   // a { scalar_1: 1 scalar_2: 2 }
5993   // a { b { key: value } }
5994   //
5995   // and these entries need to be on a new line even if putting them all in one
5996   // line is under the column limit:
5997   // a {
5998   //   scalar: 1
5999   //   b { key: value }
6000   // }
6001   //
6002   // We enforce this by breaking before a submessage field that has previous
6003   // siblings, *and* breaking before a field that follows a submessage field.
6004   //
6005   // Be careful to exclude the case  [proto.ext] { ... } since the `]` is
6006   // the TT_SelectorName there, but we don't want to break inside the brackets.
6007   //
6008   // Another edge case is @submessage { key: value }, which is a common
6009   // substitution placeholder. In this case we want to keep `@` and `submessage`
6010   // together.
6011   //
6012   // We ensure elsewhere that extensions are always on their own line.
6013   if (Style.isProto() && Right.is(TT_SelectorName) &&
6014       Right.isNot(tok::r_square) && AfterRight) {
6015     // Keep `@submessage` together in:
6016     // @submessage { key: value }
6017     if (Left.is(tok::at))
6018       return false;
6019     // Look for the scope opener after selector in cases like:
6020     // selector { ...
6021     // selector: { ...
6022     // selector: @base { ...
6023     const auto *LBrace = AfterRight;
6024     if (LBrace && LBrace->is(tok::colon)) {
6025       LBrace = LBrace->Next;
6026       if (LBrace && LBrace->is(tok::at)) {
6027         LBrace = LBrace->Next;
6028         if (LBrace)
6029           LBrace = LBrace->Next;
6030       }
6031     }
6032     if (LBrace &&
6033         // The scope opener is one of {, [, <:
6034         // selector { ... }
6035         // selector [ ... ]
6036         // selector < ... >
6037         //
6038         // In case of selector { ... }, the l_brace is TT_DictLiteral.
6039         // In case of an empty selector {}, the l_brace is not TT_DictLiteral,
6040         // so we check for immediately following r_brace.
6041         ((LBrace->is(tok::l_brace) &&
6042           (LBrace->is(TT_DictLiteral) ||
6043            (LBrace->Next && LBrace->Next->is(tok::r_brace)))) ||
6044          LBrace->is(TT_ArrayInitializerLSquare) || LBrace->is(tok::less))) {
6045       // If Left.ParameterCount is 0, then this submessage entry is not the
6046       // first in its parent submessage, and we want to break before this entry.
6047       // If Left.ParameterCount is greater than 0, then its parent submessage
6048       // might contain 1 or more entries and we want to break before this entry
6049       // if it contains at least 2 entries. We deal with this case later by
6050       // detecting and breaking before the next entry in the parent submessage.
6051       if (Left.ParameterCount == 0)
6052         return true;
6053       // However, if this submessage is the first entry in its parent
6054       // submessage, Left.ParameterCount might be 1 in some cases.
6055       // We deal with this case later by detecting an entry
6056       // following a closing paren of this submessage.
6057     }
6058 
6059     // If this is an entry immediately following a submessage, it will be
6060     // preceded by a closing paren of that submessage, like in:
6061     //     left---.  .---right
6062     //            v  v
6063     // sub: { ... } key: value
6064     // If there was a comment between `}` an `key` above, then `key` would be
6065     // put on a new line anyways.
6066     if (Left.isOneOf(tok::r_brace, tok::greater, tok::r_square))
6067       return true;
6068   }
6069 
6070   return false;
6071 }
6072 
canBreakBefore(const AnnotatedLine & Line,const FormatToken & Right) const6073 bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line,
6074                                     const FormatToken &Right) const {
6075   const FormatToken &Left = *Right.Previous;
6076   // Language-specific stuff.
6077   if (Style.isCSharp()) {
6078     if (Left.isOneOf(TT_CSharpNamedArgumentColon, TT_AttributeColon) ||
6079         Right.isOneOf(TT_CSharpNamedArgumentColon, TT_AttributeColon)) {
6080       return false;
6081     }
6082     // Only break after commas for generic type constraints.
6083     if (Line.First->is(TT_CSharpGenericTypeConstraint))
6084       return Left.is(TT_CSharpGenericTypeConstraintComma);
6085     // Keep nullable operators attached to their identifiers.
6086     if (Right.is(TT_CSharpNullable))
6087       return false;
6088   } else if (Style.isJava()) {
6089     if (Left.isOneOf(Keywords.kw_throws, Keywords.kw_extends,
6090                      Keywords.kw_implements)) {
6091       return false;
6092     }
6093     if (Right.isOneOf(Keywords.kw_throws, Keywords.kw_extends,
6094                       Keywords.kw_implements)) {
6095       return true;
6096     }
6097   } else if (Style.isJavaScript()) {
6098     const FormatToken *NonComment = Right.getPreviousNonComment();
6099     if (NonComment &&
6100         (NonComment->isAccessSpecifierKeyword() ||
6101          NonComment->isOneOf(
6102              tok::kw_return, Keywords.kw_yield, tok::kw_continue, tok::kw_break,
6103              tok::kw_throw, Keywords.kw_interface, Keywords.kw_type,
6104              tok::kw_static, Keywords.kw_readonly, Keywords.kw_override,
6105              Keywords.kw_abstract, Keywords.kw_get, Keywords.kw_set,
6106              Keywords.kw_async, Keywords.kw_await))) {
6107       return false; // Otherwise automatic semicolon insertion would trigger.
6108     }
6109     if (Right.NestingLevel == 0 &&
6110         (Left.Tok.getIdentifierInfo() ||
6111          Left.isOneOf(tok::r_square, tok::r_paren)) &&
6112         Right.isOneOf(tok::l_square, tok::l_paren)) {
6113       return false; // Otherwise automatic semicolon insertion would trigger.
6114     }
6115     if (NonComment && NonComment->is(tok::identifier) &&
6116         NonComment->TokenText == "asserts") {
6117       return false;
6118     }
6119     if (Left.is(TT_FatArrow) && Right.is(tok::l_brace))
6120       return false;
6121     if (Left.is(TT_JsTypeColon))
6122       return true;
6123     // Don't wrap between ":" and "!" of a strict prop init ("field!: type;").
6124     if (Left.is(tok::exclaim) && Right.is(tok::colon))
6125       return false;
6126     // Look for is type annotations like:
6127     // function f(): a is B { ... }
6128     // Do not break before is in these cases.
6129     if (Right.is(Keywords.kw_is)) {
6130       const FormatToken *Next = Right.getNextNonComment();
6131       // If `is` is followed by a colon, it's likely that it's a dict key, so
6132       // ignore it for this check.
6133       // For example this is common in Polymer:
6134       // Polymer({
6135       //   is: 'name',
6136       //   ...
6137       // });
6138       if (!Next || Next->isNot(tok::colon))
6139         return false;
6140     }
6141     if (Left.is(Keywords.kw_in))
6142       return Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None;
6143     if (Right.is(Keywords.kw_in))
6144       return Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None;
6145     if (Right.is(Keywords.kw_as))
6146       return false; // must not break before as in 'x as type' casts
6147     if (Right.isOneOf(Keywords.kw_extends, Keywords.kw_infer)) {
6148       // extends and infer can appear as keywords in conditional types:
6149       //   https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#conditional-types
6150       // do not break before them, as the expressions are subject to ASI.
6151       return false;
6152     }
6153     if (Left.is(Keywords.kw_as))
6154       return true;
6155     if (Left.is(TT_NonNullAssertion))
6156       return true;
6157     if (Left.is(Keywords.kw_declare) &&
6158         Right.isOneOf(Keywords.kw_module, tok::kw_namespace,
6159                       Keywords.kw_function, tok::kw_class, tok::kw_enum,
6160                       Keywords.kw_interface, Keywords.kw_type, Keywords.kw_var,
6161                       Keywords.kw_let, tok::kw_const)) {
6162       // See grammar for 'declare' statements at:
6163       // https://github.com/Microsoft/TypeScript/blob/main/doc/spec-ARCHIVED.md#A.10
6164       return false;
6165     }
6166     if (Left.isOneOf(Keywords.kw_module, tok::kw_namespace) &&
6167         Right.isOneOf(tok::identifier, tok::string_literal)) {
6168       return false; // must not break in "module foo { ...}"
6169     }
6170     if (Right.is(TT_TemplateString) && Right.closesScope())
6171       return false;
6172     // Don't split tagged template literal so there is a break between the tag
6173     // identifier and template string.
6174     if (Left.is(tok::identifier) && Right.is(TT_TemplateString))
6175       return false;
6176     if (Left.is(TT_TemplateString) && Left.opensScope())
6177       return true;
6178   } else if (Style.isTableGen()) {
6179     // Avoid to break after "def", "class", "let" and so on.
6180     if (Keywords.isTableGenDefinition(Left))
6181       return false;
6182     // Avoid to break after '(' in the cases that is in bang operators.
6183     if (Right.is(tok::l_paren)) {
6184       return !Left.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator,
6185                            TT_TemplateCloser);
6186     }
6187     // Avoid to break between the value and its suffix part.
6188     if (Left.is(TT_TableGenValueSuffix))
6189       return false;
6190     // Avoid to break around paste operator.
6191     if (Left.is(tok::hash) || Right.is(tok::hash))
6192       return false;
6193     if (Left.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator))
6194       return false;
6195   }
6196 
6197   // We can break before an r_brace if there was a break after the matching
6198   // l_brace, which is tracked by BreakBeforeClosingBrace, or if we are in a
6199   // block-indented initialization list.
6200   if (Right.is(tok::r_brace)) {
6201     return Right.MatchingParen && (Right.MatchingParen->is(BK_Block) ||
6202                                    (Right.isBlockIndentedInitRBrace(Style)));
6203   }
6204 
6205   // We only break before r_paren if we're in a block indented context.
6206   if (Right.is(tok::r_paren)) {
6207     if (Style.AlignAfterOpenBracket != FormatStyle::BAS_BlockIndent ||
6208         !Right.MatchingParen) {
6209       return false;
6210     }
6211     auto Next = Right.Next;
6212     if (Next && Next->is(tok::r_paren))
6213       Next = Next->Next;
6214     if (Next && Next->is(tok::l_paren))
6215       return false;
6216     const FormatToken *Previous = Right.MatchingParen->Previous;
6217     return !(Previous && (Previous->is(tok::kw_for) || Previous->isIf()));
6218   }
6219 
6220   if (Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) &&
6221       Right.is(TT_TrailingAnnotation) &&
6222       Style.AlignAfterOpenBracket == FormatStyle::BAS_BlockIndent) {
6223     return false;
6224   }
6225 
6226   if (Right.is(TT_TemplateCloser))
6227     return Style.BreakBeforeTemplateCloser;
6228 
6229   if (Left.isOneOf(tok::at, tok::objc_interface))
6230     return false;
6231   if (Left.isOneOf(TT_JavaAnnotation, TT_LeadingJavaAnnotation))
6232     return Right.isNot(tok::l_paren);
6233   if (Right.is(TT_PointerOrReference)) {
6234     return Line.IsMultiVariableDeclStmt ||
6235            (getTokenPointerOrReferenceAlignment(Right) ==
6236                 FormatStyle::PAS_Right &&
6237             !(Right.Next &&
6238               Right.Next->isOneOf(TT_FunctionDeclarationName, tok::kw_const)));
6239   }
6240   if (Right.isOneOf(TT_StartOfName, TT_FunctionDeclarationName,
6241                     TT_ClassHeadName, tok::kw_operator)) {
6242     return true;
6243   }
6244   if (Left.is(TT_PointerOrReference))
6245     return false;
6246   if (Right.isTrailingComment()) {
6247     // We rely on MustBreakBefore being set correctly here as we should not
6248     // change the "binding" behavior of a comment.
6249     // The first comment in a braced lists is always interpreted as belonging to
6250     // the first list element. Otherwise, it should be placed outside of the
6251     // list.
6252     return Left.is(BK_BracedInit) ||
6253            (Left.is(TT_CtorInitializerColon) && Right.NewlinesBefore > 0 &&
6254             Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon);
6255   }
6256   if (Left.is(tok::question) && Right.is(tok::colon))
6257     return false;
6258   if (Right.is(TT_ConditionalExpr) || Right.is(tok::question))
6259     return Style.BreakBeforeTernaryOperators;
6260   if (Left.is(TT_ConditionalExpr) || Left.is(tok::question))
6261     return !Style.BreakBeforeTernaryOperators;
6262   if (Left.is(TT_InheritanceColon))
6263     return Style.BreakInheritanceList == FormatStyle::BILS_AfterColon;
6264   if (Right.is(TT_InheritanceColon))
6265     return Style.BreakInheritanceList != FormatStyle::BILS_AfterColon;
6266   if (Right.is(TT_ObjCMethodExpr) && Right.isNot(tok::r_square) &&
6267       Left.isNot(TT_SelectorName)) {
6268     return true;
6269   }
6270 
6271   if (Right.is(tok::colon) &&
6272       !Right.isOneOf(TT_CtorInitializerColon, TT_InlineASMColon,
6273                      TT_BitFieldColon)) {
6274     return false;
6275   }
6276   if (Left.is(tok::colon) && Left.isOneOf(TT_DictLiteral, TT_ObjCMethodExpr)) {
6277     if (Style.isProto()) {
6278       if (!Style.AlwaysBreakBeforeMultilineStrings && Right.isStringLiteral())
6279         return false;
6280       // Prevent cases like:
6281       //
6282       // submessage:
6283       //     { key: valueeeeeeeeeeee }
6284       //
6285       // when the snippet does not fit into one line.
6286       // Prefer:
6287       //
6288       // submessage: {
6289       //   key: valueeeeeeeeeeee
6290       // }
6291       //
6292       // instead, even if it is longer by one line.
6293       //
6294       // Note that this allows the "{" to go over the column limit
6295       // when the column limit is just between ":" and "{", but that does
6296       // not happen too often and alternative formattings in this case are
6297       // not much better.
6298       //
6299       // The code covers the cases:
6300       //
6301       // submessage: { ... }
6302       // submessage: < ... >
6303       // repeated: [ ... ]
6304       if (((Right.is(tok::l_brace) || Right.is(tok::less)) &&
6305            Right.is(TT_DictLiteral)) ||
6306           Right.is(TT_ArrayInitializerLSquare)) {
6307         return false;
6308       }
6309     }
6310     return true;
6311   }
6312   if (Right.is(tok::r_square) && Right.MatchingParen &&
6313       Right.MatchingParen->is(TT_ProtoExtensionLSquare)) {
6314     return false;
6315   }
6316   if (Right.is(TT_SelectorName) || (Right.is(tok::identifier) && Right.Next &&
6317                                     Right.Next->is(TT_ObjCMethodExpr))) {
6318     return Left.isNot(tok::period); // FIXME: Properly parse ObjC calls.
6319   }
6320   if (Left.is(tok::r_paren) && Line.Type == LT_ObjCProperty)
6321     return true;
6322   if (Right.is(tok::kw_concept))
6323     return Style.BreakBeforeConceptDeclarations != FormatStyle::BBCDS_Never;
6324   if (Right.is(TT_RequiresClause))
6325     return true;
6326   if (Left.ClosesTemplateDeclaration) {
6327     return Style.BreakTemplateDeclarations != FormatStyle::BTDS_Leave ||
6328            Right.NewlinesBefore > 0;
6329   }
6330   if (Left.is(TT_FunctionAnnotationRParen))
6331     return true;
6332   if (Left.ClosesRequiresClause)
6333     return true;
6334   if (Right.isOneOf(TT_RangeBasedForLoopColon, TT_OverloadedOperatorLParen,
6335                     TT_OverloadedOperator)) {
6336     return false;
6337   }
6338   if (Left.is(TT_RangeBasedForLoopColon))
6339     return true;
6340   if (Right.is(TT_RangeBasedForLoopColon))
6341     return false;
6342   if (Left.is(TT_TemplateCloser) && Right.is(TT_TemplateOpener))
6343     return true;
6344   if ((Left.is(tok::greater) && Right.is(tok::greater)) ||
6345       (Left.is(tok::less) && Right.is(tok::less))) {
6346     return false;
6347   }
6348   if (Right.is(TT_BinaryOperator) &&
6349       Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None &&
6350       (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_All ||
6351        Right.getPrecedence() != prec::Assignment)) {
6352     return true;
6353   }
6354   if (Left.isOneOf(TT_TemplateCloser, TT_UnaryOperator) ||
6355       Left.is(tok::kw_operator)) {
6356     return false;
6357   }
6358   if (Left.is(tok::equal) && !Right.isOneOf(tok::kw_default, tok::kw_delete) &&
6359       Line.Type == LT_VirtualFunctionDecl && Left.NestingLevel == 0) {
6360     return false;
6361   }
6362   if (Left.is(tok::equal) && Right.is(tok::l_brace) &&
6363       !Style.Cpp11BracedListStyle) {
6364     return false;
6365   }
6366   if (Left.is(TT_AttributeLParen) ||
6367       (Left.is(tok::l_paren) && Left.is(TT_TypeDeclarationParen))) {
6368     return false;
6369   }
6370   if (Left.is(tok::l_paren) && Left.Previous &&
6371       (Left.Previous->isOneOf(TT_BinaryOperator, TT_CastRParen))) {
6372     return false;
6373   }
6374   if (Right.is(TT_ImplicitStringLiteral))
6375     return false;
6376 
6377   if (Right.is(tok::r_square) && Right.MatchingParen &&
6378       Right.MatchingParen->is(TT_LambdaLSquare)) {
6379     return false;
6380   }
6381 
6382   // Allow breaking after a trailing annotation, e.g. after a method
6383   // declaration.
6384   if (Left.is(TT_TrailingAnnotation)) {
6385     return !Right.isOneOf(tok::l_brace, tok::semi, tok::equal, tok::l_paren,
6386                           tok::less, tok::coloncolon);
6387   }
6388 
6389   if (Right.isAttribute())
6390     return true;
6391 
6392   if (Right.is(tok::l_square) && Right.is(TT_AttributeSquare))
6393     return Left.isNot(TT_AttributeSquare);
6394 
6395   if (Left.is(tok::identifier) && Right.is(tok::string_literal))
6396     return true;
6397 
6398   if (Right.is(tok::identifier) && Right.Next && Right.Next->is(TT_DictLiteral))
6399     return true;
6400 
6401   if (Left.is(TT_CtorInitializerColon)) {
6402     return Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon &&
6403            (!Right.isTrailingComment() || Right.NewlinesBefore > 0);
6404   }
6405   if (Right.is(TT_CtorInitializerColon))
6406     return Style.BreakConstructorInitializers != FormatStyle::BCIS_AfterColon;
6407   if (Left.is(TT_CtorInitializerComma) &&
6408       Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) {
6409     return false;
6410   }
6411   if (Right.is(TT_CtorInitializerComma) &&
6412       Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) {
6413     return true;
6414   }
6415   if (Left.is(TT_InheritanceComma) &&
6416       Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma) {
6417     return false;
6418   }
6419   if (Right.is(TT_InheritanceComma) &&
6420       Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma) {
6421     return true;
6422   }
6423   if (Left.is(TT_ArrayInitializerLSquare))
6424     return true;
6425   if (Right.is(tok::kw_typename) && Left.isNot(tok::kw_const))
6426     return true;
6427   if ((Left.isBinaryOperator() || Left.is(TT_BinaryOperator)) &&
6428       !Left.isOneOf(tok::arrowstar, tok::lessless) &&
6429       Style.BreakBeforeBinaryOperators != FormatStyle::BOS_All &&
6430       (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None ||
6431        Left.getPrecedence() == prec::Assignment)) {
6432     return true;
6433   }
6434   if ((Left.is(TT_AttributeSquare) && Right.is(tok::l_square)) ||
6435       (Left.is(tok::r_square) && Right.is(TT_AttributeSquare))) {
6436     return false;
6437   }
6438 
6439   auto ShortLambdaOption = Style.AllowShortLambdasOnASingleLine;
6440   if (Style.BraceWrapping.BeforeLambdaBody && Right.is(TT_LambdaLBrace)) {
6441     if (isAllmanLambdaBrace(Left))
6442       return !isItAnEmptyLambdaAllowed(Left, ShortLambdaOption);
6443     if (isAllmanLambdaBrace(Right))
6444       return !isItAnEmptyLambdaAllowed(Right, ShortLambdaOption);
6445   }
6446 
6447   if (Right.is(tok::kw_noexcept) && Right.is(TT_TrailingAnnotation)) {
6448     switch (Style.AllowBreakBeforeNoexceptSpecifier) {
6449     case FormatStyle::BBNSS_Never:
6450       return false;
6451     case FormatStyle::BBNSS_Always:
6452       return true;
6453     case FormatStyle::BBNSS_OnlyWithParen:
6454       return Right.Next && Right.Next->is(tok::l_paren);
6455     }
6456   }
6457 
6458   return Left.isOneOf(tok::comma, tok::coloncolon, tok::semi, tok::l_brace,
6459                       tok::kw_class, tok::kw_struct, tok::comment) ||
6460          Right.isMemberAccess() ||
6461          Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow, tok::lessless,
6462                        tok::colon, tok::l_square, tok::at) ||
6463          (Left.is(tok::r_paren) &&
6464           Right.isOneOf(tok::identifier, tok::kw_const)) ||
6465          (Left.is(tok::l_paren) && Right.isNot(tok::r_paren)) ||
6466          (Left.is(TT_TemplateOpener) && Right.isNot(TT_TemplateCloser));
6467 }
6468 
printDebugInfo(const AnnotatedLine & Line) const6469 void TokenAnnotator::printDebugInfo(const AnnotatedLine &Line) const {
6470   llvm::errs() << "AnnotatedTokens(L=" << Line.Level << ", P=" << Line.PPLevel
6471                << ", T=" << Line.Type << ", C=" << Line.IsContinuation
6472                << "):\n";
6473   const FormatToken *Tok = Line.First;
6474   while (Tok) {
6475     llvm::errs() << " M=" << Tok->MustBreakBefore
6476                  << " C=" << Tok->CanBreakBefore
6477                  << " T=" << getTokenTypeName(Tok->getType())
6478                  << " S=" << Tok->SpacesRequiredBefore
6479                  << " F=" << Tok->Finalized << " B=" << Tok->BlockParameterCount
6480                  << " BK=" << Tok->getBlockKind() << " P=" << Tok->SplitPenalty
6481                  << " Name=" << Tok->Tok.getName() << " L=" << Tok->TotalLength
6482                  << " PPK=" << Tok->getPackingKind() << " FakeLParens=";
6483     for (prec::Level LParen : Tok->FakeLParens)
6484       llvm::errs() << LParen << "/";
6485     llvm::errs() << " FakeRParens=" << Tok->FakeRParens;
6486     llvm::errs() << " II=" << Tok->Tok.getIdentifierInfo();
6487     llvm::errs() << " Text='" << Tok->TokenText << "'\n";
6488     if (!Tok->Next)
6489       assert(Tok == Line.Last);
6490     Tok = Tok->Next;
6491   }
6492   llvm::errs() << "----\n";
6493 }
6494 
6495 FormatStyle::PointerAlignmentStyle
getTokenReferenceAlignment(const FormatToken & Reference) const6496 TokenAnnotator::getTokenReferenceAlignment(const FormatToken &Reference) const {
6497   assert(Reference.isOneOf(tok::amp, tok::ampamp));
6498   switch (Style.ReferenceAlignment) {
6499   case FormatStyle::RAS_Pointer:
6500     return Style.PointerAlignment;
6501   case FormatStyle::RAS_Left:
6502     return FormatStyle::PAS_Left;
6503   case FormatStyle::RAS_Right:
6504     return FormatStyle::PAS_Right;
6505   case FormatStyle::RAS_Middle:
6506     return FormatStyle::PAS_Middle;
6507   }
6508   assert(0); //"Unhandled value of ReferenceAlignment"
6509   return Style.PointerAlignment;
6510 }
6511 
6512 FormatStyle::PointerAlignmentStyle
getTokenPointerOrReferenceAlignment(const FormatToken & PointerOrReference) const6513 TokenAnnotator::getTokenPointerOrReferenceAlignment(
6514     const FormatToken &PointerOrReference) const {
6515   if (PointerOrReference.isOneOf(tok::amp, tok::ampamp))
6516     return getTokenReferenceAlignment(PointerOrReference);
6517   assert(PointerOrReference.is(tok::star));
6518   return Style.PointerAlignment;
6519 }
6520 
6521 } // namespace format
6522 } // namespace clang
6523