18#include "llvm/ADT/SmallPtrSet.h"
19#include "llvm/Support/Debug.h"
21#define DEBUG_TYPE "format-token-annotator"
27 const FormatStyle &Style) {
28 switch (Style.BreakAfterAttributes) {
29 case FormatStyle::ABS_Always:
31 case FormatStyle::ABS_Leave:
32 return Tok.NewlinesBefore > 0;
42static bool startsWithInitStatement(
const AnnotatedLine &
Line) {
43 return Line.startsWith(tok::kw_for) ||
Line.startsWith(tok::kw_if) ||
44 Line.startsWith(tok::kw_switch);
59 return Tok.Tok.getIdentifierInfo();
65static bool isLambdaParameterList(
const FormatToken *Left) {
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;
74 return Left->Previous &&
Left->Previous->is(tok::r_square) &&
75 Left->Previous->MatchingParen &&
76 Left->Previous->MatchingParen->is(TT_LambdaLSquare);
82 return Tok.isOneOf(tok::kw_if, tok::kw_for, tok::kw_while, tok::kw_switch,
83 tok::kw_constexpr, tok::kw_catch);
88 if (!IsCpp || !
Tok.startsSequence(tok::l_square, tok::l_square))
91 if (
Tok.Previous &&
Tok.Previous->is(tok::at))
98 if (AttrTok->startsSequence(tok::kw_using, tok::identifier, tok::colon))
100 if (AttrTok->isNot(tok::identifier))
102 while (AttrTok && !AttrTok->startsSequence(tok::r_square, tok::r_square)) {
106 if (AttrTok->is(tok::colon) ||
107 AttrTok->startsSequence(tok::identifier, tok::identifier) ||
108 AttrTok->startsSequence(tok::r_paren, tok::identifier)) {
111 if (AttrTok->is(tok::ellipsis))
113 AttrTok = AttrTok->Next;
115 return AttrTok && AttrTok->startsSequence(tok::r_square, tok::r_square);
123class AnnotatingParser {
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),
130 Keywords(Keywords), Scopes(Scopes), TemplateDeclarationDepth(0) {
131 Contexts.push_back(Context(tok::unknown, 1,
false));
132 resetTokenMetadata();
137 switch (Token.getType()) {
139 case TT_StructLBrace:
142 case TT_CompoundRequirementLBrace:
153 auto *
Left = CurrentToken->Previous;
157 if (NonTemplateLess.count(Left) > 0)
160 const auto *BeforeLess =
Left->Previous;
163 if (BeforeLess->Tok.isLiteral())
165 if (BeforeLess->is(tok::r_brace))
167 if (BeforeLess->is(tok::r_paren) && Contexts.size() > 1 &&
168 !(BeforeLess->MatchingParen &&
169 BeforeLess->MatchingParen->is(TT_OverloadedOperatorLParen))) {
172 if (BeforeLess->is(tok::kw_operator) && CurrentToken->is(tok::l_paren))
176 Left->ParentBracket = Contexts.back().ContextKind;
177 ScopedContextCreator ContextCreator(*
this, tok::less, 12);
178 Contexts.back().IsExpression =
false;
182 if (BeforeLess && BeforeLess->isNot(tok::kw_template))
183 Contexts.back().ContextType = Context::TemplateArgument;
185 if (Style.isJava() && CurrentToken->is(tok::question))
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)) {
199 if (
Next &&
Next->is(tok::greater) &&
200 Left->ParentBracket != tok::less &&
201 CurrentToken->getStartOfNonWhitespace() ==
202 Next->getStartOfNonWhitespace().getLocWithOffset(-1)) {
205 if (InExpr && SeenTernaryOperator &&
206 (!
Next ||
Next->isNoneOf(tok::l_paren, tok::l_brace))) {
212 Left->MatchingParen = CurrentToken;
213 CurrentToken->MatchingParen =
Left;
219 if (Style.isTextProto() ||
220 (Style.Language == FormatStyle::LK_Proto && BeforeLess &&
221 BeforeLess->isOneOf(TT_SelectorName, TT_DictLiteral))) {
222 CurrentToken->setType(TT_DictLiteral);
224 CurrentToken->setType(TT_TemplateCloser);
225 CurrentToken->Tok.setLength(1);
232 if (BeforeLess && BeforeLess->is(TT_TemplateName)) {
236 if (CurrentToken->is(tok::question) && Style.isJava()) {
240 if (CurrentToken->isOneOf(tok::r_paren, tok::r_square, tok::r_brace))
242 const auto &Prev = *CurrentToken->Previous;
249 if (MaybeAngles && InExpr && !Line.startsWith(tok::kw_template) &&
250 Prev.is(TT_BinaryOperator) &&
251 Prev.isOneOf(tok::pipepipe, tok::ampamp)) {
254 if (Prev.isOneOf(tok::question, tok::colon) && !Style.isProto())
255 SeenTernaryOperator =
true;
256 updateParameterCount(Left, CurrentToken);
257 if (Style.Language == FormatStyle::LK_Proto) {
259 if (CurrentToken->is(tok::colon) ||
260 (CurrentToken->isOneOf(tok::l_brace, tok::less) &&
265 }
else if (Style.isTableGen()) {
266 if (CurrentToken->isOneOf(tok::comma, tok::equal)) {
273 if (!parseTableGenValue())
283 bool parseUntouchableParens() {
284 while (CurrentToken) {
285 CurrentToken->Finalized =
true;
286 switch (CurrentToken->Tok.getKind()) {
289 if (!parseUntouchableParens())
304 bool parseParens(
bool IsIf =
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);
315 Contexts.back().ColonIsForRangeExpr =
316 Contexts.size() == 2 && Contexts[0].ColonIsForRangeExpr;
318 if (OpeningParen.Previous &&
319 OpeningParen.Previous->is(TT_UntouchableMacroFunc)) {
320 OpeningParen.Finalized =
true;
321 return parseUntouchableParens();
324 bool StartsObjCSelector =
false;
325 if (!Style.isVerilog()) {
326 if (
FormatToken *MaybeSel = OpeningParen.Previous) {
328 if (MaybeSel->is(tok::objc_selector) && MaybeSel->Previous &&
329 MaybeSel->Previous->is(tok::at)) {
330 StartsObjCSelector =
true;
335 if (OpeningParen.is(TT_OverloadedOperatorLParen)) {
338 while (Prev->isNot(tok::kw_operator)) {
339 Prev = Prev->Previous;
340 assert(Prev &&
"Expect a kw_operator prior to the OperatorLParen!");
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,
358 Contexts.back().IsExpression =
false;
359 }
else if (OpeningParen.Previous &&
360 (OpeningParen.Previous->isOneOf(
361 tok::kw_noexcept, tok::kw_explicit, tok::kw_while,
362 tok::l_paren, tok::comma, TT_CastRParen,
363 TT_BinaryOperator) ||
364 OpeningParen.Previous->isIf())) {
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)))) {
372 Contexts.back().IsExpression =
false;
373 }
else if (Style.isJavaScript() && OpeningParen.Previous &&
374 OpeningParen.Previous->is(TT_JsTypeColon)) {
376 Contexts.back().IsExpression =
false;
377 }
else if (isLambdaParameterList(&OpeningParen)) {
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 (OpeningParen.Previous &&
388 OpeningParen.Previous->TokenText ==
"Q_PROPERTY") {
389 Contexts.back().ContextType = Context::QtProperty;
390 Contexts.back().IsExpression =
false;
391 }
else if (Line.InPPDirective &&
392 (!OpeningParen.Previous ||
393 OpeningParen.Previous->isNot(tok::identifier))) {
394 Contexts.back().IsExpression =
true;
395 }
else if (Contexts[Contexts.size() - 2].CaretFound) {
397 Contexts.back().IsExpression =
false;
398 }
else if (OpeningParen.Previous &&
399 OpeningParen.Previous->is(TT_ForEachMacro)) {
401 Contexts.back().ContextType = Context::ForEachMacro;
402 Contexts.back().IsExpression =
false;
403 }
else if (OpeningParen.Previous && OpeningParen.Previous->MatchingParen &&
404 OpeningParen.Previous->MatchingParen->isOneOf(
405 TT_ObjCBlockLParen, TT_FunctionTypeLParen)) {
406 Contexts.back().IsExpression =
false;
407 }
else if (!Line.MustBeDeclaration &&
408 (!Line.InPPDirective || (Line.InMacroBody && !Scopes.empty()))) {
410 OpeningParen.Previous &&
411 OpeningParen.Previous->isOneOf(tok::kw_for, tok::kw_catch);
412 Contexts.back().IsExpression = !IsForOrCatch;
415 if (Style.isTableGen()) {
417 if (Prev->is(TT_TableGenCondOperator)) {
418 Contexts.back().IsTableGenCondOpe =
true;
419 Contexts.back().IsExpression =
true;
420 }
else if (Contexts.size() > 1 &&
421 Contexts[Contexts.size() - 2].IsTableGenBangOpe) {
426 Contexts.back().IsTableGenBangOpe =
true;
427 Contexts.back().IsExpression =
true;
430 if (!parseTableGenDAGArg())
432 return parseTableGenDAGArgAndList(&OpeningParen);
439 if (PrevNonComment && OpeningParen.is(TT_Unknown)) {
440 if (PrevNonComment->isAttribute()) {
441 OpeningParen.setType(TT_AttributeLParen);
442 }
else if (PrevNonComment->isOneOf(TT_TypenameMacro, tok::kw_decltype,
445#include
"clang/Basic/TransformTypeTraits.def"
447 OpeningParen.setType(TT_TypeDeclarationParen);
449 if (PrevNonComment->isOneOf(tok::kw_decltype, tok::kw_typeof))
450 Contexts.back().IsExpression =
true;
454 if (StartsObjCSelector)
455 OpeningParen.setType(TT_ObjCSelector);
457 const bool IsStaticAssert =
458 PrevNonComment && PrevNonComment->is(tok::kw_static_assert);
460 Contexts.back().InStaticAssertFirstArgument =
true;
470 bool MightBeFunctionType = !Contexts[Contexts.size() - 2].IsExpression;
471 bool ProbablyFunctionType =
472 CurrentToken->isPointerOrReference() || CurrentToken->is(tok::caret);
473 bool HasMultipleLines =
false;
474 bool HasMultipleParametersOnALine =
false;
475 bool MightBeObjCForRangeLoop =
476 OpeningParen.Previous && OpeningParen.Previous->is(tok::kw_for);
478 while (CurrentToken) {
479 const auto &Prev = *CurrentToken->Previous;
480 const auto *PrevPrev = Prev.Previous;
481 if (Prev.is(TT_PointerOrReference) &&
482 PrevPrev->isOneOf(tok::l_paren, tok::coloncolon)) {
483 ProbablyFunctionType =
true;
485 if (CurrentToken->is(tok::comma))
486 MightBeFunctionType =
false;
487 if (Prev.is(TT_BinaryOperator))
488 Contexts.back().IsExpression =
true;
489 if (CurrentToken->is(tok::r_paren)) {
490 if (Prev.is(TT_PointerOrReference) &&
491 (PrevPrev == &OpeningParen || PrevPrev->is(tok::coloncolon))) {
492 MightBeFunctionType =
true;
494 if (OpeningParen.isNot(TT_CppCastLParen) && MightBeFunctionType &&
495 ProbablyFunctionType && CurrentToken->Next &&
496 (CurrentToken->Next->is(tok::l_paren) ||
497 (CurrentToken->Next->is(tok::l_square) &&
498 (Line.MustBeDeclaration ||
499 (PrevNonComment && PrevNonComment->isTypeName(LangOpts)))))) {
500 OpeningParen.setType(OpeningParen.Next->is(tok::caret)
502 : TT_FunctionTypeLParen);
504 OpeningParen.MatchingParen = CurrentToken;
505 CurrentToken->MatchingParen = &OpeningParen;
507 if (CurrentToken->Next && CurrentToken->Next->is(tok::l_brace) &&
508 OpeningParen.Previous && OpeningParen.Previous->is(tok::l_paren)) {
514 if (
Tok->is(TT_BinaryOperator) &&
Tok->isPointerOrReference())
515 Tok->setType(TT_PointerOrReference);
519 if (StartsObjCSelector) {
520 CurrentToken->setType(TT_ObjCSelector);
521 if (Contexts.back().FirstObjCSelectorName) {
522 Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
523 Contexts.back().LongestObjCSelectorName;
527 if (OpeningParen.is(TT_AttributeLParen))
528 CurrentToken->setType(TT_AttributeRParen);
529 if (OpeningParen.is(TT_TypeDeclarationParen))
530 CurrentToken->setType(TT_TypeDeclarationParen);
531 if (OpeningParen.Previous &&
532 OpeningParen.Previous->is(TT_JavaAnnotation)) {
533 CurrentToken->setType(TT_JavaAnnotation);
535 if (OpeningParen.Previous &&
536 OpeningParen.Previous->is(TT_LeadingJavaAnnotation)) {
537 CurrentToken->setType(TT_LeadingJavaAnnotation);
540 if (!HasMultipleLines)
542 else if (HasMultipleParametersOnALine)
550 if (CurrentToken->isOneOf(tok::r_square, tok::r_brace))
553 if (CurrentToken->is(tok::l_brace) && OpeningParen.is(TT_ObjCBlockLParen))
554 OpeningParen.setType(TT_Unknown);
555 if (CurrentToken->is(tok::comma) && CurrentToken->Next &&
556 !CurrentToken->Next->HasUnescapedNewline &&
557 !CurrentToken->Next->isTrailingComment()) {
558 HasMultipleParametersOnALine =
true;
560 bool ProbablyFunctionTypeLParen =
561 (CurrentToken->is(tok::l_paren) && CurrentToken->Next &&
562 CurrentToken->Next->isOneOf(tok::star, tok::amp, tok::caret));
563 if ((Prev.isOneOf(tok::kw_const, tok::kw_auto) ||
564 Prev.isTypeName(LangOpts)) &&
565 !(CurrentToken->is(tok::l_brace) ||
566 (CurrentToken->is(tok::l_paren) && !ProbablyFunctionTypeLParen))) {
567 Contexts.back().IsExpression =
false;
569 if (CurrentToken->isOneOf(tok::semi, tok::colon)) {
570 MightBeObjCForRangeLoop =
false;
571 if (PossibleObjCForInToken) {
572 PossibleObjCForInToken->setType(TT_Unknown);
573 PossibleObjCForInToken =
nullptr;
576 if (IsIf && CurrentToken->is(tok::semi)) {
577 for (
auto *
Tok = OpeningParen.Next;
578 Tok != CurrentToken &&
579 Tok->isNoneOf(tok::equal, tok::l_paren, tok::l_brace);
581 if (
Tok->isPointerOrReference())
582 Tok->setFinalizedType(TT_PointerOrReference);
585 if (MightBeObjCForRangeLoop && CurrentToken->is(Keywords.kw_in)) {
586 PossibleObjCForInToken = CurrentToken;
587 PossibleObjCForInToken->setType(TT_ObjCForIn);
591 if (CurrentToken->is(tok::comma)) {
593 Contexts.back().InStaticAssertFirstArgument =
false;
595 Contexts.back().CanBeExpression =
true;
598 if (Style.isTableGen()) {
599 if (CurrentToken->is(tok::comma)) {
600 if (Contexts.back().IsTableGenCondOpe)
601 CurrentToken->setType(TT_TableGenCondOperatorComma);
603 }
else if (CurrentToken->is(tok::colon)) {
604 if (Contexts.back().IsTableGenCondOpe)
605 CurrentToken->setType(TT_TableGenCondOperatorColon);
609 if (!parseTableGenValue())
617 updateParameterCount(&OpeningParen,
Tok);
618 if (CurrentToken && CurrentToken->HasUnescapedNewline)
619 HasMultipleLines =
true;
625 if (!Style.isCSharp())
629 if (
Tok.Previous &&
Tok.Previous->is(tok::identifier))
633 if (
Tok.Previous &&
Tok.Previous->is(tok::r_square)) {
644 if (AttrTok->is(tok::r_square))
648 while (AttrTok && AttrTok->isNot(tok::r_square))
649 AttrTok = AttrTok->Next;
655 AttrTok = AttrTok->Next;
660 if (AttrTok->isAccessSpecifierKeyword() ||
661 AttrTok->isOneOf(tok::comment, tok::kw_class, tok::kw_static,
662 tok::l_square, Keywords.kw_internal)) {
668 AttrTok->Next->startsSequence(tok::identifier, tok::l_paren)) {
684 Left->ParentBracket = Contexts.back().ContextKind;
690 bool CppArrayTemplates =
691 IsCpp && Parent && Parent->is(TT_TemplateCloser) &&
692 (Contexts.back().CanBeExpression || Contexts.back().IsExpression ||
693 Contexts.back().ContextType == Context::TemplateArgument);
695 const bool IsInnerSquare = Contexts.back().InCpp11AttributeSpecifier;
696 const bool IsCpp11AttributeSpecifier =
697 isCppAttribute(IsCpp, *Left) || IsInnerSquare;
700 bool IsCSharpAttributeSpecifier =
701 isCSharpAttributeSpecifier(*Left) ||
702 Contexts.back().InCSharpAttributeSpecifier;
704 bool InsideInlineASM = Line.startsWith(tok::kw_asm);
705 bool IsCppStructuredBinding =
Left->isCppStructuredBinding(IsCpp);
706 bool StartsObjCMethodExpr =
707 !IsCppStructuredBinding && !InsideInlineASM && !CppArrayTemplates &&
708 IsCpp && !IsCpp11AttributeSpecifier && !IsCSharpAttributeSpecifier &&
709 Contexts.back().CanBeExpression &&
Left->isNot(TT_LambdaLSquare) &&
710 CurrentToken->isNoneOf(tok::l_brace, tok::r_square) &&
714 (!Parent || !Parent->is(tok::comma) ||
715 Contexts.back().ContextKind != tok::l_brace) &&
717 Parent->isOneOf(tok::colon, tok::l_square, tok::l_paren,
718 tok::kw_return, tok::kw_throw) ||
719 Parent->isUnaryOperator() ||
721 Parent->isOneOf(TT_ObjCForIn, TT_CastRParen) ||
724 bool ColonFound =
false;
726 unsigned BindingIncrease = 1;
727 if (IsCppStructuredBinding) {
728 Left->setType(TT_StructuredBindingLSquare);
729 }
else if (
Left->is(TT_Unknown)) {
730 if (StartsObjCMethodExpr) {
731 Left->setType(TT_ObjCMethodExpr);
732 }
else if (InsideInlineASM) {
733 Left->setType(TT_InlineASMSymbolicNameLSquare);
734 }
else if (IsCpp11AttributeSpecifier) {
735 if (!IsInnerSquare) {
736 Left->setType(TT_AttributeLSquare);
738 Left->Previous->EndsCppAttributeGroup =
false;
740 }
else if (Style.isJavaScript() && Parent &&
741 Contexts.back().ContextKind == tok::l_brace &&
742 Parent->isOneOf(tok::l_brace, tok::comma)) {
743 Left->setType(TT_JsComputedPropertyName);
744 }
else if (IsCpp && Contexts.back().ContextKind == tok::l_brace &&
745 Parent && Parent->isOneOf(tok::l_brace, tok::comma)) {
746 Left->setType(TT_DesignatedInitializerLSquare);
747 }
else if (IsCSharpAttributeSpecifier) {
748 Left->setType(TT_AttributeLSquare);
749 }
else if (CurrentToken->is(tok::r_square) && Parent &&
750 Parent->is(TT_TemplateCloser)) {
751 Left->setType(TT_ArraySubscriptLSquare);
752 }
else if (Style.isProto()) {
779 Left->setType(TT_ArrayInitializerLSquare);
780 if (!
Left->endsSequence(tok::l_square, tok::numeric_constant,
782 !
Left->endsSequence(tok::l_square, tok::numeric_constant,
784 !
Left->endsSequence(tok::l_square, tok::colon, TT_SelectorName)) {
785 Left->setType(TT_ProtoExtensionLSquare);
786 BindingIncrease = 10;
788 }
else if (!CppArrayTemplates && Parent &&
789 Parent->isOneOf(TT_BinaryOperator, TT_TemplateCloser, tok::at,
790 tok::comma, tok::l_paren, tok::l_square,
791 tok::question, tok::colon, tok::kw_return,
794 Left->setType(TT_ArrayInitializerLSquare);
796 BindingIncrease = 10;
797 Left->setType(TT_ArraySubscriptLSquare);
801 ScopedContextCreator ContextCreator(*
this, tok::l_square, BindingIncrease);
802 Contexts.back().IsExpression =
true;
803 if (Style.isJavaScript() && Parent && Parent->is(TT_JsTypeColon))
804 Contexts.back().IsExpression =
false;
806 Contexts.back().ColonIsObjCMethodExpr = StartsObjCMethodExpr;
807 Contexts.back().InCpp11AttributeSpecifier = IsCpp11AttributeSpecifier;
808 Contexts.back().InCSharpAttributeSpecifier = IsCSharpAttributeSpecifier;
810 while (CurrentToken) {
811 if (CurrentToken->is(tok::r_square)) {
812 if (IsCpp11AttributeSpecifier && !IsInnerSquare) {
813 CurrentToken->setType(TT_AttributeRSquare);
814 CurrentToken->EndsCppAttributeGroup =
true;
816 if (IsCSharpAttributeSpecifier) {
817 CurrentToken->setType(TT_AttributeRSquare);
818 }
else if (((CurrentToken->Next &&
819 CurrentToken->Next->is(tok::l_paren)) ||
820 (CurrentToken->Previous &&
821 CurrentToken->Previous->Previous == Left)) &&
822 Left->is(TT_ObjCMethodExpr)) {
827 StartsObjCMethodExpr =
false;
828 Left->setType(TT_Unknown);
830 if (StartsObjCMethodExpr && CurrentToken->Previous != Left) {
831 CurrentToken->setType(TT_ObjCMethodExpr);
834 if (!ColonFound && CurrentToken->Previous &&
835 CurrentToken->Previous->is(TT_Unknown) &&
836 canBeObjCSelectorComponent(*CurrentToken->Previous)) {
837 CurrentToken->Previous->setType(TT_SelectorName);
842 if (Parent && Parent->is(TT_PointerOrReference))
843 Parent->overwriteFixedType(TT_BinaryOperator);
845 Left->MatchingParen = CurrentToken;
846 CurrentToken->MatchingParen =
Left;
851 if (!Contexts.back().FirstObjCSelectorName) {
854 Previous->ObjCSelectorNameParts = 1;
855 Contexts.back().FirstObjCSelectorName =
Previous;
858 Left->ParameterCount =
859 Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
861 if (Contexts.back().FirstObjCSelectorName) {
862 Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
863 Contexts.back().LongestObjCSelectorName;
864 if (
Left->BlockParameterCount > 1)
865 Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = 0;
867 if (Style.isTableGen() &&
Left->is(TT_TableGenListOpener))
868 CurrentToken->setType(TT_TableGenListCloser);
872 if (CurrentToken->isOneOf(tok::r_paren, tok::r_brace))
874 if (CurrentToken->is(tok::colon)) {
875 if (IsCpp11AttributeSpecifier &&
876 CurrentToken->endsSequence(tok::colon, tok::identifier,
880 CurrentToken->setType(TT_AttributeColon);
881 }
else if (!Style.isVerilog() && !Line.InPragmaDirective &&
882 Left->isOneOf(TT_ArraySubscriptLSquare,
883 TT_DesignatedInitializerLSquare)) {
884 Left->setType(TT_ObjCMethodExpr);
885 StartsObjCMethodExpr =
true;
886 Contexts.back().ColonIsObjCMethodExpr =
true;
887 if (Parent && Parent->is(tok::r_paren)) {
889 Parent->setType(TT_CastRParen);
894 if (CurrentToken->is(tok::comma) &&
Left->is(TT_ObjCMethodExpr) &&
896 Left->setType(TT_ArrayInitializerLSquare);
899 if (Style.isTableGen()) {
900 if (CurrentToken->isOneOf(tok::comma, tok::minus, tok::ellipsis)) {
906 if (!parseTableGenValue())
909 updateParameterCount(Left,
Tok);
914 updateParameterCount(Left,
Tok);
919 void skipToNextNonComment() {
921 while (CurrentToken && CurrentToken->is(tok::comment))
930 bool parseTableGenValue(
bool ParseNameMode =
false) {
933 while (CurrentToken->is(tok::comment))
935 if (!parseTableGenSimpleValue())
940 if (CurrentToken->is(tok::hash)) {
941 if (CurrentToken->Next &&
942 CurrentToken->Next->isOneOf(tok::colon, tok::semi, tok::l_brace)) {
945 CurrentToken->setType(TT_TableGenTrailingPasteOperator);
950 skipToNextNonComment();
951 HashTok->setType(TT_Unknown);
952 if (!parseTableGenValue(ParseNameMode))
959 if (ParseNameMode && CurrentToken->is(tok::l_brace))
962 if (CurrentToken->isOneOf(tok::l_brace, tok::l_square, tok::period)) {
963 CurrentToken->setType(TT_TableGenValueSuffix);
965 skipToNextNonComment();
966 if (Suffix->is(tok::l_square))
967 return parseSquare();
968 if (Suffix->is(tok::l_brace)) {
969 Scopes.push_back(getScopeType(*Suffix));
979 bool tryToParseTableGenTokVar() {
982 if (CurrentToken->is(tok::identifier) &&
983 CurrentToken->TokenText.front() ==
'$') {
984 skipToNextNonComment();
992 bool parseTableGenDAGArg(
bool AlignColon =
false) {
993 if (tryToParseTableGenTokVar())
995 if (parseTableGenValue()) {
996 if (CurrentToken && CurrentToken->is(tok::colon)) {
998 CurrentToken->setType(TT_TableGenDAGArgListColonToAlign);
1000 CurrentToken->setType(TT_TableGenDAGArgListColon);
1001 skipToNextNonComment();
1002 return tryToParseTableGenTokVar();
1013 auto &Opes = Style.TableGenBreakingDAGArgOperators;
1018 if (
Tok.isNot(tok::identifier) ||
1019 Tok.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator)) {
1023 if (!
Tok.Next ||
Tok.Next->is(tok::colon))
1025 return llvm::is_contained(Opes,
Tok.TokenText.str());
1030 bool parseTableGenDAGArgAndList(
FormatToken *Opener) {
1032 if (!parseTableGenDAGArg())
1034 bool BreakInside =
false;
1035 if (Style.TableGenBreakInsideDAGArg != FormatStyle::DAS_DontBreak) {
1038 if (isTableGenDAGArgBreakingOperator(*FirstTok)) {
1041 Opener->setType(TT_TableGenDAGArgOpenerToBreak);
1042 if (FirstTok->isOneOf(TT_TableGenBangOperator,
1043 TT_TableGenCondOperator)) {
1046 CurrentToken->Previous->setType(TT_TableGenDAGArgOperatorToBreak);
1047 }
else if (FirstTok->is(tok::identifier)) {
1048 if (Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakAll)
1049 FirstTok->setType(TT_TableGenDAGArgOperatorToBreak);
1051 FirstTok->setType(TT_TableGenDAGArgOperatorID);
1056 return parseTableGenDAGArgList(Opener, BreakInside);
1061 bool parseTableGenDAGArgList(
FormatToken *Opener,
bool BreakInside) {
1062 ScopedContextCreator ContextCreator(*
this, tok::l_paren, 0);
1063 Contexts.back().IsTableGenDAGArgList =
true;
1064 bool FirstDAGArgListElm =
true;
1065 while (CurrentToken) {
1066 if (!FirstDAGArgListElm && CurrentToken->is(tok::comma)) {
1067 CurrentToken->setType(BreakInside ? TT_TableGenDAGArgListCommaToBreak
1068 : TT_TableGenDAGArgListComma);
1069 skipToNextNonComment();
1071 if (CurrentToken && CurrentToken->is(tok::r_paren)) {
1072 CurrentToken->setType(TT_TableGenDAGArgCloser);
1073 Opener->MatchingParen = CurrentToken;
1074 CurrentToken->MatchingParen = Opener;
1075 skipToNextNonComment();
1078 if (!parseTableGenDAGArg(
1080 Style.AlignConsecutiveTableGenBreakingDAGArgColons.Enabled)) {
1083 FirstDAGArgListElm =
false;
1088 bool parseTableGenSimpleValue() {
1089 assert(Style.isTableGen());
1093 skipToNextNonComment();
1095 if (
Tok->isOneOf(tok::numeric_constant, tok::string_literal,
1096 TT_TableGenMultiLineString, tok::kw_true, tok::kw_false,
1097 tok::question, tok::kw_int)) {
1101 if (
Tok->is(tok::l_brace)) {
1102 Scopes.push_back(getScopeType(*
Tok));
1103 return parseBrace();
1106 if (
Tok->is(tok::l_square)) {
1107 Tok->setType(TT_TableGenListOpener);
1110 if (
Tok->is(tok::less)) {
1111 CurrentToken->setType(TT_TemplateOpener);
1112 return parseAngle();
1118 if (
Tok->is(tok::l_paren)) {
1119 Tok->setType(TT_TableGenDAGArgOpener);
1121 if (Contexts.back().IsTableGenDAGArgList)
1122 Tok->SpacesRequiredBefore = 1;
1123 return parseTableGenDAGArgAndList(
Tok);
1126 if (
Tok->is(TT_TableGenBangOperator)) {
1127 if (CurrentToken && CurrentToken->is(tok::less)) {
1128 CurrentToken->setType(TT_TemplateOpener);
1129 skipToNextNonComment();
1133 if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1137 Contexts.back().IsTableGenBangOpe =
true;
1138 bool Result = parseParens();
1139 Contexts.back().IsTableGenBangOpe =
false;
1143 if (
Tok->is(TT_TableGenCondOperator)) {
1144 if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1147 return parseParens();
1152 if (
Tok->is(tok::identifier)) {
1154 if (CurrentToken && CurrentToken->is(tok::less)) {
1155 CurrentToken->setType(TT_TemplateOpener);
1156 skipToNextNonComment();
1157 return parseAngle();
1165 bool couldBeInStructArrayInitializer()
const {
1166 if (Contexts.size() < 2)
1170 const auto End = std::next(Contexts.rbegin(), 2);
1171 auto Last = Contexts.rbegin();
1174 if (
Last->ContextKind == tok::l_brace)
1176 return Depth == 2 &&
Last->ContextKind != tok::l_brace;
1183 assert(CurrentToken->Previous);
1184 FormatToken &OpeningBrace = *CurrentToken->Previous;
1185 assert(OpeningBrace.is(tok::l_brace));
1186 OpeningBrace.ParentBracket = Contexts.back().ContextKind;
1188 if (Contexts.back().CaretFound)
1189 OpeningBrace.overwriteFixedType(TT_ObjCBlockLBrace);
1190 Contexts.back().CaretFound =
false;
1192 ScopedContextCreator ContextCreator(*
this, tok::l_brace, 1);
1193 Contexts.back().ColonIsDictLiteral =
true;
1195 Contexts.back().IsExpression =
true;
1196 if (Style.isJavaScript() && OpeningBrace.Previous &&
1197 OpeningBrace.Previous->is(TT_JsTypeColon)) {
1198 Contexts.back().IsExpression =
false;
1200 if (Style.isVerilog() &&
1201 (!OpeningBrace.getPreviousNonComment() ||
1202 OpeningBrace.getPreviousNonComment()->isNot(Keywords.kw_apostrophe))) {
1203 Contexts.back().VerilogMayBeConcatenation =
true;
1205 if (Style.isTableGen())
1206 Contexts.back().ColonIsDictLiteral =
false;
1208 unsigned CommaCount = 0;
1209 while (CurrentToken) {
1210 if (CurrentToken->is(tok::r_brace)) {
1211 assert(!Scopes.empty());
1212 assert(Scopes.back() == getScopeType(OpeningBrace));
1214 assert(OpeningBrace.Optional == CurrentToken->Optional);
1215 OpeningBrace.MatchingParen = CurrentToken;
1216 CurrentToken->MatchingParen = &OpeningBrace;
1217 if (Style.AlignArrayOfStructures != FormatStyle::AIAS_None) {
1218 if (OpeningBrace.ParentBracket == tok::l_brace &&
1219 couldBeInStructArrayInitializer() && CommaCount > 0) {
1220 Contexts.back().ContextType = Context::StructArrayInitializer;
1226 if (CurrentToken->isOneOf(tok::r_paren, tok::r_square))
1228 updateParameterCount(&OpeningBrace, CurrentToken);
1229 if (CurrentToken->isOneOf(tok::colon, tok::l_brace, tok::less)) {
1231 if (
Previous->is(TT_JsTypeOptionalQuestion))
1233 if ((CurrentToken->is(tok::colon) && !Style.isTableGen() &&
1234 (!Contexts.back().ColonIsDictLiteral || !IsCpp)) ||
1236 OpeningBrace.setType(TT_DictLiteral);
1237 if (
Previous->Tok.getIdentifierInfo() ||
1238 Previous->is(tok::string_literal)) {
1239 Previous->setType(TT_SelectorName);
1242 if (CurrentToken->is(tok::colon) && OpeningBrace.is(TT_Unknown) &&
1243 !Style.isTableGen()) {
1244 OpeningBrace.setType(TT_DictLiteral);
1245 }
else if (Style.isJavaScript()) {
1246 OpeningBrace.overwriteFixedType(TT_DictLiteral);
1249 if (CurrentToken->is(tok::comma)) {
1250 if (Style.isJavaScript())
1251 OpeningBrace.overwriteFixedType(TT_DictLiteral);
1254 if (!consumeToken())
1264 if (Current->is(tok::l_brace) && Current->is(
BK_Block))
1265 ++
Left->BlockParameterCount;
1266 if (Current->is(tok::comma)) {
1267 ++
Left->ParameterCount;
1269 Left->Role.reset(
new CommaSeparatedList(Style));
1270 Left->Role->CommaFound(Current);
1271 }
else if (
Left->ParameterCount == 0 && Current->isNot(tok::comment)) {
1272 Left->ParameterCount = 1;
1276 bool parseConditional() {
1277 while (CurrentToken) {
1278 if (CurrentToken->is(tok::colon) && CurrentToken->is(TT_Unknown)) {
1279 CurrentToken->setType(TT_ConditionalExpr);
1283 if (!consumeToken())
1289 bool parseTemplateDeclaration() {
1290 if (!CurrentToken || CurrentToken->isNot(tok::less))
1293 CurrentToken->setType(TT_TemplateOpener);
1296 TemplateDeclarationDepth++;
1297 const bool WellFormed = parseAngle();
1298 TemplateDeclarationDepth--;
1302 if (CurrentToken && TemplateDeclarationDepth == 0)
1303 CurrentToken->Previous->ClosesTemplateDeclaration =
true;
1308 bool consumeToken() {
1310 const auto *Prev = CurrentToken->getPreviousNonComment();
1311 if (Prev && Prev->is(TT_AttributeRSquare) &&
1312 CurrentToken->isOneOf(tok::kw_if, tok::kw_switch, tok::kw_case,
1313 tok::kw_default, tok::kw_for, tok::kw_while) &&
1315 CurrentToken->MustBreakBefore =
true;
1322 if (
Tok->is(TT_VerilogTableItem))
1325 if (
Tok->is(TT_TableGenMultiLineString))
1327 auto *Prev =
Tok->getPreviousNonComment();
1328 auto *
Next =
Tok->getNextNonComment();
1329 switch (
bool IsIf =
false;
Tok->Tok.getKind()) {
1332 if (!Prev && Line.MustBeDeclaration)
1333 Tok->setType(TT_ObjCMethodSpecifier);
1340 if (
Tok->isTypeFinalized())
1343 if (Style.isJavaScript()) {
1344 if (Contexts.back().ColonIsForRangeExpr ||
1345 (Contexts.size() == 1 &&
1346 Line.First->isNoneOf(tok::kw_enum, tok::kw_case)) ||
1347 Contexts.back().ContextKind == tok::l_paren ||
1348 Contexts.back().ContextKind == tok::l_square ||
1349 (!Contexts.back().IsExpression &&
1350 Contexts.back().ContextKind == tok::l_brace) ||
1351 (Contexts.size() == 1 &&
1352 Line.MustBeDeclaration)) {
1353 Contexts.back().IsExpression =
false;
1354 Tok->setType(TT_JsTypeColon);
1357 }
else if (Style.isCSharp()) {
1358 if (Contexts.back().InCSharpAttributeSpecifier) {
1359 Tok->setType(TT_AttributeColon);
1362 if (Contexts.back().ContextKind == tok::l_paren) {
1363 Tok->setType(TT_CSharpNamedArgumentColon);
1366 }
else if (Style.isVerilog() &&
Tok->isNot(TT_BinaryOperator)) {
1369 if (Keywords.isVerilogEnd(*Prev) || Keywords.isVerilogBegin(*Prev)) {
1370 Tok->setType(TT_VerilogBlockLabelColon);
1371 }
else if (Contexts.back().ContextKind == tok::l_square) {
1372 Tok->setType(TT_BitFieldColon);
1373 }
else if (Contexts.back().ColonIsDictLiteral) {
1374 Tok->setType(TT_DictLiteral);
1375 }
else if (Contexts.size() == 1) {
1379 Tok->setType(TT_CaseLabelColon);
1380 if (Line.Level > 1 || (!Line.InPPDirective && Line.Level > 0))
1385 if (Line.First->isOneOf(Keywords.kw_module, Keywords.kw_import) ||
1386 Line.First->startsSequence(tok::kw_export, Keywords.kw_module) ||
1387 Line.First->startsSequence(tok::kw_export, Keywords.kw_import)) {
1388 Tok->setType(TT_ModulePartitionColon);
1389 }
else if (Line.First->is(tok::kw_asm)) {
1390 Tok->setType(TT_InlineASMColon);
1391 }
else if (Contexts.back().ColonIsDictLiteral || Style.isProto()) {
1392 Tok->setType(TT_DictLiteral);
1393 if (Style.isTextProto())
1394 Prev->setType(TT_SelectorName);
1395 }
else if (Contexts.back().ColonIsObjCMethodExpr ||
1396 Line.startsWith(TT_ObjCMethodSpecifier)) {
1397 Tok->setType(TT_ObjCMethodExpr);
1398 const auto *PrevPrev = Prev->Previous;
1401 bool UnknownIdentifierInMethodDeclaration =
1402 Line.startsWith(TT_ObjCMethodSpecifier) &&
1403 Prev->is(tok::identifier) && Prev->is(TT_Unknown);
1406 !(PrevPrev->is(TT_CastRParen) ||
1407 (PrevPrev->is(TT_ObjCMethodExpr) && PrevPrev->is(tok::colon))) ||
1408 PrevPrev->is(tok::r_square) ||
1409 Contexts.back().LongestObjCSelectorName == 0 ||
1410 UnknownIdentifierInMethodDeclaration) {
1411 Prev->setType(TT_SelectorName);
1412 if (!Contexts.back().FirstObjCSelectorName)
1413 Contexts.back().FirstObjCSelectorName = Prev;
1414 else if (Prev->ColumnWidth > Contexts.back().LongestObjCSelectorName)
1415 Contexts.back().LongestObjCSelectorName = Prev->ColumnWidth;
1416 Prev->ParameterIndex =
1417 Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
1418 ++Contexts.back().FirstObjCSelectorName->ObjCSelectorNameParts;
1420 }
else if (Contexts.back().ColonIsForRangeExpr) {
1421 Tok->setType(TT_RangeBasedForLoopColon);
1422 for (
auto *Token = Prev;
1423 Token && Token->isNoneOf(tok::semi, tok::l_paren);
1424 Token = Token->Previous) {
1425 if (Token->isPointerOrReference())
1426 Token->setFinalizedType(TT_PointerOrReference);
1428 }
else if (Contexts.back().ContextType == Context::C11GenericSelection) {
1429 Tok->setType(TT_GenericSelectionColon);
1430 if (Prev->isPointerOrReference())
1431 Prev->setFinalizedType(TT_PointerOrReference);
1432 }
else if ((CurrentToken && CurrentToken->is(tok::numeric_constant)) ||
1433 (Prev->is(TT_StartOfName) && !Scopes.empty() &&
1435 Tok->setType(TT_BitFieldColon);
1436 }
else if (Contexts.size() == 1 &&
1437 Line.getFirstNonComment()->isNoneOf(tok::kw_enum, tok::kw_case,
1439 !Line.startsWith(tok::kw_typedef, tok::kw_enum)) {
1440 if (Prev->isOneOf(tok::r_paren, tok::kw_noexcept) ||
1441 Prev->ClosesRequiresClause) {
1442 Tok->setType(TT_CtorInitializerColon);
1443 }
else if (Prev->is(tok::kw_try)) {
1445 FormatToken *PrevPrev = Prev->getPreviousNonComment();
1448 if (PrevPrev && PrevPrev->isOneOf(tok::r_paren, tok::kw_noexcept))
1449 Tok->setType(TT_CtorInitializerColon);
1451 Tok->setType(TT_InheritanceColon);
1452 if (Prev->isAccessSpecifierKeyword())
1455 }
else if (canBeObjCSelectorComponent(*Prev) &&
Next &&
1456 (
Next->isOneOf(tok::r_paren, tok::comma) ||
1457 (canBeObjCSelectorComponent(*
Next) &&
Next->Next &&
1458 Next->Next->is(tok::colon)))) {
1461 Tok->setType(TT_ObjCSelector);
1468 if (Style.isJavaScript() && !Contexts.back().IsExpression)
1469 Tok->setType(TT_JsTypeOperator);
1472 if (Style.isTableGen()) {
1474 if (!parseTableGenValue())
1476 if (CurrentToken && CurrentToken->is(Keywords.kw_then))
1481 CurrentToken->isOneOf(tok::kw_constexpr, tok::identifier)) {
1487 if (CurrentToken && CurrentToken->is(tok::l_paren)) {
1489 if (!parseParens(IsIf))
1494 if (Style.isJavaScript()) {
1496 if ((Prev && Prev->is(tok::period)) || (
Next &&
Next->is(tok::colon)))
1499 if (CurrentToken && CurrentToken->is(Keywords.kw_await))
1502 if (IsCpp && CurrentToken && CurrentToken->is(tok::kw_co_await))
1504 Contexts.back().ColonIsForRangeExpr =
true;
1505 if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1516 if (Prev && Prev->is(tok::r_paren) && Prev->MatchingParen &&
1517 Prev->MatchingParen->is(TT_OverloadedOperatorLParen)) {
1518 Prev->setType(TT_OverloadedOperator);
1519 Prev->MatchingParen->setType(TT_OverloadedOperator);
1520 Tok->setType(TT_OverloadedOperatorLParen);
1523 if (Style.isVerilog()) {
1529 auto IsInstancePort = [&]() {
1538 if (!Prev || !(PrevPrev = Prev->getPreviousNonComment()))
1541 if (Keywords.isVerilogIdentifier(*Prev) &&
1542 Keywords.isVerilogIdentifier(*PrevPrev)) {
1546 if (Prev->is(Keywords.kw_verilogHash) &&
1547 Keywords.isVerilogIdentifier(*PrevPrev)) {
1551 if (Keywords.isVerilogIdentifier(*Prev) && PrevPrev->is(tok::r_paren))
1554 if (Keywords.isVerilogIdentifier(*Prev) && PrevPrev->is(tok::comma)) {
1555 const FormatToken *PrevParen = PrevPrev->getPreviousNonComment();
1556 if (PrevParen && PrevParen->is(tok::r_paren) &&
1557 PrevParen->MatchingParen &&
1558 PrevParen->MatchingParen->is(TT_VerilogInstancePortLParen)) {
1565 if (IsInstancePort())
1566 Tok->setType(TT_VerilogInstancePortLParen);
1571 if (Line.MustBeDeclaration && Contexts.size() == 1 &&
1572 !Contexts.back().IsExpression && !Line.startsWith(TT_ObjCProperty) &&
1573 !Line.startsWith(tok::l_paren) &&
1574 Tok->isNoneOf(TT_TypeDeclarationParen, TT_RequiresExpressionLParen)) {
1576 (!Prev->isAttribute() &&
1577 Prev->isNoneOf(TT_RequiresClause, TT_LeadingJavaAnnotation,
1578 TT_BinaryOperator))) {
1579 Line.MightBeFunctionDecl =
true;
1580 Tok->MightBeFunctionDeclParen =
true;
1585 if (Style.isTableGen())
1586 Tok->setType(TT_TableGenListOpener);
1592 if (
Tok->is(TT_RequiresExpressionLBrace))
1594 }
else if (Style.isTextProto()) {
1595 if (Prev && Prev->isNot(TT_DictLiteral))
1596 Prev->setType(TT_SelectorName);
1598 Scopes.push_back(getScopeType(*
Tok));
1604 Tok->setType(TT_TemplateOpener);
1610 if (Style.isTextProto() ||
1611 (Style.Language == FormatStyle::LK_Proto && Prev &&
1612 Prev->isOneOf(TT_SelectorName, TT_DictLiteral))) {
1613 Tok->setType(TT_DictLiteral);
1614 if (Prev && Prev->isNot(TT_DictLiteral))
1615 Prev->setType(TT_SelectorName);
1617 if (Style.isTableGen())
1618 Tok->setType(TT_TemplateOpener);
1620 Tok->setType(TT_BinaryOperator);
1621 NonTemplateLess.insert(
Tok);
1631 if (!Scopes.empty())
1638 if (!Style.isTextProto() &&
Tok->is(TT_Unknown))
1639 Tok->setType(TT_BinaryOperator);
1640 if (Prev && Prev->is(TT_TemplateCloser))
1641 Tok->SpacesRequiredBefore = 1;
1643 case tok::kw_operator:
1644 if (Style.isProto())
1647 if (IsCpp && CurrentToken) {
1648 const auto *Info = CurrentToken->Tok.getIdentifierInfo();
1650 if (Info && !(CurrentToken->isPlacementOperator() ||
1651 CurrentToken->is(tok::kw_co_await) ||
1652 Info->isCPlusPlusOperatorKeyword())) {
1654 if (CurrentToken->startsSequence(tok::kw_decltype, tok::l_paren,
1655 tok::kw_auto, tok::r_paren)) {
1657 LParen = CurrentToken->Next->Next->Next->Next;
1660 for (LParen = CurrentToken->Next;
1661 LParen && LParen->isNot(tok::l_paren); LParen = LParen->Next) {
1662 if (LParen->isPointerOrReference())
1663 LParen->setFinalizedType(TT_PointerOrReference);
1666 if (LParen && LParen->is(tok::l_paren)) {
1667 if (!Contexts.back().IsExpression) {
1668 Tok->setFinalizedType(TT_FunctionDeclarationName);
1669 LParen->setFinalizedType(TT_FunctionDeclarationLParen);
1675 while (CurrentToken &&
1676 CurrentToken->isNoneOf(tok::l_paren, tok::semi, tok::r_paren)) {
1677 if (CurrentToken->isOneOf(tok::star, tok::amp))
1678 CurrentToken->setType(TT_PointerOrReference);
1679 auto Next = CurrentToken->getNextNonComment();
1682 if (
Next->is(tok::less))
1688 auto Previous = CurrentToken->getPreviousNonComment();
1690 if (CurrentToken->is(tok::comma) &&
Previous->isNot(tok::kw_operator))
1692 if (
Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator, tok::comma,
1694 Previous->isPointerOrReference() ||
1696 Previous->TokenText.starts_with(
"\"\"")) {
1697 Previous->setType(TT_OverloadedOperator);
1698 if (CurrentToken->isOneOf(tok::less, tok::greater))
1702 if (CurrentToken && CurrentToken->is(tok::l_paren))
1703 CurrentToken->setType(TT_OverloadedOperatorLParen);
1704 if (CurrentToken && CurrentToken->Previous->is(TT_BinaryOperator))
1705 CurrentToken->Previous->setType(TT_OverloadedOperator);
1708 if (Style.isJavaScript() &&
Next &&
1709 Next->isOneOf(tok::semi, tok::comma, tok::colon, tok::r_paren,
1710 tok::r_brace, tok::r_square)) {
1715 Tok->setType(TT_JsTypeOptionalQuestion);
1720 if (Line.MustBeDeclaration && !Contexts.back().IsExpression &&
1721 Style.isJavaScript()) {
1724 if (Style.isCSharp()) {
1727 if (
Next && (
Next->isOneOf(tok::r_paren, tok::greater) ||
1728 Next->startsSequence(tok::identifier, tok::semi) ||
1729 Next->startsSequence(tok::identifier, tok::equal))) {
1730 Tok->setType(TT_CSharpNullable);
1739 if (!Contexts.back().IsExpression && Line.MustBeDeclaration &&
1740 (!
Next ||
Next->isNoneOf(tok::identifier, tok::string_literal) ||
1741 !
Next->Next ||
Next->Next->isNoneOf(tok::colon, tok::question))) {
1742 Tok->setType(TT_CSharpNullable);
1748 case tok::kw_template:
1749 parseTemplateDeclaration();
1752 switch (Contexts.back().ContextType) {
1753 case Context::CtorInitializer:
1754 Tok->setType(TT_CtorInitializerComma);
1756 case Context::InheritanceList:
1757 Tok->setType(TT_InheritanceComma);
1759 case Context::VerilogInstancePortList:
1760 Tok->setType(TT_VerilogInstancePortComma);
1763 if (Style.isVerilog() && Contexts.size() == 1 &&
1764 Line.startsWith(Keywords.kw_assign)) {
1765 Tok->setFinalizedType(TT_VerilogAssignComma);
1766 }
else if (Contexts.back().FirstStartOfName &&
1767 (Contexts.size() == 1 || startsWithInitStatement(Line))) {
1768 Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt =
true;
1769 Line.IsMultiVariableDeclStmt =
true;
1773 if (Contexts.back().ContextType == Context::ForEachMacro)
1774 Contexts.back().IsExpression =
true;
1776 case tok::kw_default:
1778 if (Style.isVerilog() && Keywords.isVerilogEndOfLabel(*
Tok) &&
1779 (Line.Level > 1 || (!Line.InPPDirective && Line.Level > 0))) {
1783 case tok::identifier:
1784 if (
Tok->isOneOf(Keywords.kw___has_include,
1785 Keywords.kw___has_include_next)) {
1789 if (
Next &&
Next->is(tok::l_paren) && Prev &&
1790 Prev->isOneOf(tok::kw___cdecl, tok::kw___stdcall,
1791 tok::kw___fastcall, tok::kw___thiscall,
1792 tok::kw___regcall, tok::kw___vectorcall)) {
1793 Tok->setFinalizedType(TT_FunctionDeclarationName);
1794 Next->setFinalizedType(TT_FunctionDeclarationLParen);
1796 }
else if (Style.isCSharp()) {
1797 if (
Tok->is(Keywords.kw_where) &&
Next &&
Next->isNot(tok::l_paren)) {
1798 Tok->setType(TT_CSharpGenericTypeConstraint);
1799 parseCSharpGenericTypeConstraint();
1801 Line.IsContinuation =
true;
1803 }
else if (Style.isTableGen()) {
1804 if (
Tok->is(Keywords.kw_assert)) {
1805 if (!parseTableGenValue())
1807 }
else if (
Tok->isOneOf(Keywords.kw_def, Keywords.kw_defm) &&
1808 (!
Next ||
Next->isNoneOf(tok::colon, tok::l_brace))) {
1810 if (!parseTableGenValue(
true))
1814 if (Style.AllowBreakBeforeQtProperty &&
1815 Contexts.back().ContextType == Context::QtProperty &&
1816 Tok->isQtProperty()) {
1817 Tok->setFinalizedType(TT_QtProperty);
1821 if (
Tok->isNot(TT_LambdaArrow) && Prev && Prev->is(tok::kw_noexcept))
1822 Tok->setType(TT_TrailingReturnArrow);
1826 if (Style.isTableGen() && !parseTableGenValue())
1835 void parseCSharpGenericTypeConstraint() {
1836 int OpenAngleBracketsCount = 0;
1837 while (CurrentToken) {
1838 if (CurrentToken->is(tok::less)) {
1840 CurrentToken->setType(TT_TemplateOpener);
1841 ++OpenAngleBracketsCount;
1843 }
else if (CurrentToken->is(tok::greater)) {
1844 CurrentToken->setType(TT_TemplateCloser);
1845 --OpenAngleBracketsCount;
1847 }
else if (CurrentToken->is(tok::comma) && OpenAngleBracketsCount == 0) {
1850 CurrentToken->setType(TT_CSharpGenericTypeConstraintComma);
1852 }
else if (CurrentToken->is(Keywords.kw_where)) {
1853 CurrentToken->setType(TT_CSharpGenericTypeConstraint);
1855 }
else if (CurrentToken->is(tok::colon)) {
1856 CurrentToken->setType(TT_CSharpGenericTypeConstraintColon);
1864 void parseIncludeDirective() {
1865 if (CurrentToken && CurrentToken->is(tok::less)) {
1867 while (CurrentToken) {
1870 if (CurrentToken->isNot(tok::comment) &&
1871 !CurrentToken->TokenText.starts_with(
"//")) {
1872 CurrentToken->setType(TT_ImplicitStringLiteral);
1879 void parseWarningOrError() {
1884 while (CurrentToken) {
1885 CurrentToken->setType(TT_ImplicitStringLiteral);
1890 void parsePragma() {
1893 CurrentToken->isOneOf(Keywords.kw_mark, Keywords.kw_option,
1894 Keywords.kw_region)) {
1895 bool IsMarkOrRegion =
1896 CurrentToken->isOneOf(Keywords.kw_mark, Keywords.kw_region);
1899 while (CurrentToken) {
1900 if (IsMarkOrRegion || CurrentToken->Previous->is(TT_BinaryOperator))
1901 CurrentToken->setType(TT_ImplicitStringLiteral);
1907 void parseHasInclude() {
1908 if (!CurrentToken || CurrentToken->isNot(tok::l_paren))
1911 parseIncludeDirective();
1915 LineType parsePreprocessorDirective() {
1916 bool IsFirstToken = CurrentToken->IsFirst;
1922 if (Style.isJavaScript() && IsFirstToken) {
1926 while (CurrentToken) {
1928 CurrentToken->setType(TT_ImplicitStringLiteral);
1934 if (CurrentToken->is(tok::numeric_constant)) {
1935 CurrentToken->SpacesRequiredBefore = 1;
1940 if (!CurrentToken->Tok.getIdentifierInfo())
1944 if (Style.isVerilog() && !Keywords.isVerilogPPDirective(*CurrentToken))
1946 switch (CurrentToken->Tok.getIdentifierInfo()->getPPKeywordID()) {
1947 case tok::pp_include:
1948 case tok::pp_include_next:
1949 case tok::pp_import:
1951 parseIncludeDirective();
1955 case tok::pp_warning:
1956 parseWarningOrError();
1958 case tok::pp_pragma:
1963 Contexts.back().IsExpression =
true;
1966 CurrentToken->SpacesRequiredBefore = 1;
1972 while (CurrentToken) {
1975 if (
Tok->is(tok::l_paren)) {
1977 }
else if (
Tok->isOneOf(Keywords.kw___has_include,
1978 Keywords.kw___has_include_next)) {
1989 NonTemplateLess.clear();
1990 if (!Line.InMacroBody && CurrentToken->is(tok::hash)) {
1994 auto Type = parsePreprocessorDirective();
2002 IdentifierInfo *Info = CurrentToken->Tok.getIdentifierInfo();
2003 if ((Style.isJava() && CurrentToken->is(Keywords.kw_package)) ||
2004 (!Style.isVerilog() && Info &&
2005 Info->getPPKeywordID() == tok::pp_import && CurrentToken->Next &&
2006 CurrentToken->Next->isOneOf(tok::string_literal, tok::identifier,
2009 parseIncludeDirective();
2015 if (CurrentToken->is(tok::less) && Line.Last->is(tok::greater)) {
2016 parseIncludeDirective();
2022 if (Style.Language == FormatStyle::LK_Proto && Line.Level == 0 &&
2023 CurrentToken->isOneOf(Keywords.kw_option, Keywords.kw_package)) {
2025 if (CurrentToken && CurrentToken->is(tok::identifier)) {
2026 while (CurrentToken)
2032 bool KeywordVirtualFound =
false;
2033 bool ImportStatement =
false;
2036 if (Style.isJavaScript() && CurrentToken->is(Keywords.kw_import))
2037 ImportStatement =
true;
2039 while (CurrentToken) {
2040 if (CurrentToken->is(tok::kw_virtual))
2041 KeywordVirtualFound =
true;
2042 if (Style.isJavaScript()) {
2049 if (Line.First->is(tok::kw_export) &&
2050 CurrentToken->is(Keywords.kw_from) && CurrentToken->Next &&
2051 CurrentToken->Next->isStringLiteral()) {
2052 ImportStatement =
true;
2054 if (isClosureImportStatement(*CurrentToken))
2055 ImportStatement =
true;
2057 if (!consumeToken())
2065 if (KeywordVirtualFound)
2067 if (ImportStatement)
2070 if (Line.startsWith(TT_ObjCMethodSpecifier)) {
2071 if (Contexts.back().FirstObjCSelectorName) {
2072 Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName =
2073 Contexts.back().LongestObjCSelectorName;
2078 for (
const auto &ctx : Contexts)
2079 if (ctx.ContextType == Context::StructArrayInitializer)
2089 return Tok.TokenText ==
"goog" &&
Tok.Next &&
Tok.Next->is(tok::period) &&
2091 (
Tok.Next->Next->TokenText ==
"module" ||
2092 Tok.Next->Next->TokenText ==
"provide" ||
2093 Tok.Next->Next->TokenText ==
"require" ||
2094 Tok.Next->Next->TokenText ==
"requireType" ||
2095 Tok.Next->Next->TokenText ==
"forwardDeclare") &&
2096 Tok.Next->Next->Next &&
Tok.Next->Next->Next->is(tok::l_paren);
2099 void resetTokenMetadata() {
2105 if (!CurrentToken->isTypeFinalized() &&
2106 CurrentToken->isNoneOf(
2107 TT_LambdaLSquare, TT_LambdaLBrace, TT_AttributeMacro, TT_IfMacro,
2108 TT_ForEachMacro, TT_TypenameMacro, TT_FunctionLBrace,
2109 TT_ImplicitStringLiteral, TT_InlineASMBrace, TT_FatArrow,
2110 TT_LambdaArrow, TT_NamespaceMacro, TT_OverloadedOperator,
2111 TT_RegexLiteral, TT_TemplateString, TT_ObjCStringLiteral,
2112 TT_UntouchableMacroFunc, TT_StatementAttributeLikeMacro,
2113 TT_FunctionLikeOrFreestandingMacro, TT_ClassLBrace, TT_EnumLBrace,
2114 TT_RecordLBrace, TT_StructLBrace, TT_UnionLBrace, TT_RequiresClause,
2115 TT_RequiresClauseInARequiresExpression, TT_RequiresExpression,
2116 TT_RequiresExpressionLParen, TT_RequiresExpressionLBrace,
2117 TT_CompoundRequirementLBrace, TT_BracedListLBrace,
2118 TT_FunctionLikeMacro)) {
2119 CurrentToken->setType(TT_Unknown);
2121 CurrentToken->Role.reset();
2122 CurrentToken->MatchingParen =
nullptr;
2123 CurrentToken->FakeLParens.clear();
2124 CurrentToken->FakeRParens = 0;
2131 CurrentToken->NestingLevel = Contexts.size() - 1;
2132 CurrentToken->BindingStrength = Contexts.back().BindingStrength;
2133 modifyContext(*CurrentToken);
2134 determineTokenType(*CurrentToken);
2135 CurrentToken = CurrentToken->Next;
2137 resetTokenMetadata();
2145 : ContextKind(ContextKind), BindingStrength(BindingStrength),
2146 IsExpression(IsExpression) {}
2149 unsigned BindingStrength;
2151 unsigned LongestObjCSelectorName = 0;
2152 bool ColonIsForRangeExpr =
false;
2153 bool ColonIsDictLiteral =
false;
2154 bool ColonIsObjCMethodExpr =
false;
2157 bool CanBeExpression =
true;
2158 bool CaretFound =
false;
2159 bool InCpp11AttributeSpecifier =
false;
2160 bool InCSharpAttributeSpecifier =
false;
2161 bool InStaticAssertFirstArgument =
false;
2162 bool VerilogAssignmentFound =
false;
2165 bool VerilogMayBeConcatenation =
false;
2166 bool IsTableGenDAGArgList =
false;
2167 bool IsTableGenBangOpe =
false;
2168 bool IsTableGenCondOpe =
false;
2181 StructArrayInitializer,
2185 C11GenericSelection,
2188 VerilogInstancePortList,
2189 } ContextType = Unknown;
2194 struct ScopedContextCreator {
2195 AnnotatingParser &P;
2197 ScopedContextCreator(AnnotatingParser &P,
tok::TokenKind ContextKind,
2200 P.Contexts.push_back(Context(ContextKind,
2201 P.Contexts.back().BindingStrength + Increase,
2202 P.Contexts.back().IsExpression));
2205 ~ScopedContextCreator() {
2206 if (P.Style.AlignArrayOfStructures != FormatStyle::AIAS_None) {
2207 if (P.Contexts.back().ContextType == Context::StructArrayInitializer) {
2208 P.Contexts.pop_back();
2209 P.Contexts.back().ContextType = Context::StructArrayInitializer;
2213 P.Contexts.pop_back();
2218 auto AssignmentStartsExpression = [&]() {
2222 if (Line.First->isOneOf(tok::kw_using, tok::kw_return))
2224 if (Line.First->is(tok::kw_template)) {
2225 assert(Current.Previous);
2226 if (Current.Previous->is(tok::kw_operator)) {
2234 if (
Tok->isNot(TT_TemplateOpener)) {
2241 if (Contexts.back().ContextKind == tok::less) {
2242 assert(Current.Previous->Previous);
2243 return Current.Previous->Previous->isNoneOf(tok::kw_typename,
2247 Tok =
Tok->MatchingParen;
2250 Tok =
Tok->getNextNonComment();
2254 if (
Tok->isOneOf(tok::kw_class, tok::kw_enum, tok::kw_struct,
2264 if (Style.isJavaScript() &&
2265 (Line.startsWith(Keywords.kw_type, tok::identifier) ||
2266 Line.startsWith(tok::kw_export, Keywords.kw_type,
2267 tok::identifier))) {
2271 return !Current.Previous || Current.Previous->isNot(tok::kw_operator);
2274 if (AssignmentStartsExpression()) {
2275 Contexts.back().IsExpression =
true;
2276 if (!Line.startsWith(TT_UnaryOperator)) {
2279 Previous->Previous->isNoneOf(tok::comma, tok::semi);
2281 if (
Previous->isOneOf(tok::r_square, tok::r_paren, tok::greater)) {
2288 if (
Previous->isOneOf(TT_BinaryOperator, TT_UnaryOperator) &&
2290 Previous->Previous->isNot(tok::equal)) {
2291 Previous->setType(TT_PointerOrReference);
2295 }
else if (Current.is(tok::lessless) &&
2296 (!Current.Previous ||
2297 Current.Previous->isNot(tok::kw_operator))) {
2298 Contexts.back().IsExpression =
true;
2299 }
else if (Current.isOneOf(tok::kw_return, tok::kw_throw)) {
2300 Contexts.back().IsExpression =
true;
2301 }
else if (Current.is(TT_TrailingReturnArrow)) {
2302 Contexts.back().IsExpression =
false;
2303 }
else if (Current.isOneOf(TT_LambdaArrow, Keywords.kw_assert)) {
2304 Contexts.back().IsExpression = Style.isJava();
2305 }
else if (Current.Previous &&
2306 Current.Previous->is(TT_CtorInitializerColon)) {
2307 Contexts.back().IsExpression =
true;
2308 Contexts.back().ContextType = Context::CtorInitializer;
2309 }
else if (Current.Previous && Current.Previous->is(TT_InheritanceColon)) {
2310 Contexts.back().ContextType = Context::InheritanceList;
2311 }
else if (Current.isOneOf(tok::r_paren, tok::greater, tok::comma)) {
2315 Previous->setType(TT_PointerOrReference);
2317 if (Line.MustBeDeclaration &&
2318 Contexts.front().ContextType != Context::CtorInitializer) {
2319 Contexts.back().IsExpression =
false;
2321 }
else if (Current.is(tok::kw_new)) {
2322 Contexts.back().CanBeExpression =
false;
2323 }
else if (Current.is(tok::semi) ||
2324 (Current.is(tok::exclaim) && Current.Previous &&
2325 Current.Previous->isNot(tok::kw_operator))) {
2329 Contexts.back().IsExpression =
true;
2337 if (Current->is(tok::l_paren))
2339 if (Current->is(tok::r_paren))
2343 Current = Current->Next;
2348 static bool isDeductionGuide(
FormatToken &Current) {
2350 if (Current.Previous && Current.Previous->is(tok::r_paren) &&
2351 Current.startsSequence(tok::arrow, tok::identifier, tok::less)) {
2355 while (TemplateCloser) {
2357 if (TemplateCloser->is(tok::l_paren)) {
2359 TemplateCloser = untilMatchingParen(TemplateCloser);
2360 if (!TemplateCloser)
2363 if (TemplateCloser->is(tok::less))
2365 if (TemplateCloser->is(tok::greater))
2369 TemplateCloser = TemplateCloser->Next;
2373 if (TemplateCloser && TemplateCloser->Next &&
2374 TemplateCloser->Next->is(tok::semi) &&
2375 Current.Previous->MatchingParen) {
2379 Current.Previous->MatchingParen->Previous;
2381 return LeadingIdentifier &&
2382 LeadingIdentifier->TokenText == Current.Next->TokenText;
2389 if (Current.isNot(TT_Unknown)) {
2394 if ((Style.isJavaScript() || Style.isCSharp()) &&
2395 Current.is(tok::exclaim)) {
2396 if (Current.Previous) {
2398 Style.isJavaScript()
2399 ? Keywords.isJavaScriptIdentifier(
2400 *Current.Previous,
true)
2401 : Current.Previous->is(tok::identifier);
2403 Current.Previous->isOneOf(
2404 tok::kw_default, tok::kw_namespace, tok::r_paren, tok::r_square,
2405 tok::r_brace, tok::kw_false, tok::kw_true, Keywords.kw_type,
2406 Keywords.kw_get, Keywords.kw_init, Keywords.kw_set) ||
2407 Current.Previous->Tok.isLiteral()) {
2408 Current.setType(TT_NonNullAssertion);
2413 Current.Next->isOneOf(TT_BinaryOperator, Keywords.kw_as)) {
2414 Current.setType(TT_NonNullAssertion);
2422 if ((Style.isJavaScript() || Style.isJava()) &&
2423 Current.is(Keywords.kw_instanceof)) {
2424 Current.setType(TT_BinaryOperator);
2425 }
else if (isStartOfName(Current) &&
2426 (!Line.MightBeFunctionDecl || Current.NestingLevel != 0)) {
2427 Contexts.back().FirstStartOfName = &Current;
2428 Current.setType(TT_StartOfName);
2429 }
else if (Current.is(tok::semi)) {
2433 Contexts.back().FirstStartOfName =
nullptr;
2434 }
else if (Current.isOneOf(tok::kw_auto, tok::kw___auto_type)) {
2436 }
else if (Current.is(tok::arrow) && Style.isJava()) {
2437 Current.setType(TT_LambdaArrow);
2438 }
else if (Current.is(tok::arrow) && Style.isVerilog()) {
2440 Current.setType(TT_BinaryOperator);
2441 }
else if (Current.is(tok::arrow) && AutoFound &&
2442 Line.MightBeFunctionDecl && Current.NestingLevel == 0 &&
2443 Current.Previous->isNoneOf(tok::kw_operator, tok::identifier)) {
2445 Current.setType(TT_TrailingReturnArrow);
2446 }
else if (Current.is(tok::arrow) && Current.Previous &&
2447 Current.Previous->is(tok::r_brace) &&
2451 Current.setType(TT_TrailingReturnArrow);
2452 }
else if (isDeductionGuide(Current)) {
2454 Current.setType(TT_TrailingReturnArrow);
2455 }
else if (Current.isPointerOrReference()) {
2456 Current.setType(determineStarAmpUsage(
2458 (Contexts.back().CanBeExpression && Contexts.back().IsExpression) ||
2459 Contexts.back().InStaticAssertFirstArgument,
2460 Contexts.back().ContextType == Context::TemplateArgument));
2461 }
else if (Current.isOneOf(tok::minus, tok::plus, tok::caret) ||
2462 (Style.isVerilog() && Current.is(tok::pipe))) {
2463 Current.setType(determinePlusMinusCaretUsage(Current));
2464 if (Current.is(TT_UnaryOperator) && Current.is(tok::caret))
2465 Contexts.back().CaretFound =
true;
2466 }
else if (Current.isOneOf(tok::minusminus, tok::plusplus)) {
2467 Current.setType(determineIncrementUsage(Current));
2468 }
else if (Current.isOneOf(tok::exclaim, tok::tilde)) {
2469 Current.setType(TT_UnaryOperator);
2470 }
else if (Current.is(tok::question)) {
2471 if (Style.isJavaScript() && Line.MustBeDeclaration &&
2472 !Contexts.back().IsExpression) {
2475 Current.setType(TT_JsTypeOptionalQuestion);
2476 }
else if (Style.isTableGen()) {
2478 Current.setType(TT_Unknown);
2480 Current.setType(TT_ConditionalExpr);
2482 }
else if (Current.isBinaryOperator() &&
2483 (!Current.Previous || Current.Previous->isNot(tok::l_square)) &&
2484 (Current.isNot(tok::greater) && !Style.isTextProto())) {
2485 if (Style.isVerilog()) {
2486 if (Current.is(tok::lessequal) && Contexts.size() == 1 &&
2487 !Contexts.back().VerilogAssignmentFound) {
2491 Current.setFinalizedType(TT_BinaryOperator);
2494 Contexts.back().VerilogAssignmentFound =
true;
2496 Current.setType(TT_BinaryOperator);
2497 }
else if (Current.is(tok::comment)) {
2498 if (Current.TokenText.starts_with(
"/*")) {
2499 if (Current.TokenText.ends_with(
"*/")) {
2500 Current.setType(TT_BlockComment);
2504 Current.Tok.setKind(tok::unknown);
2507 Current.setType(TT_LineComment);
2509 }
else if (Current.is(tok::string_literal)) {
2510 if (Style.isVerilog() && Contexts.back().VerilogMayBeConcatenation &&
2511 Current.getPreviousNonComment() &&
2512 Current.getPreviousNonComment()->isOneOf(tok::comma, tok::l_brace) &&
2513 Current.getNextNonComment() &&
2514 Current.getNextNonComment()->isOneOf(tok::comma, tok::r_brace)) {
2515 Current.setType(TT_StringInConcatenation);
2517 }
else if (Current.is(tok::l_paren)) {
2518 if (lParenStartsCppCast(Current))
2519 Current.setType(TT_CppCastLParen);
2520 }
else if (Current.is(tok::r_paren)) {
2521 if (rParenEndsCast(Current))
2522 Current.setType(TT_CastRParen);
2523 if (Current.MatchingParen && Current.Next &&
2524 !Current.Next->isBinaryOperator() &&
2525 Current.Next->isNoneOf(
2526 tok::semi, tok::colon, tok::l_brace, tok::l_paren, tok::comma,
2527 tok::period, tok::arrow, tok::coloncolon, tok::kw_noexcept)) {
2528 if (
FormatToken *AfterParen = Current.MatchingParen->Next;
2529 AfterParen && AfterParen->isNot(tok::caret)) {
2531 if (
FormatToken *BeforeParen = Current.MatchingParen->Previous;
2532 BeforeParen && BeforeParen->is(tok::identifier) &&
2533 BeforeParen->isNot(TT_TypenameMacro) &&
2534 BeforeParen->TokenText == BeforeParen->TokenText.upper() &&
2535 (!BeforeParen->Previous ||
2536 BeforeParen->Previous->ClosesTemplateDeclaration ||
2537 BeforeParen->Previous->ClosesRequiresClause)) {
2538 Current.setType(TT_FunctionAnnotationRParen);
2542 }
else if (Current.is(tok::at) && Current.Next && !Style.isJavaScript() &&
2546 switch (Current.Next->Tok.getObjCKeywordID()) {
2547 case tok::objc_interface:
2548 case tok::objc_implementation:
2549 case tok::objc_protocol:
2550 Current.setType(TT_ObjCDecl);
2552 case tok::objc_property:
2553 Current.setType(TT_ObjCProperty);
2558 }
else if (Current.is(tok::period)) {
2559 FormatToken *PreviousNoComment = Current.getPreviousNonComment();
2560 if (PreviousNoComment &&
2561 PreviousNoComment->isOneOf(tok::comma, tok::l_brace)) {
2562 Current.setType(TT_DesignatedInitializerPeriod);
2563 }
else if (Style.isJava() && Current.Previous &&
2564 Current.Previous->isOneOf(TT_JavaAnnotation,
2565 TT_LeadingJavaAnnotation)) {
2566 Current.setType(Current.Previous->getType());
2568 }
else if (canBeObjCSelectorComponent(Current) &&
2571 Current.Previous && Current.Previous->is(TT_CastRParen) &&
2572 Current.Previous->MatchingParen &&
2573 Current.Previous->MatchingParen->Previous &&
2574 Current.Previous->MatchingParen->Previous->is(
2575 TT_ObjCMethodSpecifier)) {
2579 Current.setType(TT_SelectorName);
2580 }
else if (Current.isOneOf(tok::identifier, tok::kw_const, tok::kw_noexcept,
2581 tok::kw_requires) &&
2583 Current.Previous->isNoneOf(tok::equal, tok::at,
2584 TT_CtorInitializerComma,
2585 TT_CtorInitializerColon) &&
2586 Line.MightBeFunctionDecl && Contexts.size() == 1) {
2589 Current.setType(TT_TrailingAnnotation);
2590 }
else if ((Style.isJava() || Style.isJavaScript()) && Current.Previous) {
2591 if (Current.Previous->is(tok::at) &&
2592 Current.isNot(Keywords.kw_interface)) {
2596 Current.setType(TT_LeadingJavaAnnotation);
2598 Current.setType(TT_JavaAnnotation);
2599 }
else if (Current.Previous->is(tok::period) &&
2600 Current.Previous->isOneOf(TT_JavaAnnotation,
2601 TT_LeadingJavaAnnotation)) {
2602 Current.setType(Current.Previous->getType());
2614 if (Style.isVerilog())
2617 if (!
Tok.Previous ||
Tok.isNot(tok::identifier) ||
Tok.is(TT_ClassHeadName))
2620 if (
Tok.endsSequence(Keywords.kw_final, TT_ClassHeadName))
2623 if ((Style.isJavaScript() || Style.isJava()) &&
Tok.is(Keywords.kw_extends))
2626 if (
const auto *NextNonComment =
Tok.getNextNonComment();
2627 (!NextNonComment && !Line.InMacroBody) ||
2629 (NextNonComment->isPointerOrReference() ||
2630 NextNonComment->isOneOf(TT_ClassHeadName, tok::string_literal) ||
2631 (Line.InPragmaDirective && NextNonComment->is(tok::identifier))))) {
2635 if (
Tok.Previous->isOneOf(TT_LeadingJavaAnnotation, Keywords.kw_instanceof,
2639 if (Style.isJavaScript() &&
Tok.Previous->is(Keywords.kw_in))
2646 if (!Style.isJavaScript())
2647 while (PreviousNotConst && PreviousNotConst->is(tok::kw_const))
2648 PreviousNotConst = PreviousNotConst->getPreviousNonComment();
2650 if (!PreviousNotConst)
2653 if (PreviousNotConst->ClosesRequiresClause)
2656 if (Style.isTableGen()) {
2658 if (Keywords.isTableGenDefinition(*PreviousNotConst))
2661 if (Contexts.back().ContextKind != tok::l_brace)
2665 bool IsPPKeyword = PreviousNotConst->is(tok::identifier) &&
2666 PreviousNotConst->Previous &&
2667 PreviousNotConst->Previous->is(tok::hash);
2669 if (PreviousNotConst->is(TT_TemplateCloser)) {
2670 return PreviousNotConst && PreviousNotConst->MatchingParen &&
2671 PreviousNotConst->MatchingParen->Previous &&
2672 PreviousNotConst->MatchingParen->Previous->isNoneOf(
2673 tok::period, tok::kw_template);
2676 if ((PreviousNotConst->is(tok::r_paren) &&
2677 PreviousNotConst->is(TT_TypeDeclarationParen)) ||
2678 PreviousNotConst->is(TT_AttributeRParen)) {
2687 if (PreviousNotConst->isOneOf(tok::identifier, tok::kw_auto) &&
2688 PreviousNotConst->isNot(TT_StatementAttributeLikeMacro)) {
2693 if (PreviousNotConst->is(TT_PointerOrReference) ||
2694 PreviousNotConst->endsSequence(tok::coloncolon,
2695 TT_PointerOrReference)) {
2700 if (PreviousNotConst->isTypeName(LangOpts))
2704 if (Style.isJava() && PreviousNotConst->is(tok::r_square))
2708 return Style.isJavaScript() && PreviousNotConst->is(tok::kw_const);
2718 if (LeftOfParens && LeftOfParens->is(TT_TemplateCloser) &&
2719 LeftOfParens->MatchingParen) {
2720 auto *Prev = LeftOfParens->MatchingParen->getPreviousNonComment();
2722 Prev->isOneOf(tok::kw_const_cast, tok::kw_dynamic_cast,
2723 tok::kw_reinterpret_cast, tok::kw_static_cast)) {
2734 assert(
Tok.is(tok::r_paren));
2736 if (!
Tok.MatchingParen || !
Tok.Previous)
2740 if (!IsCpp && !Style.isCSharp() && !Style.isJava())
2743 const auto *LParen =
Tok.MatchingParen;
2744 const auto *BeforeRParen =
Tok.Previous;
2745 const auto *AfterRParen =
Tok.Next;
2748 if (BeforeRParen == LParen || !AfterRParen)
2751 if (LParen->is(TT_OverloadedOperatorLParen))
2754 auto *LeftOfParens = LParen->getPreviousNonComment();
2758 if (LeftOfParens->is(tok::r_paren) &&
2759 LeftOfParens->isNot(TT_CastRParen)) {
2760 if (!LeftOfParens->MatchingParen ||
2761 !LeftOfParens->MatchingParen->Previous) {
2764 LeftOfParens = LeftOfParens->MatchingParen->Previous;
2767 if (LeftOfParens->is(tok::r_square)) {
2770 if (
Tok->isNot(tok::r_square))
2773 Tok =
Tok->getPreviousNonComment();
2774 if (!
Tok ||
Tok->isNot(tok::l_square))
2777 Tok =
Tok->getPreviousNonComment();
2778 if (!
Tok ||
Tok->isNot(tok::kw_delete))
2782 if (
FormatToken *MaybeDelete = MayBeArrayDelete(LeftOfParens))
2783 LeftOfParens = MaybeDelete;
2789 if (LeftOfParens->Tok.getIdentifierInfo() && LeftOfParens->Previous &&
2790 LeftOfParens->Previous->is(tok::kw_operator)) {
2796 if (LeftOfParens->Tok.getIdentifierInfo() &&
2797 LeftOfParens->isNoneOf(Keywords.kw_in, tok::kw_return, tok::kw_case,
2798 tok::kw_delete, tok::kw_throw)) {
2804 if (LeftOfParens->isOneOf(tok::at, tok::r_square, TT_OverloadedOperator,
2805 TT_TemplateCloser, tok::ellipsis)) {
2810 if (AfterRParen->is(tok::question) ||
2811 (AfterRParen->is(tok::ampamp) && !BeforeRParen->isTypeName(LangOpts))) {
2816 if (AfterRParen->is(Keywords.kw_in) && Style.isCSharp())
2821 if (AfterRParen->isOneOf(tok::kw_noexcept, tok::kw_volatile, tok::kw_const,
2822 tok::kw_requires, tok::kw_throw, tok::arrow,
2823 Keywords.kw_override, Keywords.kw_final) ||
2824 isCppAttribute(IsCpp, *AfterRParen)) {
2830 if (Style.isJava() && AfterRParen->is(tok::l_paren))
2834 if (AfterRParen->isOneOf(tok::kw_sizeof, tok::kw_alignof) ||
2835 (AfterRParen->Tok.isLiteral() &&
2836 AfterRParen->isNot(tok::string_literal))) {
2841 if (
Tok.isNot(TT_TemplateCloser))
2843 const auto *
Less =
Tok.MatchingParen;
2846 const auto *BeforeLess =
Less->getPreviousNonComment();
2847 return BeforeLess && BeforeLess->isNot(TT_VariableTemplate);
2851 auto IsQualifiedPointerOrReference = [](
const FormatToken *T,
2852 const LangOptions &LangOpts) {
2854 assert(!T->isTypeName(LangOpts) &&
"Should have already been checked");
2858 if (T->is(TT_AttributeRParen)) {
2860 assert(T->is(tok::r_paren));
2861 assert(T->MatchingParen);
2862 assert(T->MatchingParen->is(tok::l_paren));
2863 assert(T->MatchingParen->is(TT_AttributeLParen));
2864 if (
const auto *
Tok = T->MatchingParen->Previous;
2865 Tok &&
Tok->isAttribute()) {
2869 }
else if (T->is(TT_AttributeRSquare)) {
2871 if (T->MatchingParen && T->MatchingParen->Previous) {
2872 T = T->MatchingParen->Previous;
2875 }
else if (T->canBePointerOrReferenceQualifier()) {
2881 return T && T->is(TT_PointerOrReference);
2884 bool ParensAreType = IsNonVariableTemplate(*BeforeRParen) ||
2885 BeforeRParen->is(TT_TypeDeclarationParen) ||
2886 BeforeRParen->isTypeName(LangOpts) ||
2887 IsQualifiedPointerOrReference(BeforeRParen, LangOpts);
2888 bool ParensCouldEndDecl =
2889 AfterRParen->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
2890 if (ParensAreType && !ParensCouldEndDecl)
2901 for (
const auto *Token = LParen->Next; Token != &
Tok; Token = Token->Next)
2902 if (Token->is(TT_BinaryOperator))
2907 if (AfterRParen->isOneOf(tok::identifier, tok::kw_this))
2911 if (AfterRParen->is(tok::l_paren)) {
2912 for (
const auto *Prev = BeforeRParen; Prev->is(tok::identifier);) {
2913 Prev = Prev->Previous;
2914 if (Prev->is(tok::coloncolon))
2915 Prev = Prev->Previous;
2921 if (!AfterRParen->Next)
2926 if (Style.Language != FormatStyle::LK_C && AfterRParen->is(tok::l_brace) &&
2934 const bool NextIsAmpOrStar = AfterRParen->isOneOf(tok::amp, tok::star);
2935 if (!(AfterRParen->isUnaryOperator() || NextIsAmpOrStar) ||
2936 AfterRParen->is(tok::plus) ||
2937 AfterRParen->Next->isNoneOf(tok::identifier, tok::numeric_constant)) {
2941 if (NextIsAmpOrStar &&
2942 (AfterRParen->Next->is(tok::numeric_constant) || Line.InPPDirective)) {
2946 if (Line.InPPDirective && AfterRParen->is(tok::minus))
2949 const auto *Prev = BeforeRParen;
2952 if (Prev->is(tok::r_paren)) {
2953 if (Prev->is(TT_CastRParen))
2955 Prev = Prev->MatchingParen;
2958 Prev = Prev->Previous;
2959 if (!Prev || Prev->isNot(tok::r_paren))
2961 Prev = Prev->MatchingParen;
2962 return Prev && Prev->is(TT_FunctionTypeLParen);
2966 for (Prev = BeforeRParen; Prev != LParen; Prev = Prev->Previous)
2967 if (Prev->isNoneOf(tok::kw_const, tok::identifier, tok::coloncolon))
2985 if (PrevToken->isOneOf(
2986 TT_ConditionalExpr, tok::l_paren, tok::comma, tok::colon, tok::semi,
2987 tok::equal, tok::question, tok::l_square, tok::l_brace,
2988 tok::kw_case, tok::kw_co_await, tok::kw_co_return, tok::kw_co_yield,
2989 tok::kw_delete, tok::kw_return, tok::kw_throw)) {
2996 if (PrevToken->is(tok::kw_sizeof))
3000 if (PrevToken->isOneOf(TT_CastRParen, TT_UnaryOperator))
3004 if (PrevToken->is(TT_BinaryOperator))
3012 bool InTemplateArgument) {
3013 if (Style.isJavaScript())
3014 return TT_BinaryOperator;
3017 if (Style.isCSharp() &&
Tok.is(tok::ampamp))
3018 return TT_BinaryOperator;
3020 if (Style.isVerilog()) {
3025 if (
Tok.is(tok::star))
3026 return TT_BinaryOperator;
3027 return determineUnaryOperatorByUsage(
Tok) ? TT_UnaryOperator
3028 : TT_BinaryOperator;
3033 return TT_UnaryOperator;
3034 if (PrevToken->isTypeName(LangOpts))
3035 return TT_PointerOrReference;
3036 if (PrevToken->isPlacementOperator() &&
Tok.is(tok::ampamp))
3037 return TT_BinaryOperator;
3039 auto *NextToken =
Tok.getNextNonComment();
3041 return TT_PointerOrReference;
3042 if (NextToken->is(tok::greater))
3043 return TT_PointerOrReference;
3045 if (InTemplateArgument && NextToken->is(tok::kw_noexcept))
3046 return TT_BinaryOperator;
3048 if (NextToken->isOneOf(tok::arrow, tok::equal, tok::comma, tok::r_paren,
3049 TT_RequiresClause) ||
3050 (NextToken->is(tok::kw_noexcept) && !IsExpression) ||
3051 NextToken->canBePointerOrReferenceQualifier() ||
3052 (NextToken->is(tok::l_brace) && !NextToken->getNextNonComment())) {
3053 return TT_PointerOrReference;
3056 if (PrevToken->is(tok::coloncolon))
3057 return TT_PointerOrReference;
3059 if (PrevToken->is(tok::r_paren) && PrevToken->is(TT_TypeDeclarationParen))
3060 return TT_PointerOrReference;
3062 if (determineUnaryOperatorByUsage(
Tok))
3063 return TT_UnaryOperator;
3065 if (NextToken->is(tok::l_square) && NextToken->isNot(TT_LambdaLSquare))
3066 return TT_PointerOrReference;
3067 if (NextToken->is(tok::kw_operator) && !IsExpression)
3068 return TT_PointerOrReference;
3069 if (NextToken->isOneOf(tok::comma, tok::semi))
3070 return TT_PointerOrReference;
3082 if (PrevToken->is(tok::r_brace) &&
Tok.is(tok::star) &&
3083 !PrevToken->MatchingParen) {
3084 return TT_PointerOrReference;
3087 if (PrevToken->endsSequence(tok::r_square, tok::l_square, tok::kw_delete))
3088 return TT_UnaryOperator;
3090 if (PrevToken->Tok.isLiteral() ||
3091 PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::kw_true,
3092 tok::kw_false, tok::r_brace)) {
3093 return TT_BinaryOperator;
3097 while (NextNonParen && NextNonParen->is(tok::l_paren))
3098 NextNonParen = NextNonParen->getNextNonComment();
3099 if (NextNonParen && (NextNonParen->Tok.isLiteral() ||
3100 NextNonParen->isOneOf(tok::kw_true, tok::kw_false) ||
3101 NextNonParen->isUnaryOperator())) {
3102 return TT_BinaryOperator;
3108 if (InTemplateArgument && NextToken->Tok.isAnyIdentifier())
3109 return TT_BinaryOperator;
3113 if (
Tok.is(tok::ampamp) &&
3114 NextToken->isOneOf(tok::l_paren, tok::star, tok::amp)) {
3115 return TT_BinaryOperator;
3122 if (NextToken->Tok.isAnyIdentifier()) {
3123 auto *NextNextToken = NextToken->getNextNonComment();
3124 if (NextNextToken) {
3125 if (NextNextToken->is(tok::arrow))
3126 return TT_BinaryOperator;
3127 if (NextNextToken->isPointerOrReference() &&
3128 !NextToken->isObjCLifetimeQualifier(Style)) {
3129 NextNextToken->setFinalizedType(TT_BinaryOperator);
3130 return TT_BinaryOperator;
3137 if (IsExpression && !Contexts.back().CaretFound &&
3138 Line.getFirstNonComment()->isNot(
3139 TT_RequiresClauseInARequiresExpression)) {
3140 return TT_BinaryOperator;
3144 if (!Scopes.empty() && Scopes.back() ==
ST_Class)
3145 return TT_PointerOrReference;
3148 auto IsChainedOperatorAmpOrMember = [](
const FormatToken *token) {
3149 return !token || token->isOneOf(tok::amp, tok::period, tok::arrow,
3150 tok::arrowstar, tok::periodstar);
3155 if (
Tok.is(tok::amp) && PrevToken->Tok.isAnyIdentifier() &&
3156 IsChainedOperatorAmpOrMember(PrevToken->getPreviousNonComment()) &&
3157 NextToken && NextToken->Tok.isAnyIdentifier()) {
3158 if (
auto NextNext = NextToken->getNextNonComment();
3160 (IsChainedOperatorAmpOrMember(NextNext) || NextNext->is(tok::semi))) {
3161 return TT_BinaryOperator;
3167 return TT_BinaryOperator;
3170 return TT_PointerOrReference;
3174 if (determineUnaryOperatorByUsage(
Tok))
3175 return TT_UnaryOperator;
3179 return TT_UnaryOperator;
3181 if (PrevToken->is(tok::at))
3182 return TT_UnaryOperator;
3185 return TT_BinaryOperator;
3191 if (!PrevToken || PrevToken->is(TT_CastRParen))
3192 return TT_UnaryOperator;
3193 if (PrevToken->isOneOf(tok::r_paren, tok::r_square, tok::identifier))
3194 return TT_TrailingUnaryOperator;
3196 return TT_UnaryOperator;
3199 SmallVector<Context, 8> Contexts;
3201 const FormatStyle &Style;
3202 AnnotatedLine &Line;
3206 LangOptions LangOpts;
3207 const AdditionalKeywords &Keywords;
3209 SmallVector<ScopeType> &Scopes;
3215 llvm::SmallPtrSet<FormatToken *, 16> NonTemplateLess;
3217 int TemplateDeclarationDepth;
3225class ExpressionParser {
3227 ExpressionParser(
const FormatStyle &Style,
const AdditionalKeywords &Keywords,
3228 AnnotatedLine &Line)
3229 : Style(Style), Keywords(Keywords), Line(Line), Current(Line.
First) {}
3232 void parse(
int Precedence = 0) {
3235 while (Current && (Current->is(tok::kw_return) ||
3236 (Current->is(tok::colon) &&
3237 Current->isOneOf(TT_ObjCMethodExpr, TT_DictLiteral)))) {
3241 if (!Current || Precedence > PrecedenceArrowAndPeriod)
3246 parseConditionalExpr();
3252 if (Precedence == PrecedenceUnaryOperator) {
3253 parseUnaryOperator();
3270 if (Style.isVerilog() && Precedence ==
prec::Comma) {
3271 VerilogFirstOfType =
3272 verilogGroupDecl(VerilogFirstOfType, LatestOperator);
3276 parse(Precedence + 1);
3278 int CurrentPrecedence = getCurrentPrecedence();
3287 if (Style.BreakBinaryOperations.PerOperator.empty() &&
3288 Style.BreakBinaryOperations.Default ==
3289 FormatStyle::BBO_OnePerLine) {
3294 if (Precedence == CurrentPrecedence && Current &&
3295 Current->is(TT_SelectorName)) {
3297 addFakeParenthesis(Start,
prec::Level(Precedence));
3301 if ((Style.isCSharp() || Style.isJavaScript() || Style.isJava()) &&
3305 FormatToken *Prev = Current->getPreviousNonComment();
3306 if (Prev && Prev->is(tok::string_literal) &&
3307 (Prev == Start || Prev->endsSequence(tok::string_literal, tok::plus,
3308 TT_StringInConcatenation))) {
3309 Prev->setType(TT_StringInConcatenation);
3316 (Current->closesScope() &&
3317 (Current->MatchingParen || Current->is(TT_TemplateString))) ||
3318 (CurrentPrecedence != -1 && CurrentPrecedence < Precedence) ||
3327 if (Current->opensScope() ||
3328 Current->isOneOf(TT_RequiresClause,
3329 TT_RequiresClauseInARequiresExpression)) {
3332 while (Current && (!Current->closesScope() || Current->opensScope())) {
3339 if (CurrentPrecedence == Precedence) {
3341 LatestOperator->NextOperator = Current;
3342 LatestOperator = Current;
3346 next(Precedence > 0);
3351 if (Style.isVerilog() && Precedence ==
prec::Comma && VerilogFirstOfType)
3352 addFakeParenthesis(VerilogFirstOfType,
prec::Comma);
3354 if (LatestOperator && (Current || Precedence > 0)) {
3360 Start->Previous->isOneOf(TT_RequiresClause,
3361 TT_RequiresClauseInARequiresExpression))
3363 auto Ret = Current ? Current : Line.Last;
3364 while (!
Ret->ClosesRequiresClause &&
Ret->Previous)
3370 if (Precedence == PrecedenceArrowAndPeriod) {
3374 addFakeParenthesis(Start,
prec::Level(Precedence), End);
3382 int getCurrentPrecedence() {
3384 const FormatToken *NextNonComment = Current->getNextNonComment();
3385 if (Current->is(TT_ConditionalExpr))
3387 if (NextNonComment && Current->is(TT_SelectorName) &&
3388 (NextNonComment->isOneOf(TT_DictLiteral, TT_JsTypeColon) ||
3389 (Style.isProto() && NextNonComment->is(tok::less)))) {
3392 if (Current->is(TT_JsComputedPropertyName))
3394 if (Current->is(TT_LambdaArrow))
3396 if (Current->is(TT_FatArrow))
3398 if (Current->isOneOf(tok::semi, TT_InlineASMColon, TT_SelectorName) ||
3399 (Current->is(tok::comment) && NextNonComment &&
3400 NextNonComment->is(TT_SelectorName))) {
3403 if (Current->is(TT_RangeBasedForLoopColon))
3405 if ((Style.isJava() || Style.isJavaScript()) &&
3406 Current->is(Keywords.kw_instanceof)) {
3409 if (Style.isJavaScript() &&
3410 Current->isOneOf(Keywords.kw_in, Keywords.kw_as)) {
3413 if (Current->isOneOf(TT_BinaryOperator, tok::comma))
3414 return Current->getPrecedence();
3415 if (Current->isOneOf(tok::period, tok::arrow) &&
3416 Current->isNot(TT_TrailingReturnArrow)) {
3417 return PrecedenceArrowAndPeriod;
3419 if ((Style.isJava() || Style.isJavaScript()) &&
3420 Current->isOneOf(Keywords.kw_extends, Keywords.kw_implements,
3421 Keywords.kw_throws)) {
3426 if (Style.isVerilog() && Current->is(tok::colon))
3438 if (Start->MacroParent)
3441 Start->FakeLParens.push_back(Precedence);
3443 Start->StartsBinaryExpression =
true;
3444 if (!End && Current)
3445 End = Current->getPreviousNonComment();
3449 End->EndsBinaryExpression =
true;
3455 void parseUnaryOperator() {
3456 SmallVector<FormatToken *, 2> Tokens;
3457 while (Current && Current->is(TT_UnaryOperator)) {
3458 Tokens.push_back(Current);
3461 parse(PrecedenceArrowAndPeriod);
3468 void parseConditionalExpr() {
3469 while (Current && Current->isTrailingComment())
3473 if (!Current || Current->isNot(tok::question))
3477 if (!Current || Current->isNot(TT_ConditionalExpr))
3484 void next(
bool SkipPastLeadingComments =
true) {
3486 Current = Current->Next;
3488 (Current->NewlinesBefore == 0 || SkipPastLeadingComments) &&
3489 Current->isTrailingComment()) {
3490 Current = Current->Next;
3504 while (Start->startsSequence(tok::l_paren, tok::star)) {
3505 if (!(Start = Start->MatchingParen) ||
3506 !(Start = Start->getNextNonComment())) {
3513 if (
Tok->is(Keywords.kw_assign))
3514 Tok =
Tok->getNextNonComment();
3526 if (
Tok->is(tok::hash)) {
3531 Tok =
Tok->getNextNonComment();
3532 }
else if (
Tok->is(tok::hashhash)) {
3536 Tok =
Tok->getNextNonComment();
3537 }
else if (Keywords.isVerilogQualifier(*
Tok) ||
3538 Keywords.isVerilogIdentifier(*
Tok)) {
3542 while (
Tok &&
Tok->isOneOf(tok::period, tok::coloncolon) &&
3543 (
Tok =
Tok->getNextNonComment())) {
3544 if (Keywords.isVerilogIdentifier(*
Tok))
3545 Tok =
Tok->getNextNonComment();
3549 }
else if (
Tok->is(tok::l_paren)) {
3554 Keywords.kw_highz0, Keywords.kw_highz1, Keywords.kw_large,
3555 Keywords.kw_medium, Keywords.kw_pull0, Keywords.kw_pull1,
3556 Keywords.kw_small, Keywords.kw_strong0, Keywords.kw_strong1,
3557 Keywords.kw_supply0, Keywords.kw_supply1, Keywords.kw_weak0,
3558 Keywords.kw_weak1)) {
3559 Tok->setType(TT_VerilogStrength);
3560 Tok =
Tok->MatchingParen;
3562 Tok->setType(TT_VerilogStrength);
3563 Tok =
Tok->getNextNonComment();
3568 }
else if (
Tok->is(Keywords.kw_verilogHash)) {
3570 if (
Next->is(tok::l_paren))
3573 Tok =
Next->getNextNonComment();
3582 while (
Tok &&
Tok->is(tok::l_square) && (
Tok =
Tok->MatchingParen))
3583 Tok =
Tok->getNextNonComment();
3584 if (
Tok && (
Tok->is(tok::hash) || Keywords.isVerilogIdentifier(*
Tok)))
3593 First->setType(TT_VerilogDimensionedTypeName);
3594 }
else if (
First != Start) {
3602 if (TypedName->is(TT_Unknown))
3603 TypedName->setType(TT_StartOfName);
3605 if (FirstOfType && PreviousComma) {
3606 PreviousComma->setType(TT_VerilogTypeComma);
3607 addFakeParenthesis(FirstOfType,
prec::Comma, PreviousComma->Previous);
3610 FirstOfType = TypedName;
3617 while (Current && Current != FirstOfType) {
3618 if (Current->opensScope()) {
3629 const FormatStyle &Style;
3630 const AdditionalKeywords &Keywords;
3631 const AnnotatedLine &Line;
3641 assert(
Line->First);
3648 Line->First->OriginalColumn) {
3649 const bool PPDirectiveOrImportStmt =
3652 if (PPDirectiveOrImportStmt)
3657 Line->Level = Style.IndentPPDirectives < FormatStyle::PPDIS_BeforeHash &&
3658 PPDirectiveOrImportStmt
3660 : NextNonCommentLine->
Level;
3662 NextNonCommentLine =
Line->First->isNot(tok::r_brace) ?
Line :
nullptr;
3682 if (
Tok->isNot(tok::identifier))
3685 Tok =
Tok->getNextNonComment();
3691 if (
Tok->is(tok::coloncolon))
3692 return Tok->getNextNonComment();
3696 if (
Tok->is(TT_TemplateOpener)) {
3697 Tok =
Tok->MatchingParen;
3701 Tok =
Tok->getNextNonComment();
3706 return Tok->is(tok::coloncolon) ?
Tok->getNextNonComment() :
nullptr;
3714 Tok =
Tok->getNextNonComment()) {
3716 if (
Tok->is(TT_AttributeLSquare)) {
3717 Tok =
Tok->MatchingParen;
3725 if (
Tok->is(tok::l_paren) &&
Tok->is(TT_Unknown) &&
Tok->MatchingParen) {
3733 if (
Tok->isOneOf(tok::kw_friend, tok::kw_inline, tok::kw_virtual,
3734 tok::kw_constexpr, tok::kw_consteval, tok::kw_explicit)) {
3740 if (
Tok->is(tok::kw_template)) {
3741 Tok =
Tok->getNextNonComment();
3747 if (
Tok->isNot(TT_TemplateOpener))
3750 Tok =
Tok->MatchingParen;
3758 if (
Tok->is(tok::coloncolon)) {
3769 if (
Tok->is(tok::tilde)) {
3776 if (
Tok->isNot(tok::identifier) ||
Tok->isNot(TT_Unknown))
3787 assert(
Tok &&
Tok->is(tok::identifier));
3788 const auto *Prev =
Tok->Previous;
3790 if (Prev && Prev->is(tok::tilde))
3791 Prev = Prev->Previous;
3794 if (!Prev || (!Prev->endsSequence(tok::coloncolon, tok::identifier) &&
3795 !Prev->endsSequence(tok::coloncolon, TT_TemplateCloser))) {
3799 assert(Prev->Previous);
3800 if (Prev->Previous->is(TT_TemplateCloser) && Prev->Previous->MatchingParen) {
3801 Prev = Prev->Previous->MatchingParen;
3802 assert(Prev->Previous);
3805 return Prev->Previous->TokenText ==
Tok->TokenText;
3809 if (!
Line.InMacroBody)
3810 MacroBodyScopes.clear();
3812 auto &ScopeStack =
Line.InMacroBody ? MacroBodyScopes : Scopes;
3813 AnnotatingParser
Parser(Style,
Line, Keywords, ScopeStack);
3816 if (!
Line.Children.empty()) {
3819 for (
auto &Child :
Line.Children) {
3820 if (InRequiresExpression &&
3821 Child->First->isNoneOf(tok::kw_typename, tok::kw_requires,
3822 TT_CompoundRequirementLBrace)) {
3828 if (!ScopeStack.empty())
3829 ScopeStack.pop_back();
3842 ExpressionParser ExprParser(Style, Keywords,
Line);
3848 if (
Tok && ((!ScopeStack.empty() && ScopeStack.back() ==
ST_Class) ||
3850 Tok->setFinalizedType(TT_CtorDtorDeclName);
3851 assert(OpeningParen);
3856 if (
Line.startsWith(TT_ObjCMethodSpecifier))
3858 else if (
Line.startsWith(TT_ObjCDecl))
3860 else if (
Line.startsWith(TT_ObjCProperty))
3864 First->SpacesRequiredBefore = 1;
3865 First->CanBreakBefore =
First->MustBreakBefore;
3874 if (Current.
is(TT_FunctionDeclarationName))
3877 if (Current.
isNoneOf(tok::identifier, tok::kw_operator))
3880 const auto *Prev = Current.getPreviousNonComment();
3885 if (
const auto *PrevPrev =
Previous.getPreviousNonComment();
3886 PrevPrev && PrevPrev->is(TT_ObjCDecl)) {
3890 auto skipOperatorName =
3893 if (
Next->is(TT_OverloadedOperatorLParen))
3895 if (
Next->is(TT_OverloadedOperator))
3897 if (
Next->isPlacementOperator() ||
Next->is(tok::kw_co_await)) {
3900 Next->Next->startsSequence(tok::l_square, tok::r_square)) {
3905 if (
Next->startsSequence(tok::l_square, tok::r_square)) {
3910 if ((
Next->isTypeName(LangOpts) ||
Next->is(tok::identifier)) &&
3911 Next->Next &&
Next->Next->isPointerOrReference()) {
3916 if (
Next->is(TT_TemplateOpener) &&
Next->MatchingParen) {
3927 const bool IsCpp = LangOpts.CXXOperatorNames || LangOpts.C11;
3930 if (Current.
is(tok::kw_operator)) {
3931 if (
Line.startsWith(tok::kw_friend))
3933 if (
Previous.Tok.getIdentifierInfo() &&
3934 Previous.isNoneOf(tok::kw_return, tok::kw_co_return)) {
3939 assert(
Previous.MatchingParen->is(tok::l_paren));
3940 assert(
Previous.MatchingParen->is(TT_TypeDeclarationParen));
3949 while (
Next &&
Next->startsSequence(tok::hashhash, tok::identifier))
3952 if (
Next->is(TT_TemplateOpener) &&
Next->MatchingParen) {
3954 }
else if (
Next->is(tok::coloncolon)) {
3958 if (
Next->is(tok::kw_operator)) {
3959 Next = skipOperatorName(
Next->Next);
3962 if (
Next->isNot(tok::identifier))
3964 }
else if (isCppAttribute(IsCpp, *
Next)) {
3968 }
else if (
Next->is(tok::l_paren)) {
3977 if (!
Next ||
Next->isNot(tok::l_paren) || !
Next->MatchingParen)
3979 ClosingParen =
Next->MatchingParen;
3980 assert(ClosingParen->
is(tok::r_paren));
3982 if (
Line.Last->is(tok::l_brace))
3984 if (
Next->Next == ClosingParen)
3987 if (ClosingParen->
Next && ClosingParen->
Next->
is(TT_PointerOrReference))
4000 if (IsCpp &&
Next->Next &&
Next->Next->is(tok::identifier) &&
4001 !
Line.endsWith(tok::semi)) {
4007 if (
Tok->is(TT_TypeDeclarationParen))
4009 if (
Tok->isOneOf(tok::l_paren, TT_TemplateOpener) &&
Tok->MatchingParen) {
4010 Tok =
Tok->MatchingParen;
4013 if (
Tok->is(tok::kw_const) ||
Tok->isTypeName(LangOpts) ||
4014 Tok->isOneOf(TT_PointerOrReference, TT_StartOfName, tok::ellipsis)) {
4017 if (
Tok->isOneOf(tok::l_brace, TT_ObjCMethodExpr) ||
Tok->Tok.isLiteral())
4023bool TokenAnnotator::mustBreakForReturnType(
const AnnotatedLine &
Line)
const {
4024 assert(
Line.MightBeFunctionDecl);
4026 if ((Style.BreakAfterReturnType == FormatStyle::RTBS_TopLevel ||
4027 Style.BreakAfterReturnType == FormatStyle::RTBS_TopLevelDefinitions) &&
4032 switch (Style.BreakAfterReturnType) {
4033 case FormatStyle::RTBS_None:
4034 case FormatStyle::RTBS_Automatic:
4035 case FormatStyle::RTBS_ExceptShortType:
4037 case FormatStyle::RTBS_All:
4038 case FormatStyle::RTBS_TopLevel:
4040 case FormatStyle::RTBS_AllDefinitions:
4041 case FormatStyle::RTBS_TopLevelDefinitions:
4042 return Line.mightBeFunctionDefinition();
4052 Line.Computed =
true;
4060 :
Line.FirstStartColumn +
First->ColumnWidth;
4061 bool AlignArrayOfStructures =
4062 (Style.AlignArrayOfStructures != FormatStyle::AIAS_None &&
4064 if (AlignArrayOfStructures)
4065 calculateArrayInitializerColumnList(
Line);
4067 const auto *FirstNonComment =
Line.getFirstNonComment();
4068 bool SeenName =
false;
4069 bool LineIsFunctionDeclaration =
false;
4073 for (
auto *
Tok = FirstNonComment && FirstNonComment->isNot(tok::kw_using)
4074 ? FirstNonComment->Next
4077 if (
Tok->is(TT_StartOfName))
4079 if (
Tok->Previous->EndsCppAttributeGroup)
4080 AfterLastAttribute =
Tok;
4081 if (
const bool IsCtorOrDtor =
Tok->is(TT_CtorDtorDeclName);
4085 Tok->setFinalizedType(TT_FunctionDeclarationName);
4086 LineIsFunctionDeclaration =
true;
4090 assert(OpeningParen);
4091 if (OpeningParen->is(TT_Unknown))
4092 OpeningParen->setType(TT_FunctionDeclarationLParen);
4099 if ((LineIsFunctionDeclaration ||
4100 (FirstNonComment && FirstNonComment->is(TT_CtorDtorDeclName))) &&
4101 Line.endsWith(tok::semi, tok::r_brace)) {
4102 auto *
Tok =
Line.Last->Previous;
4103 while (
Tok->isNot(tok::r_brace))
4105 if (
auto *LBrace =
Tok->MatchingParen; LBrace && LBrace->is(TT_Unknown)) {
4106 assert(LBrace->is(tok::l_brace));
4109 LBrace->setFinalizedType(TT_FunctionLBrace);
4113 if (SeenName && AfterLastAttribute &&
4116 if (LineIsFunctionDeclaration)
4117 Line.ReturnTypeWrapped =
true;
4120 if (!LineIsFunctionDeclaration) {
4122 for (
const auto *
Tok = FirstNonComment;
Tok;
Tok =
Tok->Next) {
4123 if (
Tok->isNot(tok::kw_operator))
4127 }
while (
Tok &&
Tok->isNot(TT_OverloadedOperatorLParen));
4128 if (!
Tok || !
Tok->MatchingParen)
4130 const auto *LeftParen =
Tok;
4131 for (
Tok =
Tok->Next;
Tok &&
Tok != LeftParen->MatchingParen;
4133 if (
Tok->isNot(tok::identifier))
4136 const bool NextIsBinaryOperator =
4138 Next->Next->is(tok::identifier);
4139 if (!NextIsBinaryOperator)
4141 Next->setType(TT_BinaryOperator);
4145 }
else if (ClosingParen) {
4147 if (
Tok->is(TT_CtorInitializerColon))
4149 if (
Tok->is(tok::arrow)) {
4150 Tok->setType(TT_TrailingReturnArrow);
4153 if (
Tok->isNot(TT_TrailingAnnotation))
4156 if (!
Next ||
Next->isNot(tok::l_paren))
4165 if (
First->is(TT_ElseLBrace)) {
4166 First->CanBreakBefore =
true;
4167 First->MustBreakBefore =
true;
4170 bool InFunctionDecl =
Line.MightBeFunctionDecl;
4171 bool InParameterList =
false;
4172 for (
auto *Current =
First->Next; Current; Current = Current->Next) {
4174 if (Current->is(TT_LineComment)) {
4176 Current->SpacesRequiredBefore =
4177 (Style.Cpp11BracedListStyle == FormatStyle::BLS_AlignFirstComment &&
4178 !Style.SpacesInParensOptions.Other)
4181 }
else if (Prev->
is(TT_VerilogMultiLineListLParen)) {
4182 Current->SpacesRequiredBefore = 0;
4184 Current->SpacesRequiredBefore = Style.SpacesBeforeTrailingComments;
4194 if (!Current->HasUnescapedNewline) {
4197 if (
Parameter->isOneOf(tok::comment, tok::r_brace))
4200 if (
Parameter->Previous->isNot(TT_CtorInitializerComma) &&
4208 }
else if (!Current->Finalized && Current->SpacesRequiredBefore == 0 &&
4209 spaceRequiredBefore(
Line, *Current)) {
4210 Current->SpacesRequiredBefore = 1;
4215 Current->MustBreakBefore =
true;
4217 Current->MustBreakBefore =
4218 Current->MustBreakBefore || mustBreakBefore(
Line, *Current);
4219 if (!Current->MustBreakBefore && InFunctionDecl &&
4220 Current->is(TT_FunctionDeclarationName)) {
4221 Current->MustBreakBefore = mustBreakForReturnType(
Line);
4225 Current->CanBreakBefore =
4226 Current->MustBreakBefore || canBreakBefore(
Line, *Current);
4228 if (Current->is(TT_FunctionDeclarationLParen)) {
4229 InParameterList =
true;
4230 }
else if (Current->is(tok::r_paren)) {
4231 const auto *LParen = Current->MatchingParen;
4232 if (LParen && LParen->is(TT_FunctionDeclarationLParen))
4233 InParameterList =
false;
4234 }
else if (InParameterList &&
4235 Current->endsSequence(TT_AttributeMacro,
4236 TT_PointerOrReference)) {
4237 Current->CanBreakBefore =
false;
4240 unsigned ChildSize = 0;
4243 ChildSize = LastOfChild.isTrailingComment() ? Style.ColumnLimit
4246 if (Current->MustBreakBefore || Prev->
Children.size() > 1 ||
4248 Prev->
Children[0]->First->MustBreakBefore) ||
4249 Current->IsMultiline) {
4250 Current->TotalLength = Prev->
TotalLength + Style.ColumnLimit;
4252 Current->TotalLength = Prev->
TotalLength + Current->ColumnWidth +
4253 ChildSize + Current->SpacesRequiredBefore;
4256 if (Current->is(TT_ControlStatementLBrace)) {
4257 if (Style.ColumnLimit > 0 &&
4258 Style.BraceWrapping.AfterControlStatement ==
4259 FormatStyle::BWACS_MultiLine &&
4260 Line.Level * Style.IndentWidth +
Line.Last->TotalLength >
4261 Style.ColumnLimit) {
4262 Current->CanBreakBefore =
true;
4263 Current->MustBreakBefore =
true;
4265 }
else if (Current->is(TT_CtorInitializerColon)) {
4266 InFunctionDecl =
false;
4278 Current->SplitPenalty = splitPenalty(
Line, *Current, InFunctionDecl);
4279 if (Style.Language == FormatStyle::LK_ObjC &&
4280 Current->is(TT_SelectorName) && Current->ParameterIndex > 0) {
4281 if (Current->ParameterIndex == 1)
4282 Current->SplitPenalty += 5 * Current->BindingStrength;
4284 Current->SplitPenalty += 20 * Current->BindingStrength;
4288 calculateUnbreakableTailLengths(
Line);
4290 for (
auto *Current =
First; Current; Current = Current->Next) {
4292 Current->Role->precomputeFormattingInfos(Current);
4293 if (Current->MatchingParen &&
4294 Current->MatchingParen->opensBlockOrBlockTypeList(Style) &&
4299 if (Current->opensBlockOrBlockTypeList(Style))
4303 LLVM_DEBUG({ printDebugInfo(
Line); });
4306void TokenAnnotator::calculateUnbreakableTailLengths(
4313 Current->
isOneOf(tok::comment, tok::string_literal)) {
4323void TokenAnnotator::calculateArrayInitializerColumnList(
4327 auto *CurrentToken =
Line.First;
4328 CurrentToken->ArrayInitializerLineStart =
true;
4330 while (CurrentToken && CurrentToken !=
Line.Last) {
4331 if (CurrentToken->is(tok::l_brace)) {
4332 CurrentToken->IsArrayInitializer =
true;
4333 if (CurrentToken->Next)
4334 CurrentToken->Next->MustBreakBefore =
true;
4336 calculateInitializerColumnList(
Line, CurrentToken->Next, Depth + 1);
4338 CurrentToken = CurrentToken->Next;
4343FormatToken *TokenAnnotator::calculateInitializerColumnList(
4345 while (CurrentToken && CurrentToken !=
Line.Last) {
4346 if (CurrentToken->is(tok::l_brace))
4348 else if (CurrentToken->is(tok::r_brace))
4350 if (Depth == 2 && CurrentToken->isOneOf(tok::l_brace, tok::comma)) {
4351 CurrentToken = CurrentToken->Next;
4354 CurrentToken->StartsColumn =
true;
4355 CurrentToken = CurrentToken->Previous;
4357 CurrentToken = CurrentToken->Next;
4359 return CurrentToken;
4364 bool InFunctionDecl)
const {
4368 if (
Left.is(tok::semi))
4372 if (Style.isJava()) {
4373 if (
Right.isOneOf(Keywords.kw_extends, Keywords.kw_throws))
4375 if (
Right.is(Keywords.kw_implements))
4377 if (
Left.is(tok::comma) &&
Left.NestingLevel == 0)
4379 }
else if (Style.isJavaScript()) {
4380 if (
Right.is(Keywords.kw_function) &&
Left.isNot(tok::comma))
4382 if (
Left.is(TT_JsTypeColon))
4384 if ((
Left.is(TT_TemplateString) &&
Left.TokenText.ends_with(
"${")) ||
4385 (
Right.is(TT_TemplateString) &&
Right.TokenText.starts_with(
"}"))) {
4389 if (
Left.opensScope() &&
Right.closesScope())
4391 }
else if (Style.Language == FormatStyle::LK_Proto) {
4392 if (
Right.is(tok::l_square))
4394 if (
Right.is(tok::period))
4398 if (
Right.is(tok::identifier) &&
Right.Next &&
Right.Next->is(TT_DictLiteral))
4400 if (
Right.is(tok::l_square)) {
4401 if (
Left.is(tok::r_square))
4404 if (
Right.is(TT_LambdaLSquare) &&
Left.is(tok::equal))
4406 if (
Right.isNoneOf(TT_ObjCMethodExpr, TT_LambdaLSquare,
4407 TT_ArrayInitializerLSquare,
4408 TT_DesignatedInitializerLSquare, TT_AttributeLSquare)) {
4413 if (
Left.is(tok::coloncolon))
4414 return Style.PenaltyBreakScopeResolution;
4415 if (
Right.isOneOf(TT_StartOfName, TT_FunctionDeclarationName,
4416 tok::kw_operator)) {
4417 if (
Line.startsWith(tok::kw_for) &&
Right.PartOfMultiVariableDeclStmt)
4419 if (
Left.is(TT_StartOfName))
4421 if (InFunctionDecl &&
Right.NestingLevel == 0)
4422 return Style.PenaltyReturnTypeOnItsOwnLine;
4425 if (
Right.is(TT_PointerOrReference))
4427 if (
Right.is(TT_LambdaArrow))
4429 if (
Left.is(tok::equal) &&
Right.is(tok::l_brace))
4431 if (
Left.is(TT_CastRParen))
4433 if (
Left.isOneOf(tok::kw_class, tok::kw_struct, tok::kw_union))
4435 if (
Left.is(tok::comment))
4438 if (
Left.isOneOf(TT_RangeBasedForLoopColon, TT_InheritanceColon,
4439 TT_CtorInitializerColon)) {
4443 if (
Right.isMemberAccess()) {
4464 const auto Penalty = Style.PenaltyBreakBeforeMemberAccess;
4466 ? std::min(Penalty, 35u)
4470 if (
Right.is(TT_TrailingAnnotation) &&
4471 (!
Right.Next ||
Right.Next->isNot(tok::l_paren))) {
4474 if (
Line.startsWith(TT_ObjCMethodSpecifier))
4481 bool is_short_annotation =
Right.TokenText.size() < 10;
4482 return (
Left.is(tok::r_paren) ? 100 : 120) + (is_short_annotation ? 50 : 0);
4486 if (
Line.startsWith(tok::kw_for) &&
Left.is(tok::equal))
4491 if (
Right.is(TT_SelectorName))
4493 if (
Left.is(tok::colon)) {
4494 if (
Left.is(TT_ObjCMethodExpr))
4495 return Line.MightBeFunctionDecl ? 50 : 500;
4496 if (
Left.is(TT_ObjCSelector))
4504 Left.Previous->isOneOf(tok::identifier, tok::greater)) {
4508 if (
Left.is(tok::l_paren) && Style.PenaltyBreakOpenParenthesis != 0)
4509 return Style.PenaltyBreakOpenParenthesis;
4510 if (
Left.is(tok::l_paren) && InFunctionDecl && Style.AlignAfterOpenBracket)
4512 if (
Left.is(tok::l_paren) &&
Left.Previous &&
4513 (
Left.Previous->isOneOf(tok::kw_for, tok::kw__Generic) ||
4514 Left.Previous->isIf())) {
4517 if (
Left.is(tok::equal) && InFunctionDecl)
4519 if (
Right.is(tok::r_brace))
4521 if (
Left.is(TT_TemplateOpener))
4523 if (
Left.opensScope()) {
4527 if (!Style.AlignAfterOpenBracket &&
4528 (
Left.ParameterCount <= 1 || Style.AllowAllArgumentsOnNextLine)) {
4531 if (
Left.is(tok::l_brace) &&
4532 Style.Cpp11BracedListStyle == FormatStyle::BLS_Block) {
4535 return Left.ParameterCount > 1 ? Style.PenaltyBreakBeforeFirstCallParameter
4538 if (
Left.is(TT_JavaAnnotation))
4541 if (
Left.is(TT_UnaryOperator))
4543 if (
Left.isOneOf(tok::plus, tok::comma) &&
Left.Previous &&
4544 Left.Previous->isLabelString() &&
4545 (
Left.NextOperator ||
Left.OperatorIndex != 0)) {
4548 if (
Right.is(tok::plus) &&
Left.isLabelString() &&
4549 (
Right.NextOperator ||
Right.OperatorIndex != 0)) {
4552 if (
Left.is(tok::comma))
4554 if (
Right.is(tok::lessless) &&
Left.isLabelString() &&
4555 (
Right.NextOperator ||
Right.OperatorIndex != 1)) {
4558 if (
Right.is(tok::lessless)) {
4560 if (
Left.isNot(tok::r_paren) ||
Right.OperatorIndex > 0) {
4566 if (
Left.ClosesTemplateDeclaration)
4567 return Style.PenaltyBreakTemplateDeclaration;
4568 if (
Left.ClosesRequiresClause)
4570 if (
Left.is(TT_ConditionalExpr))
4576 return Style.PenaltyBreakAssignment;
4583bool TokenAnnotator::spaceRequiredBeforeParens(
const FormatToken &Right)
const {
4584 if (Style.SpaceBeforeParens == FormatStyle::SBPO_Always)
4586 if (
Right.is(TT_OverloadedOperatorLParen) &&
4587 Style.SpaceBeforeParensOptions.AfterOverloadedOperator) {
4590 if (Style.SpaceBeforeParensOptions.BeforeNonEmptyParentheses &&
4591 Right.ParameterCount > 0) {
4600 if (
Left.is(tok::kw_return) &&
4601 Right.isNoneOf(tok::semi, tok::r_paren, tok::hashhash)) {
4604 if (
Left.is(tok::kw_throw) &&
Right.is(tok::l_paren) &&
Right.MatchingParen &&
4605 Right.MatchingParen->is(TT_CastRParen)) {
4608 if (
Left.is(Keywords.kw_assert) && Style.isJava())
4611 Left.is(tok::objc_property)) {
4614 if (
Right.is(tok::hashhash))
4615 return Left.is(tok::hash);
4616 if (
Left.isOneOf(tok::hashhash, tok::hash))
4617 return Right.is(tok::hash);
4618 if (Style.SpacesInParens == FormatStyle::SIPO_Custom) {
4619 if (
Left.is(tok::l_paren) &&
Right.is(tok::r_paren))
4620 return Style.SpacesInParensOptions.InEmptyParentheses;
4621 if (Style.SpacesInParensOptions.ExceptDoubleParentheses &&
4622 Left.is(tok::r_paren) &&
Right.is(tok::r_paren)) {
4623 auto *InnerLParen =
Left.MatchingParen;
4624 if (InnerLParen && InnerLParen->Previous ==
Right.MatchingParen) {
4625 InnerLParen->SpacesRequiredBefore = 0;
4630 if (
Left.is(tok::l_paren))
4632 else if (
Right.is(tok::r_paren) &&
Right.MatchingParen)
4633 LeftParen =
Right.MatchingParen;
4634 if (LeftParen && (LeftParen->is(TT_ConditionLParen) ||
4635 (LeftParen->Previous &&
4636 isKeywordWithCondition(*LeftParen->Previous)))) {
4637 return Style.SpacesInParensOptions.InConditionalStatements;
4642 if (
Left.is(tok::kw_auto) &&
Right.isOneOf(TT_LambdaLBrace, TT_FunctionLBrace,
4644 TT_FunctionTypeLParen)) {
4649 if (
Left.is(tok::kw_auto) &&
Right.isOneOf(tok::l_paren, tok::l_brace))
4652 const auto *BeforeLeft =
Left.Previous;
4655 if (
Right.is(tok::l_paren) &&
Left.is(tok::kw_co_await) && BeforeLeft &&
4656 BeforeLeft->is(tok::kw_operator)) {
4660 if (
Left.isOneOf(tok::kw_co_await, tok::kw_co_yield, tok::kw_co_return) &&
4661 Right.isNoneOf(tok::semi, tok::r_paren)) {
4665 if (
Left.is(tok::l_paren) ||
Right.is(tok::r_paren)) {
4666 return (
Right.is(TT_CastRParen) ||
4667 (
Left.MatchingParen &&
Left.MatchingParen->is(TT_CastRParen)))
4668 ? Style.SpacesInParensOptions.InCStyleCasts
4669 : Style.SpacesInParensOptions.Other;
4671 if (
Right.isOneOf(tok::semi, tok::comma))
4674 bool IsLightweightGeneric =
Right.MatchingParen &&
4675 Right.MatchingParen->Next &&
4676 Right.MatchingParen->Next->is(tok::colon);
4677 return !IsLightweightGeneric && Style.ObjCSpaceBeforeProtocolList;
4679 if (
Right.is(tok::less) &&
Left.is(tok::kw_template))
4680 return Style.SpaceAfterTemplateKeyword;
4681 if (
Left.isOneOf(tok::exclaim, tok::tilde))
4683 if (
Left.is(tok::at) &&
4684 Right.isOneOf(tok::identifier, tok::string_literal, tok::char_constant,
4685 tok::numeric_constant, tok::l_paren, tok::l_brace,
4686 tok::kw_true, tok::kw_false)) {
4689 if (
Left.is(tok::colon))
4690 return Left.isNoneOf(TT_ObjCSelector, TT_ObjCMethodExpr);
4691 if (
Left.is(tok::coloncolon))
4693 if (
Left.is(tok::less) ||
Right.isOneOf(tok::greater, tok::less)) {
4694 if (Style.isTextProto() ||
4695 (Style.Language == FormatStyle::LK_Proto &&
4696 (
Left.is(TT_DictLiteral) ||
Right.is(TT_DictLiteral)))) {
4698 if (
Left.is(tok::less) &&
Right.is(tok::greater))
4700 return Style.Cpp11BracedListStyle == FormatStyle::BLS_Block;
4703 if (
Right.isNot(TT_OverloadedOperatorLParen))
4706 if (
Right.is(tok::ellipsis)) {
4707 return Left.Tok.isLiteral() || (
Left.is(tok::identifier) && BeforeLeft &&
4708 BeforeLeft->is(tok::kw_case));
4710 if (
Left.is(tok::l_square) &&
Right.is(tok::amp))
4711 return Style.SpacesInSquareBrackets;
4712 if (
Right.is(TT_PointerOrReference)) {
4713 if (
Left.is(tok::r_paren) &&
Line.MightBeFunctionDecl) {
4714 if (!
Left.MatchingParen)
4717 Left.MatchingParen->getPreviousNonComment();
4718 if (!TokenBeforeMatchingParen ||
Left.isNot(TT_TypeDeclarationParen))
4724 if ((Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_After ||
4725 Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both) &&
4726 (
Left.is(TT_AttributeRParen) ||
4727 Left.canBePointerOrReferenceQualifier())) {
4730 if (
Left.Tok.isLiteral())
4733 if (
Left.isTypeOrIdentifier(LangOpts) &&
Right.Next &&
Right.Next->Next &&
4734 Right.Next->Next->is(TT_RangeBasedForLoopColon)) {
4735 return getTokenPointerOrReferenceAlignment(Right) !=
4736 FormatStyle::PAS_Left;
4738 return Left.isNoneOf(TT_PointerOrReference, tok::l_paren) &&
4739 (getTokenPointerOrReferenceAlignment(Right) !=
4740 FormatStyle::PAS_Left ||
4741 (
Line.IsMultiVariableDeclStmt &&
4742 (
Left.NestingLevel == 0 ||
4743 (
Left.NestingLevel == 1 && startsWithInitStatement(
Line)))));
4745 if (
Right.is(TT_FunctionTypeLParen) &&
Left.isNot(tok::l_paren) &&
4746 (
Left.isNot(TT_PointerOrReference) ||
4747 (getTokenPointerOrReferenceAlignment(Left) != FormatStyle::PAS_Right &&
4748 !
Line.IsMultiVariableDeclStmt))) {
4751 if (
Left.is(TT_PointerOrReference)) {
4754 if ((Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Before ||
4755 Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both) &&
4756 Right.canBePointerOrReferenceQualifier()) {
4760 if (
Right.Tok.isLiteral())
4763 if (
Right.is(TT_BlockComment))
4767 if (
Right.isOneOf(Keywords.kw_override, Keywords.kw_final, tok::kw_noexcept,
4768 TT_RequiresClause) &&
4769 Right.isNot(TT_StartOfName)) {
4776 if (BeforeLeft && BeforeLeft->isTypeOrIdentifier(LangOpts) &&
Right.Next &&
4777 Right.Next->is(TT_RangeBasedForLoopColon)) {
4778 return getTokenPointerOrReferenceAlignment(Left) !=
4779 FormatStyle::PAS_Right;
4781 if (
Right.isOneOf(TT_PointerOrReference, TT_ArraySubscriptLSquare,
4785 if (getTokenPointerOrReferenceAlignment(Left) == FormatStyle::PAS_Right)
4793 if (
Line.IsMultiVariableDeclStmt &&
4794 (
Left.NestingLevel ==
Line.First->NestingLevel ||
4795 ((
Left.NestingLevel ==
Line.First->NestingLevel + 1) &&
4796 startsWithInitStatement(
Line)))) {
4801 if (BeforeLeft->is(tok::coloncolon)) {
4802 if (
Left.isNot(tok::star))
4804 assert(Style.PointerAlignment != FormatStyle::PAS_Right);
4805 if (!
Right.startsSequence(tok::identifier, tok::r_paren))
4808 const auto *LParen =
Right.Next->MatchingParen;
4809 return !LParen || LParen->isNot(TT_FunctionTypeLParen);
4811 return BeforeLeft->isNoneOf(tok::l_paren, tok::l_square);
4814 if (
Left.is(tok::ellipsis) && BeforeLeft &&
4815 BeforeLeft->isPointerOrReference()) {
4816 return Style.PointerAlignment != FormatStyle::PAS_Right;
4819 if (
Right.is(tok::star) &&
Left.is(tok::l_paren))
4821 if (
Left.is(tok::star) &&
Right.isPointerOrReference())
4823 if (
Right.isPointerOrReference()) {
4834 if (
Previous->is(tok::coloncolon)) {
4853 if (
Previous->endsSequence(tok::kw_operator))
4854 return Style.PointerAlignment != FormatStyle::PAS_Left;
4855 if (
Previous->isOneOf(tok::kw_const, tok::kw_volatile)) {
4856 return (Style.PointerAlignment != FormatStyle::PAS_Left) ||
4857 (Style.SpaceAroundPointerQualifiers ==
4858 FormatStyle::SAPQ_After) ||
4859 (Style.SpaceAroundPointerQualifiers == FormatStyle::SAPQ_Both);
4863 if (Style.isCSharp() &&
Left.is(Keywords.kw_is) &&
Right.is(tok::l_square))
4865 const auto SpaceRequiredForArrayInitializerLSquare =
4866 [](
const FormatToken &LSquareTok,
const FormatStyle &Style) {
4867 return Style.SpacesInContainerLiterals ||
4869 Style.Cpp11BracedListStyle == FormatStyle::BLS_Block &&
4870 LSquareTok.endsSequence(tok::l_square, tok::colon,
4873 if (
Left.is(tok::l_square)) {
4874 return (
Left.is(TT_ArrayInitializerLSquare) &&
Right.isNot(tok::r_square) &&
4875 SpaceRequiredForArrayInitializerLSquare(Left, Style)) ||
4876 (
Left.isOneOf(TT_ArraySubscriptLSquare, TT_StructuredBindingLSquare,
4877 TT_LambdaLSquare) &&
4878 Style.SpacesInSquareBrackets &&
Right.isNot(tok::r_square));
4880 if (
Right.is(tok::r_square)) {
4881 return Right.MatchingParen &&
4882 ((
Right.MatchingParen->is(TT_ArrayInitializerLSquare) &&
4883 SpaceRequiredForArrayInitializerLSquare(*
Right.MatchingParen,
4885 (Style.SpacesInSquareBrackets &&
4886 Right.MatchingParen->isOneOf(TT_ArraySubscriptLSquare,
4887 TT_StructuredBindingLSquare,
4888 TT_LambdaLSquare)));
4890 if (
Right.is(tok::l_square) &&
4891 Right.isNoneOf(TT_ObjCMethodExpr, TT_LambdaLSquare,
4892 TT_DesignatedInitializerLSquare,
4893 TT_StructuredBindingLSquare, TT_AttributeLSquare) &&
4894 Left.isNoneOf(tok::numeric_constant, TT_DictLiteral) &&
4895 !(
Left.isNot(tok::r_square) && Style.SpaceBeforeSquareBrackets &&
4896 Right.is(TT_ArraySubscriptLSquare))) {
4900 (
Right.is(tok::r_brace) &&
Right.MatchingParen &&
4902 return Style.Cpp11BracedListStyle == FormatStyle::BLS_Block ||
4903 Style.SpacesInParensOptions.Other;
4905 if (
Left.is(TT_BlockComment)) {
4907 return Style.isJavaScript() || !
Left.TokenText.ends_with(
"=*/");
4912 if (
Left.is(TT_TemplateCloser) &&
Right.is(TT_AttributeLSquare))
4915 if (
Right.is(tok::l_paren)) {
4917 if (
Line.MightBeFunctionDecl &&
Right.is(TT_FunctionDeclarationLParen)) {
4918 if (spaceRequiredBeforeParens(Right))
4920 const auto &Options = Style.SpaceBeforeParensOptions;
4921 return Line.mightBeFunctionDefinition()
4922 ? Options.AfterFunctionDefinitionName
4923 : Options.AfterFunctionDeclarationName;
4925 if (
Left.is(TT_TemplateCloser) &&
Right.isNot(TT_FunctionTypeLParen))
4926 return spaceRequiredBeforeParens(Right);
4927 if (
Left.isOneOf(TT_RequiresClause,
4928 TT_RequiresClauseInARequiresExpression)) {
4929 return Style.SpaceBeforeParensOptions.AfterRequiresInClause ||
4930 spaceRequiredBeforeParens(Right);
4932 if (
Left.is(TT_RequiresExpression)) {
4933 return Style.SpaceBeforeParensOptions.AfterRequiresInExpression ||
4934 spaceRequiredBeforeParens(Right);
4936 if (
Left.isOneOf(TT_AttributeRParen, TT_AttributeRSquare))
4938 if (
Left.is(TT_ForEachMacro)) {
4939 return Style.SpaceBeforeParensOptions.AfterForeachMacros ||
4940 spaceRequiredBeforeParens(Right);
4942 if (
Left.is(TT_IfMacro)) {
4943 return Style.SpaceBeforeParensOptions.AfterIfMacros ||
4944 spaceRequiredBeforeParens(Right);
4946 if (Style.SpaceBeforeParens == FormatStyle::SBPO_Custom &&
4947 Left.isPlacementOperator() &&
4948 Right.isNot(TT_OverloadedOperatorLParen) &&
4949 !(
Line.MightBeFunctionDecl &&
Left.is(TT_FunctionDeclarationName))) {
4950 const auto *RParen =
Right.MatchingParen;
4951 return Style.SpaceBeforeParensOptions.AfterPlacementOperator ||
4952 (RParen && RParen->is(TT_CastRParen));
4956 if (
Left.is(tok::semi))
4958 if (
Left.isOneOf(tok::pp_elif, tok::kw_for, tok::kw_while, tok::kw_switch,
4959 tok::kw_case, TT_ForEachMacro, TT_ObjCForIn) ||
4961 Right.is(TT_ConditionLParen)) {
4962 return Style.SpaceBeforeParensOptions.AfterControlStatements ||
4963 spaceRequiredBeforeParens(Right);
4968 if (
Right.is(TT_OverloadedOperatorLParen))
4969 return spaceRequiredBeforeParens(Right);
4973 Left.MatchingParen &&
Left.MatchingParen->is(TT_LambdaLSquare)) {
4974 return Style.SpaceBeforeParensOptions.AfterFunctionDefinitionName ||
4975 spaceRequiredBeforeParens(Right);
4977 if (!BeforeLeft || BeforeLeft->isNoneOf(tok::period, tok::arrow)) {
4978 if (
Left.isOneOf(tok::kw_try, Keywords.kw___except, tok::kw_catch)) {
4979 return Style.SpaceBeforeParensOptions.AfterControlStatements ||
4980 spaceRequiredBeforeParens(Right);
4982 if (
Left.isPlacementOperator() ||
4983 (
Left.is(tok::r_square) &&
Left.MatchingParen &&
4984 Left.MatchingParen->Previous &&
4985 Left.MatchingParen->Previous->is(tok::kw_delete))) {
4986 return Style.SpaceBeforeParens != FormatStyle::SBPO_Never ||
4987 spaceRequiredBeforeParens(Right);
4992 (
Left.Tok.getIdentifierInfo() ||
Left.is(tok::r_paren))) {
4993 return spaceRequiredBeforeParens(Right);
4997 if (
Left.is(tok::at) &&
Right.isNot(tok::objc_not_keyword))
4999 if (
Right.is(TT_UnaryOperator)) {
5000 return Left.isNoneOf(tok::l_paren, tok::l_square, tok::at) &&
5001 (
Left.isNot(tok::colon) ||
Left.isNot(TT_ObjCMethodExpr));
5007 if (!Style.isVerilog() &&
5008 (
Left.isOneOf(tok::identifier, tok::greater, tok::r_square,
5010 Left.isTypeName(LangOpts)) &&
5011 Right.is(tok::l_brace) &&
Right.getNextNonComment() &&
5015 if (
Left.is(tok::period) ||
Right.is(tok::period))
5019 if (
Right.is(tok::hash) &&
Left.is(tok::identifier) &&
5020 (
Left.TokenText ==
"L" ||
Left.TokenText ==
"u" ||
5021 Left.TokenText ==
"U" ||
Left.TokenText ==
"u8" ||
5022 Left.TokenText ==
"LR" ||
Left.TokenText ==
"uR" ||
5023 Left.TokenText ==
"UR" ||
Left.TokenText ==
"u8R")) {
5026 if (
Left.is(TT_TemplateCloser) &&
Left.MatchingParen &&
5027 Left.MatchingParen->Previous &&
5028 Left.MatchingParen->Previous->isOneOf(tok::period, tok::coloncolon)) {
5034 if (
Left.is(TT_TemplateCloser) &&
Right.is(tok::l_square))
5036 if (
Left.is(tok::l_brace) &&
Left.endsSequence(TT_DictLiteral, tok::at)) {
5040 if (
Right.is(tok::r_brace) &&
Right.MatchingParen &&
5041 Right.MatchingParen->endsSequence(TT_DictLiteral, tok::at)) {
5045 if (
Right.is(TT_TrailingAnnotation) &&
Right.isOneOf(tok::amp, tok::ampamp) &&
5046 Left.isOneOf(tok::kw_const, tok::kw_volatile) &&
5047 (!
Right.Next ||
Right.Next->is(tok::semi))) {
5051 return getTokenReferenceAlignment(Right) != FormatStyle::PAS_Left;
5064 return Right.hasWhitespaceBefore();
5066 const bool IsVerilog = Style.isVerilog();
5067 assert(!IsVerilog || !IsCpp);
5070 if (Keywords.isWordLike(Right, IsVerilog) &&
5071 Keywords.isWordLike(Left, IsVerilog)) {
5077 if (
Left.is(tok::star) &&
Right.is(tok::comment))
5080 if (
Left.is(tok::l_brace) &&
Right.is(tok::r_brace) &&
5081 Left.Children.empty()) {
5083 return Style.SpaceInEmptyBraces != FormatStyle::SIEB_Never;
5084 if (Style.Cpp11BracedListStyle != FormatStyle::BLS_Block) {
5085 return Style.SpacesInParens == FormatStyle::SIPO_Custom &&
5086 Style.SpacesInParensOptions.InEmptyParentheses;
5088 return Style.SpaceInEmptyBraces == FormatStyle::SIEB_Always;
5091 const auto *BeforeLeft =
Left.Previous;
5094 if (
Left.is(TT_OverloadedOperator) &&
5095 Right.isOneOf(TT_TemplateOpener, TT_TemplateCloser)) {
5099 if (
Right.is(tok::period) &&
Left.is(tok::numeric_constant))
5103 if (
Left.is(Keywords.kw_import) &&
5104 Right.isOneOf(tok::less, tok::ellipsis) &&
5105 (!BeforeLeft || BeforeLeft->is(tok::kw_export))) {
5109 if (
Left.isOneOf(Keywords.kw_module, Keywords.kw_import) &&
5110 Right.is(TT_ModulePartitionColon)) {
5114 if (
Right.is(TT_AfterPPDirective))
5118 if (
Left.is(tok::identifier) &&
Right.is(TT_ModulePartitionColon))
5121 if (
Left.is(TT_ModulePartitionColon) &&
5122 Right.isOneOf(tok::identifier, tok::kw_private)) {
5125 if (
Left.is(tok::ellipsis) &&
Right.is(tok::identifier) &&
5126 Line.First->is(Keywords.kw_import)) {
5130 if (
Left.isOneOf(TT_AttributeRParen, TT_AttributeMacro) &&
5131 Right.is(tok::coloncolon)) {
5135 if (
Left.is(tok::kw_operator))
5136 return Right.is(tok::coloncolon) || Style.SpaceAfterOperatorKeyword;
5138 !
Left.opensScope() && Style.SpaceBeforeCpp11BracedList) {
5141 if (
Left.is(tok::less) &&
Left.is(TT_OverloadedOperator) &&
5142 Right.is(TT_TemplateOpener)) {
5146 if (
Left.is(tok::identifier) &&
Right.is(tok::numeric_constant))
5147 return Right.TokenText[0] !=
'.';
5149 if (
Left.Tok.getIdentifierInfo() &&
Right.Tok.isLiteral())
5151 }
else if (Style.isProto()) {
5152 if (
Right.is(tok::period) && !(BeforeLeft && BeforeLeft->is(tok::period)) &&
5153 Left.isOneOf(Keywords.kw_optional, Keywords.kw_required,
5154 Keywords.kw_repeated, Keywords.kw_extend)) {
5157 if (
Right.is(tok::l_paren) &&
5158 Left.isOneOf(Keywords.kw_returns, Keywords.kw_option)) {
5161 if (
Right.isOneOf(tok::l_brace, tok::less) &&
Left.is(TT_SelectorName))
5164 if (
Left.is(tok::slash) ||
Right.is(tok::slash))
5166 if (
Left.MatchingParen &&
5167 Left.MatchingParen->is(TT_ProtoExtensionLSquare) &&
5168 Right.isOneOf(tok::l_brace, tok::less)) {
5169 return Style.Cpp11BracedListStyle == FormatStyle::BLS_Block;
5172 if (
Left.is(tok::percent))
5176 if (
Left.is(tok::numeric_constant) &&
Right.is(tok::percent))
5177 return Right.hasWhitespaceBefore();
5178 }
else if (Style.isJson()) {
5179 if (
Right.is(tok::colon) &&
Left.is(tok::string_literal))
5180 return Style.SpaceBeforeJsonColon;
5181 }
else if (Style.isCSharp()) {
5187 if (
Left.is(tok::kw_this) &&
Right.is(tok::l_square))
5191 if (
Left.is(tok::kw_new) &&
Right.is(tok::l_paren))
5195 if (
Right.is(tok::l_brace))
5199 if (
Left.is(tok::l_brace) &&
Right.isNot(tok::r_brace))
5202 if (
Left.isNot(tok::l_brace) &&
Right.is(tok::r_brace))
5206 if (
Left.is(TT_FatArrow) ||
Right.is(TT_FatArrow))
5210 if (
Left.is(TT_AttributeColon) ||
Right.is(TT_AttributeColon))
5214 if (
Left.is(TT_TemplateCloser) &&
Right.is(TT_StartOfName))
5218 if (
Left.is(tok::l_square) ||
Right.is(tok::r_square))
5219 return Style.SpacesInSquareBrackets;
5222 if (
Right.is(TT_CSharpNullable))
5226 if (
Right.is(TT_NonNullAssertion))
5230 if (
Left.is(tok::comma) &&
Right.is(tok::comma))
5234 if (
Left.is(Keywords.kw_var) &&
Right.is(tok::l_paren))
5238 if (
Right.is(tok::l_paren)) {
5239 if (
Left.isOneOf(tok::kw_using, Keywords.kw_async, Keywords.kw_when,
5240 Keywords.kw_lock)) {
5241 return Style.SpaceBeforeParensOptions.AfterControlStatements ||
5242 spaceRequiredBeforeParens(Right);
5248 if ((
Left.isAccessSpecifierKeyword() ||
5249 Left.isOneOf(tok::kw_virtual, tok::kw_extern, tok::kw_static,
5250 Keywords.kw_internal, Keywords.kw_abstract,
5251 Keywords.kw_sealed, Keywords.kw_override,
5252 Keywords.kw_async, Keywords.kw_unsafe)) &&
5253 Right.is(tok::l_paren)) {
5256 }
else if (Style.isJavaScript()) {
5257 if (
Left.is(TT_FatArrow))
5260 if (
Right.is(tok::l_paren) &&
Left.is(Keywords.kw_await) && BeforeLeft &&
5261 BeforeLeft->is(tok::kw_for)) {
5264 if (
Left.is(Keywords.kw_async) &&
Right.is(tok::l_paren) &&
5265 Right.MatchingParen) {
5272 if ((
Left.is(TT_TemplateString) &&
Left.TokenText.ends_with(
"${")) ||
5273 (
Right.is(TT_TemplateString) &&
Right.TokenText.starts_with(
"}"))) {
5278 if (Keywords.isJavaScriptIdentifier(Left,
5280 Right.is(TT_TemplateString)) {
5283 if (
Right.is(tok::star) &&
5284 Left.isOneOf(Keywords.kw_function, Keywords.kw_yield)) {
5287 if (
Right.isOneOf(tok::l_brace, tok::l_square) &&
5288 Left.isOneOf(Keywords.kw_function, Keywords.kw_yield,
5289 Keywords.kw_extends, Keywords.kw_implements)) {
5292 if (
Right.is(tok::l_paren)) {
5294 if (
Line.MustBeDeclaration &&
Left.Tok.getIdentifierInfo())
5298 if (BeforeLeft && BeforeLeft->is(tok::period) &&
5299 Left.Tok.getIdentifierInfo()) {
5303 if (
Left.isOneOf(tok::kw_throw, Keywords.kw_await, Keywords.kw_typeof,
5309 if (
Left.endsSequence(tok::kw_const, Keywords.kw_as))
5311 if ((
Left.isOneOf(Keywords.kw_let, Keywords.kw_var, Keywords.kw_in,
5316 (
Left.is(Keywords.kw_of) && BeforeLeft &&
5317 BeforeLeft->isOneOf(tok::identifier, tok::r_square, tok::r_brace))) &&
5318 (!BeforeLeft || BeforeLeft->isNot(tok::period))) {
5321 if (
Left.isOneOf(tok::kw_for, Keywords.kw_as) && BeforeLeft &&
5322 BeforeLeft->is(tok::period) &&
Right.is(tok::l_paren)) {
5325 if (
Left.is(Keywords.kw_as) &&
5326 Right.isOneOf(tok::l_square, tok::l_brace, tok::l_paren)) {
5329 if (
Left.is(tok::kw_default) && BeforeLeft &&
5330 BeforeLeft->is(tok::kw_export)) {
5333 if (
Left.is(Keywords.kw_is) &&
Right.is(tok::l_brace))
5335 if (
Right.isOneOf(TT_JsTypeColon, TT_JsTypeOptionalQuestion))
5337 if (
Left.is(TT_JsTypeOperator) ||
Right.is(TT_JsTypeOperator))
5339 if ((
Left.is(tok::l_brace) ||
Right.is(tok::r_brace)) &&
5340 Line.First->isOneOf(Keywords.kw_import, tok::kw_export)) {
5343 if (
Left.is(tok::ellipsis))
5345 if (
Left.is(TT_TemplateCloser) &&
5346 Right.isNoneOf(tok::equal, tok::l_brace, tok::comma, tok::l_square,
5347 Keywords.kw_implements, Keywords.kw_extends)) {
5353 if (
Right.is(TT_NonNullAssertion))
5355 if (
Left.is(TT_NonNullAssertion) &&
5356 Right.isOneOf(Keywords.kw_as, Keywords.kw_in)) {
5359 }
else if (Style.isJava()) {
5360 if (
Left.is(TT_CaseLabelArrow) ||
Right.is(TT_CaseLabelArrow))
5362 if (
Left.is(tok::r_square) &&
Right.is(tok::l_brace))
5365 if (
Left.is(tok::l_square) ||
Right.is(tok::r_square))
5366 return Style.SpacesInSquareBrackets;
5368 if (
Left.is(Keywords.kw_synchronized) &&
Right.is(tok::l_paren)) {
5369 return Style.SpaceBeforeParensOptions.AfterControlStatements ||
5370 spaceRequiredBeforeParens(Right);
5372 if ((
Left.isAccessSpecifierKeyword() ||
5373 Left.isOneOf(tok::kw_static, Keywords.kw_final, Keywords.kw_abstract,
5374 Keywords.kw_native)) &&
5375 Right.is(TT_TemplateOpener)) {
5378 }
else if (IsVerilog) {
5380 if (
Left.is(tok::identifier) &&
Left.TokenText[0] ==
'\\')
5384 if ((
Left.is(TT_VerilogTableItem) &&
5385 Right.isNoneOf(tok::r_paren, tok::semi)) ||
5386 (
Right.is(TT_VerilogTableItem) &&
Left.isNot(tok::l_paren))) {
5388 return !(
Next &&
Next->is(tok::r_paren));
5391 if (
Left.isNot(TT_BinaryOperator) &&
5392 Left.isOneOf(Keywords.kw_verilogHash, Keywords.kw_verilogHashHash)) {
5396 if (
Right.isNot(tok::semi) &&
5397 (
Left.endsSequence(tok::numeric_constant, Keywords.kw_verilogHash) ||
5398 Left.endsSequence(tok::numeric_constant,
5399 Keywords.kw_verilogHashHash) ||
5400 (
Left.is(tok::r_paren) &&
Left.MatchingParen &&
5401 Left.MatchingParen->endsSequence(tok::l_paren, tok::at)))) {
5406 if (
Left.is(Keywords.kw_apostrophe) ||
5407 (
Left.is(TT_VerilogNumberBase) &&
Right.is(tok::numeric_constant))) {
5411 if (
Left.is(tok::arrow) ||
Right.is(tok::arrow))
5416 if (
Left.is(tok::at) &&
Right.isOneOf(tok::l_paren, tok::star, tok::at))
5419 if (
Right.is(tok::l_square) &&
5420 Left.isOneOf(TT_VerilogDimensionedTypeName, Keywords.kw_function)) {
5424 if (
Right.isOneOf(tok::period, Keywords.kw_apostrophe) &&
5425 Keywords.isVerilogIdentifier(Left) &&
Left.getPreviousNonComment() &&
5426 Left.getPreviousNonComment()->is(Keywords.kw_tagged)) {
5432 if ((
Right.is(Keywords.kw_apostrophe) ||
5434 Left.isNoneOf(Keywords.kw_assign, Keywords.kw_unique) &&
5435 !Keywords.isVerilogWordOperator(Left) &&
5436 (
Left.isOneOf(tok::r_square, tok::r_paren, tok::r_brace,
5437 tok::numeric_constant) ||
5438 Keywords.isWordLike(Left))) {
5442 if ((
Right.is(tok::star) &&
Left.is(tok::coloncolon)) ||
5443 (
Left.is(tok::star) &&
Right.is(tok::semi))) {
5447 if (
Left.endsSequence(tok::star, tok::l_paren) &&
Right.is(tok::identifier))
5450 if (
Right.is(tok::l_paren) &&
Right.is(TT_VerilogStrength))
5453 if ((
Left.is(tok::l_brace) &&
5454 Right.isOneOf(tok::lessless, tok::greatergreater)) ||
5455 (
Left.endsSequence(tok::lessless, tok::l_brace) ||
5456 Left.endsSequence(tok::greatergreater, tok::l_brace))) {
5459 }
else if (Style.isTableGen()) {
5461 if (
Left.is(tok::l_square) &&
Right.is(tok::l_brace))
5463 if (
Left.is(tok::r_brace) &&
Right.is(tok::r_square))
5466 if (
Right.isOneOf(TT_TableGenDAGArgListColon,
5467 TT_TableGenDAGArgListColonToAlign) ||
5468 Left.isOneOf(TT_TableGenDAGArgListColon,
5469 TT_TableGenDAGArgListColonToAlign)) {
5472 if (
Right.is(TT_TableGenCondOperatorColon))
5474 if (
Left.isOneOf(TT_TableGenDAGArgOperatorID,
5475 TT_TableGenDAGArgOperatorToBreak) &&
5476 Right.isNot(TT_TableGenDAGArgCloser)) {
5480 if (
Right.isOneOf(tok::l_paren, tok::less) &&
5481 Left.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator)) {
5486 if (
Left.is(TT_TableGenTrailingPasteOperator) &&
5487 Right.isOneOf(tok::l_brace, tok::colon)) {
5491 if (
Left.is(tok::hash) ||
Right.is(tok::hash))
5494 if (Keywords.isTableGenDefinition(Left))
5498 if (
Left.is(TT_ImplicitStringLiteral))
5499 return Right.hasWhitespaceBefore();
5501 if (
Left.is(TT_ObjCMethodSpecifier))
5502 return Style.ObjCSpaceAfterMethodDeclarationPrefix;
5503 if (
Left.is(tok::r_paren) &&
Left.isNot(TT_AttributeRParen) &&
5504 canBeObjCSelectorComponent(Right)) {
5512 (
Right.is(tok::equal) ||
Left.is(tok::equal))) {
5516 if (
Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow) ||
5517 Left.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow)) {
5520 if (
Left.is(tok::comma) &&
Right.isNot(TT_OverloadedOperatorLParen) &&
5523 (
Left.Children.empty() || !
Left.MacroParent)) {
5526 if (
Right.is(tok::comma))
5528 if (
Right.is(TT_ObjCBlockLParen))
5530 if (
Right.is(TT_CtorInitializerColon))
5531 return Style.SpaceBeforeCtorInitializerColon;
5532 if (
Right.is(TT_InheritanceColon) && !Style.SpaceBeforeInheritanceColon)
5534 if (
Right.is(TT_RangeBasedForLoopColon) &&
5535 !Style.SpaceBeforeRangeBasedForLoopColon) {
5538 if (
Left.is(TT_BitFieldColon)) {
5539 return Style.BitFieldColonSpacing == FormatStyle::BFCS_Both ||
5540 Style.BitFieldColonSpacing == FormatStyle::BFCS_After;
5542 if (
Right.is(tok::colon)) {
5543 if (
Right.is(TT_CaseLabelColon))
5544 return Style.SpaceBeforeCaseColon;
5545 if (
Right.is(TT_GotoLabelColon))
5548 if (!
Right.getNextNonComment())
5550 if (
Right.isOneOf(TT_ObjCSelector, TT_ObjCMethodExpr))
5552 if (
Left.is(tok::question))
5554 if (
Right.is(TT_InlineASMColon) &&
Left.is(tok::coloncolon))
5556 if (
Right.is(TT_DictLiteral))
5557 return Style.SpacesInContainerLiterals;
5558 if (
Right.is(TT_AttributeColon))
5560 if (
Right.is(TT_CSharpNamedArgumentColon))
5562 if (
Right.is(TT_GenericSelectionColon))
5564 if (
Right.is(TT_BitFieldColon)) {
5565 return Style.BitFieldColonSpacing == FormatStyle::BFCS_Both ||
5566 Style.BitFieldColonSpacing == FormatStyle::BFCS_Before;
5571 if ((
Left.isOneOf(tok::minus, tok::minusminus) &&
5572 Right.isOneOf(tok::minus, tok::minusminus)) ||
5573 (
Left.isOneOf(tok::plus, tok::plusplus) &&
5574 Right.isOneOf(tok::plus, tok::plusplus))) {
5577 if (
Left.is(TT_UnaryOperator)) {
5580 if (
Left.is(tok::amp) &&
Right.is(tok::r_square))
5581 return Style.SpacesInSquareBrackets;
5582 if (
Left.isNot(tok::exclaim))
5584 if (
Left.TokenText ==
"!")
5585 return Style.SpaceAfterLogicalNot;
5586 assert(
Left.TokenText ==
"not");
5587 return Right.isOneOf(tok::coloncolon, TT_UnaryOperator) ||
5588 (
Right.is(tok::l_paren) && Style.SpaceBeforeParensOptions.AfterNot);
5593 if (
Left.is(TT_CastRParen)) {
5594 return Style.SpaceAfterCStyleCast ||
5595 Right.isOneOf(TT_BinaryOperator, TT_SelectorName);
5598 auto ShouldAddSpacesInAngles = [
this, &
Right]() {
5599 if (this->Style.SpacesInAngles == FormatStyle::SIAS_Always)
5601 if (this->Style.SpacesInAngles == FormatStyle::SIAS_Leave)
5602 return Right.hasWhitespaceBefore();
5606 if (
Left.is(tok::greater) &&
Right.is(tok::greater)) {
5607 if (Style.isTextProto() ||
5608 (Style.Language == FormatStyle::LK_Proto &&
Left.is(TT_DictLiteral))) {
5609 return Style.Cpp11BracedListStyle == FormatStyle::BLS_Block;
5611 return Right.is(TT_TemplateCloser) &&
Left.is(TT_TemplateCloser) &&
5612 ((Style.Standard < FormatStyle::LS_Cpp11) ||
5613 ShouldAddSpacesInAngles());
5615 if (
Right.isOneOf(tok::arrow, tok::arrowstar, tok::periodstar) ||
5616 Left.isOneOf(tok::arrow, tok::period, tok::arrowstar, tok::periodstar) ||
5617 (
Right.is(tok::period) &&
Right.isNot(TT_DesignatedInitializerPeriod))) {
5620 if (!Style.SpaceBeforeAssignmentOperators &&
Left.isNot(TT_TemplateCloser) &&
5624 if (Style.isJava() &&
Right.is(tok::coloncolon) &&
5625 Left.isOneOf(tok::identifier, tok::kw_this)) {
5628 if (
Right.is(tok::coloncolon) &&
Left.is(tok::identifier)) {
5632 return Right.hasWhitespaceBefore();
5634 if (
Right.is(tok::coloncolon) &&
5635 Left.isNoneOf(tok::l_brace, tok::comment, tok::l_paren)) {
5637 return (
Left.is(TT_TemplateOpener) &&
5638 ((Style.Standard < FormatStyle::LS_Cpp11) ||
5639 ShouldAddSpacesInAngles())) ||
5640 Left.isNoneOf(tok::l_paren, tok::r_paren, tok::l_square,
5641 tok::kw___super, TT_TemplateOpener,
5642 TT_TemplateCloser) ||
5643 (
Left.is(tok::l_paren) && Style.SpacesInParensOptions.Other);
5645 if ((
Left.is(TT_TemplateOpener)) != (
Right.is(TT_TemplateCloser)))
5646 return ShouldAddSpacesInAngles();
5647 if (
Left.is(tok::r_paren) &&
Left.isNot(TT_TypeDeclarationParen) &&
5648 Right.is(TT_PointerOrReference) &&
Right.isOneOf(tok::amp, tok::ampamp)) {
5652 if (
Right.is(TT_StructuredBindingLSquare)) {
5653 return Left.isNoneOf(tok::amp, tok::ampamp) ||
5654 getTokenReferenceAlignment(Left) != FormatStyle::PAS_Right;
5657 if (
Right.Next &&
Right.Next->is(TT_StructuredBindingLSquare) &&
5658 Right.isOneOf(tok::amp, tok::ampamp)) {
5659 return getTokenReferenceAlignment(Right) != FormatStyle::PAS_Left;
5661 if ((
Right.is(TT_BinaryOperator) &&
Left.isNot(tok::l_paren)) ||
5662 (
Left.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) &&
5663 Right.isNot(tok::r_paren))) {
5666 if (
Right.is(TT_TemplateOpener) &&
Left.is(tok::r_paren) &&
5667 Left.MatchingParen &&
5668 Left.MatchingParen->is(TT_OverloadedOperatorLParen)) {
5671 if (
Right.is(tok::less) &&
Left.isNot(tok::l_paren) &&
5675 if (
Right.is(TT_TrailingUnaryOperator))
5677 if (
Left.is(TT_RegexLiteral))
5679 return spaceRequiredBetween(
Line, Left, Right);
5685 Tok.isNoneOf(TT_ObjCBlockLBrace, TT_LambdaLBrace, TT_DictLiteral);
5690 return Tok.MatchingParen &&
Tok.MatchingParen->Next &&
5691 Tok.MatchingParen->Next->isOneOf(tok::comma, tok::r_paren,
5697 FormatStyle::ShortLambdaStyle ShortLambdaOption) {
5698 return Tok.Children.empty() && ShortLambdaOption != FormatStyle::SLS_None;
5703 Tok.isNoneOf(TT_ObjCBlockLBrace, TT_DictLiteral);
5706bool TokenAnnotator::mustBreakBefore(
const AnnotatedLine &
Line,
5708 if (Right.NewlinesBefore > 1 && Style.MaxEmptyLinesToKeep > 0 &&
5709 (!Style.RemoveEmptyLinesInUnwrappedLines || &Right ==
Line.First)) {
5715 if (Style.BreakFunctionDefinitionParameters &&
Line.MightBeFunctionDecl &&
5716 Line.mightBeFunctionDefinition() && Left.MightBeFunctionDeclParen &&
5717 Left.ParameterCount > 0) {
5723 if (Style.BinPackParameters == FormatStyle::BPPS_AlwaysOnePerLine &&
5724 Line.MightBeFunctionDecl && !
Left.opensScope() &&
5729 const auto *BeforeLeft =
Left.Previous;
5730 const auto *AfterRight =
Right.Next;
5732 if (Style.isCSharp()) {
5733 if (
Left.is(TT_FatArrow) &&
Right.is(tok::l_brace) &&
5734 Style.BraceWrapping.AfterFunction) {
5737 if (
Right.is(TT_CSharpNamedArgumentColon) ||
5738 Left.is(TT_CSharpNamedArgumentColon)) {
5741 if (
Right.is(TT_CSharpGenericTypeConstraint))
5743 if (AfterRight && AfterRight->is(TT_FatArrow) &&
5744 (
Right.is(tok::numeric_constant) ||
5745 (
Right.is(tok::identifier) &&
Right.TokenText ==
"_"))) {
5750 if (
Left.is(TT_AttributeRSquare) &&
5751 (
Right.isAccessSpecifier(
false) ||
5752 Right.is(Keywords.kw_internal))) {
5756 if (
Left.is(TT_AttributeRSquare) &&
Right.is(TT_AttributeLSquare))
5758 }
else if (Style.isJavaScript()) {
5760 if (
Right.is(tok::string_literal) &&
Left.is(tok::plus) && BeforeLeft &&
5761 BeforeLeft->is(tok::string_literal)) {
5764 if (
Left.is(TT_DictLiteral) &&
Left.is(tok::l_brace) &&
Line.Level == 0 &&
5765 BeforeLeft && BeforeLeft->is(tok::equal) &&
5766 Line.First->isOneOf(tok::identifier, Keywords.kw_import, tok::kw_export,
5770 Line.First->isNoneOf(Keywords.kw_var, Keywords.kw_let)) {
5775 if (
Left.is(tok::l_brace) &&
Line.Level == 0 &&
5776 (
Line.startsWith(tok::kw_enum) ||
5777 Line.startsWith(tok::kw_const, tok::kw_enum) ||
5778 Line.startsWith(tok::kw_export, tok::kw_enum) ||
5779 Line.startsWith(tok::kw_export, tok::kw_const, tok::kw_enum))) {
5784 if (
Right.is(tok::r_brace) &&
Left.is(tok::l_brace) && BeforeLeft &&
5785 BeforeLeft->is(TT_FatArrow)) {
5787 switch (Style.AllowShortLambdasOnASingleLine) {
5788 case FormatStyle::SLS_All:
5790 case FormatStyle::SLS_None:
5792 case FormatStyle::SLS_Empty:
5793 return !
Left.Children.empty();
5794 case FormatStyle::SLS_Inline:
5797 return (
Left.NestingLevel == 0 &&
Line.Level == 0) &&
5798 !
Left.Children.empty();
5800 llvm_unreachable(
"Unknown FormatStyle::ShortLambdaStyle enum");
5803 if (
Right.is(tok::r_brace) &&
Left.is(tok::l_brace) &&
5804 !
Left.Children.empty()) {
5806 return Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_None ||
5807 Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_Empty ||
5808 (
Left.NestingLevel == 0 &&
Line.Level == 0 &&
5809 Style.AllowShortFunctionsOnASingleLine &
5810 FormatStyle::SFS_InlineOnly);
5812 }
else if (Style.isJava()) {
5813 if (
Right.is(tok::plus) &&
Left.is(tok::string_literal) && AfterRight &&
5814 AfterRight->is(tok::string_literal)) {
5817 }
else if (Style.isVerilog()) {
5819 if (
Left.is(TT_VerilogAssignComma))
5822 if (
Left.is(TT_VerilogTypeComma))
5826 if (Style.VerilogBreakBetweenInstancePorts &&
5827 (
Left.is(TT_VerilogInstancePortComma) ||
5828 (
Left.is(tok::r_paren) && Keywords.isVerilogIdentifier(Right) &&
5829 Left.MatchingParen &&
5830 Left.MatchingParen->is(TT_VerilogInstancePortLParen)))) {
5835 if (!Keywords.isVerilogBegin(Right) && Keywords.isVerilogEndOfLabel(Left))
5837 }
else if (Style.BreakAdjacentStringLiterals &&
5838 (IsCpp || Style.isProto() || Style.isTableGen())) {
5839 if (
Left.isStringLiteral() &&
Right.isStringLiteral())
5844 if (Style.isJson()) {
5848 if (
Left.is(TT_DictLiteral) &&
Left.is(tok::l_brace))
5851 if ((
Left.is(TT_ArrayInitializerLSquare) &&
Left.is(tok::l_square) &&
5852 Right.isNot(tok::r_square)) ||
5853 Left.is(tok::comma)) {
5854 if (
Right.is(tok::l_brace))
5859 if (
Tok->isOneOf(tok::l_brace, tok::l_square))
5861 if (
Tok->isOneOf(tok::r_brace, tok::r_square))
5864 return Style.BreakArrays;
5866 }
else if (Style.isTableGen()) {
5870 if (
Left.is(TT_TableGenCondOperatorComma))
5872 if (
Left.is(TT_TableGenDAGArgOperatorToBreak) &&
5873 Right.isNot(TT_TableGenDAGArgCloser)) {
5876 if (
Left.is(TT_TableGenDAGArgListCommaToBreak))
5878 if (
Right.is(TT_TableGenDAGArgCloser) &&
Right.MatchingParen &&
5879 Right.MatchingParen->is(TT_TableGenDAGArgOpenerToBreak) &&
5880 &Left !=
Right.MatchingParen->Next) {
5882 return Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakAll;
5886 if (
Line.startsWith(tok::kw_asm) &&
Right.is(TT_InlineASMColon) &&
5887 Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_Always) {
5897 if ((
Left.isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
5898 (Style.isJavaScript() &&
Left.is(tok::l_paren))) &&
5900 BeforeClosingBrace =
Left.MatchingParen->Previous;
5901 }
else if (
Right.MatchingParen &&
5902 (
Right.MatchingParen->isOneOf(tok::l_brace,
5903 TT_ArrayInitializerLSquare) ||
5904 (Style.isJavaScript() &&
5905 Right.MatchingParen->is(tok::l_paren)))) {
5906 BeforeClosingBrace = &
Left;
5908 if (BeforeClosingBrace && (BeforeClosingBrace->is(tok::comma) ||
5909 BeforeClosingBrace->isTrailingComment())) {
5914 if (
Right.is(tok::comment)) {
5916 Right.NewlinesBefore > 0 &&
Right.HasUnescapedNewline;
5918 if (
Left.isTrailingComment())
5920 if (
Left.IsUnterminatedLiteral)
5923 if (BeforeLeft && BeforeLeft->is(tok::lessless) &&
5924 Left.is(tok::string_literal) &&
Right.is(tok::lessless) && AfterRight &&
5925 AfterRight->is(tok::string_literal)) {
5926 return Right.NewlinesBefore > 0;
5929 if (
Right.is(TT_RequiresClause)) {
5930 switch (Style.RequiresClausePosition) {
5931 case FormatStyle::RCPS_OwnLine:
5932 case FormatStyle::RCPS_OwnLineWithBrace:
5933 case FormatStyle::RCPS_WithFollowing:
5940 if (
Left.ClosesTemplateDeclaration &&
Left.MatchingParen &&
5941 Left.MatchingParen->NestingLevel == 0) {
5945 if (
Right.is(tok::kw_concept))
5946 return Style.BreakBeforeConceptDeclarations == FormatStyle::BBCDS_Always;
5947 return Style.BreakTemplateDeclarations == FormatStyle::BTDS_Yes ||
5948 (Style.BreakTemplateDeclarations == FormatStyle::BTDS_Leave &&
5949 Right.NewlinesBefore > 0);
5951 if (
Left.ClosesRequiresClause) {
5952 switch (Style.RequiresClausePosition) {
5953 case FormatStyle::RCPS_OwnLine:
5954 case FormatStyle::RCPS_WithPreceding:
5955 return Right.isNot(tok::semi);
5956 case FormatStyle::RCPS_OwnLineWithBrace:
5957 return Right.isNoneOf(tok::semi, tok::l_brace);
5962 if (Style.PackConstructorInitializers == FormatStyle::PCIS_Never) {
5963 if (Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeColon &&
5964 (
Left.is(TT_CtorInitializerComma) ||
5965 Right.is(TT_CtorInitializerColon))) {
5969 if (Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon &&
5970 Left.isOneOf(TT_CtorInitializerColon, TT_CtorInitializerComma)) {
5974 if (Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterComma &&
5975 Left.is(TT_CtorInitializerComma)) {
5979 if (Style.PackConstructorInitializers < FormatStyle::PCIS_CurrentLine &&
5980 Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma &&
5981 Right.isOneOf(TT_CtorInitializerComma, TT_CtorInitializerColon)) {
5984 if (Style.PackConstructorInitializers == FormatStyle::PCIS_NextLineOnly) {
5985 if ((Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeColon ||
5986 Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) &&
5987 Right.is(TT_CtorInitializerColon)) {
5991 if (Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon &&
5992 Left.is(TT_CtorInitializerColon)) {
5997 if (Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma &&
5998 Right.is(TT_InheritanceComma)) {
6001 if (Style.BreakInheritanceList == FormatStyle::BILS_AfterComma &&
6002 Left.is(TT_InheritanceComma)) {
6005 if (
Right.is(tok::string_literal) &&
Right.TokenText.starts_with(
"R\"")) {
6009 return Right.IsMultiline &&
Right.NewlinesBefore > 0;
6011 if ((
Left.is(tok::l_brace) ||
6012 (
Left.is(tok::less) && BeforeLeft && BeforeLeft->is(tok::equal))) &&
6013 Right.NestingLevel == 1 && Style.Language == FormatStyle::LK_Proto) {
6018 if (
Right.is(TT_InlineASMBrace))
6019 return Right.HasUnescapedNewline;
6022 auto *FirstNonComment =
Line.getFirstNonComment();
6024 FirstNonComment && (FirstNonComment->is(Keywords.kw_internal) ||
6025 FirstNonComment->isAccessSpecifierKeyword());
6027 if (Style.BraceWrapping.AfterEnum) {
6028 if (
Line.startsWith(tok::kw_enum) ||
6029 Line.startsWith(tok::kw_typedef, tok::kw_enum)) {
6034 FirstNonComment->Next->is(tok::kw_enum)) {
6040 if (Style.BraceWrapping.AfterClass &&
6042 FirstNonComment->Next->is(Keywords.kw_interface)) ||
6043 Line.startsWith(Keywords.kw_interface))) {
6048 if (
Right.isNot(TT_FunctionLBrace)) {
6049 return (
Line.startsWith(tok::kw_class) &&
6050 Style.BraceWrapping.AfterClass) ||
6051 (
Line.startsWith(tok::kw_struct) &&
6052 Style.BraceWrapping.AfterStruct);
6056 if (
Left.is(TT_ObjCBlockLBrace) &&
6057 Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never) {
6062 if (
Left.isOneOf(TT_AttributeRParen, TT_AttributeMacro) &&
6063 Right.is(TT_ObjCDecl)) {
6067 if (
Left.is(TT_LambdaLBrace)) {
6069 Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_Inline) {
6073 if (Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_None ||
6074 Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_Inline ||
6075 (!
Left.Children.empty() &&
6076 Style.AllowShortLambdasOnASingleLine == FormatStyle::SLS_Empty)) {
6081 if (Style.BraceWrapping.BeforeLambdaBody &&
Right.is(TT_LambdaLBrace) &&
6082 (
Left.isPointerOrReference() ||
Left.is(TT_TemplateCloser))) {
6087 if ((Style.isJava() || Style.isJavaScript()) &&
6088 Left.is(TT_LeadingJavaAnnotation) &&
6089 Right.isNoneOf(TT_LeadingJavaAnnotation, tok::l_paren) &&
6090 (
Line.Last->is(tok::l_brace) || Style.BreakAfterJavaFieldAnnotations)) {
6094 if (
Right.is(TT_ProtoExtensionLSquare))
6124 if (Style.isProto() &&
Right.is(TT_SelectorName) &&
6125 Right.isNot(tok::r_square) && AfterRight) {
6128 if (
Left.is(tok::at))
6134 const auto *LBrace = AfterRight;
6135 if (LBrace && LBrace->is(tok::colon)) {
6136 LBrace = LBrace->Next;
6137 if (LBrace && LBrace->is(tok::at)) {
6138 LBrace = LBrace->Next;
6140 LBrace = LBrace->Next;
6152 ((LBrace->is(tok::l_brace) &&
6153 (LBrace->is(TT_DictLiteral) ||
6154 (LBrace->Next && LBrace->Next->is(tok::r_brace)))) ||
6155 LBrace->isOneOf(TT_ArrayInitializerLSquare, tok::less))) {
6162 if (
Left.ParameterCount == 0)
6177 if (
Left.isOneOf(tok::r_brace, tok::greater, tok::r_square))
6188 if (Style.isCSharp()) {
6189 if (
Left.isOneOf(TT_CSharpNamedArgumentColon, TT_AttributeColon) ||
6190 Right.isOneOf(TT_CSharpNamedArgumentColon, TT_AttributeColon)) {
6194 if (
Line.First->is(TT_CSharpGenericTypeConstraint))
6195 return Left.is(TT_CSharpGenericTypeConstraintComma);
6197 if (
Right.is(TT_CSharpNullable))
6199 }
else if (Style.isJava()) {
6200 if (
Left.isOneOf(Keywords.kw_throws, Keywords.kw_extends,
6201 Keywords.kw_implements)) {
6204 if (
Right.isOneOf(Keywords.kw_throws, Keywords.kw_extends,
6205 Keywords.kw_implements)) {
6208 }
else if (Style.isJavaScript()) {
6211 (NonComment->isAccessSpecifierKeyword() ||
6212 NonComment->isOneOf(
6213 tok::kw_return, Keywords.kw_yield, tok::kw_continue, tok::kw_break,
6214 tok::kw_throw, Keywords.kw_interface, Keywords.kw_type,
6215 tok::kw_static, Keywords.kw_readonly, Keywords.kw_override,
6216 Keywords.kw_abstract, Keywords.kw_get, Keywords.kw_set,
6217 Keywords.kw_async, Keywords.kw_await))) {
6220 if (
Right.NestingLevel == 0 &&
6221 (
Left.Tok.getIdentifierInfo() ||
6222 Left.isOneOf(tok::r_square, tok::r_paren)) &&
6223 Right.isOneOf(tok::l_square, tok::l_paren)) {
6226 if (NonComment && NonComment->is(tok::identifier) &&
6227 NonComment->TokenText ==
"asserts") {
6230 if (
Left.is(TT_FatArrow) &&
Right.is(tok::l_brace))
6232 if (
Left.is(TT_JsTypeColon))
6235 if (
Left.is(tok::exclaim) &&
Right.is(tok::colon))
6240 if (
Right.is(Keywords.kw_is)) {
6249 if (!
Next ||
Next->isNot(tok::colon))
6252 if (
Left.is(Keywords.kw_in))
6253 return Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None;
6254 if (
Right.is(Keywords.kw_in))
6255 return Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None;
6256 if (
Right.is(Keywords.kw_as))
6258 if (
Right.isOneOf(Keywords.kw_extends, Keywords.kw_infer)) {
6264 if (
Left.is(Keywords.kw_as))
6266 if (
Left.is(TT_NonNullAssertion))
6268 if (
Left.is(Keywords.kw_declare) &&
6269 Right.isOneOf(Keywords.kw_module, tok::kw_namespace,
6270 Keywords.kw_function, tok::kw_class, tok::kw_enum,
6271 Keywords.kw_interface, Keywords.kw_type, Keywords.kw_var,
6272 Keywords.kw_let, tok::kw_const)) {
6277 if (
Left.isOneOf(Keywords.kw_module, tok::kw_namespace) &&
6278 Right.isOneOf(tok::identifier, tok::string_literal)) {
6281 if (
Right.is(TT_TemplateString) &&
Right.closesScope())
6285 if (
Left.is(tok::identifier) &&
Right.is(TT_TemplateString))
6287 if (
Left.is(TT_TemplateString) &&
Left.opensScope())
6289 }
else if (Style.isTableGen()) {
6291 if (Keywords.isTableGenDefinition(Left))
6294 if (
Right.is(tok::l_paren)) {
6295 return Left.isNoneOf(TT_TableGenBangOperator, TT_TableGenCondOperator,
6299 if (
Left.is(TT_TableGenValueSuffix))
6302 if (
Left.is(tok::hash) ||
Right.is(tok::hash))
6304 if (
Left.isOneOf(TT_TableGenBangOperator, TT_TableGenCondOperator))
6311 if (
Right.is(tok::r_brace)) {
6313 (
Right.isBlockIndentedInitRBrace(Style)));
6318 if (
Right.is(tok::r_paren)) {
6319 if (!
Right.MatchingParen)
6322 if (
Next &&
Next->is(tok::r_paren))
6324 if (
Next &&
Next->is(tok::l_paren))
6330 return Style.BreakBeforeCloseBracketIf;
6332 return Style.BreakBeforeCloseBracketLoop;
6334 return Style.BreakBeforeCloseBracketSwitch;
6335 return Style.BreakBeforeCloseBracketFunction;
6338 if (
Left.isOneOf(tok::r_paren, TT_TrailingAnnotation) &&
6339 Right.is(TT_TrailingAnnotation) &&
6340 Style.BreakBeforeCloseBracketFunction) {
6344 if (
Right.is(TT_TemplateCloser))
6345 return Style.BreakBeforeTemplateCloser;
6347 if (
Left.isOneOf(tok::at, tok::objc_interface))
6349 if (
Left.isOneOf(TT_JavaAnnotation, TT_LeadingJavaAnnotation))
6350 return Right.isNot(tok::l_paren);
6351 if (
Right.is(TT_PointerOrReference)) {
6352 return Line.IsMultiVariableDeclStmt ||
6353 (getTokenPointerOrReferenceAlignment(Right) ==
6354 FormatStyle::PAS_Right &&
6356 Right.Next->isOneOf(TT_FunctionDeclarationName, tok::kw_const)));
6358 if (
Right.isOneOf(TT_StartOfName, TT_FunctionDeclarationName,
6359 TT_ClassHeadName, TT_QtProperty, tok::kw_operator)) {
6362 if (
Left.is(TT_PointerOrReference))
6364 if (
Right.isTrailingComment()) {
6371 (
Left.is(TT_CtorInitializerColon) &&
Right.NewlinesBefore > 0 &&
6372 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon);
6374 if (
Left.is(tok::question) &&
Right.is(tok::colon))
6376 if (
Right.isOneOf(TT_ConditionalExpr, tok::question))
6377 return Style.BreakBeforeTernaryOperators;
6378 if (
Left.isOneOf(TT_ConditionalExpr, tok::question))
6379 return !Style.BreakBeforeTernaryOperators;
6380 if (
Left.is(TT_InheritanceColon))
6381 return Style.BreakInheritanceList == FormatStyle::BILS_AfterColon;
6382 if (
Right.is(TT_InheritanceColon))
6383 return Style.BreakInheritanceList != FormatStyle::BILS_AfterColon;
6385 if (
Right.is(TT_ObjCMethodExpr) &&
Right.isNot(tok::r_square) &&
6386 Left.isNot(TT_SelectorName)) {
6390 if (
Right.is(tok::colon) &&
6391 Right.isNoneOf(TT_CtorInitializerColon, TT_InlineASMColon,
6392 TT_BitFieldColon)) {
6395 if (
Left.is(tok::colon) &&
Left.isOneOf(TT_ObjCSelector, TT_ObjCMethodExpr))
6397 if (
Left.is(tok::colon) &&
Left.is(TT_DictLiteral)) {
6398 if (Style.isProto()) {
6399 if (!Style.AlwaysBreakBeforeMultilineStrings &&
Right.isStringLiteral())
6425 if ((
Right.isOneOf(tok::l_brace, tok::less) &&
6426 Right.is(TT_DictLiteral)) ||
6427 Right.is(TT_ArrayInitializerLSquare)) {
6433 if (
Right.is(tok::r_square) &&
Right.MatchingParen &&
6434 Right.MatchingParen->is(TT_ProtoExtensionLSquare)) {
6437 if (
Right.is(TT_SelectorName) || (
Right.is(tok::identifier) &&
Right.Next &&
6438 Right.Next->is(TT_ObjCMethodExpr))) {
6439 return Left.isNot(tok::period);
6443 if (
Right.is(tok::kw_concept))
6444 return Style.BreakBeforeConceptDeclarations != FormatStyle::BBCDS_Never;
6445 if (
Right.is(TT_RequiresClause))
6447 if (
Left.ClosesTemplateDeclaration) {
6448 return Style.BreakTemplateDeclarations != FormatStyle::BTDS_Leave ||
6449 Right.NewlinesBefore > 0;
6451 if (
Left.is(TT_FunctionAnnotationRParen))
6453 if (
Left.ClosesRequiresClause)
6455 if (
Right.isOneOf(TT_RangeBasedForLoopColon, TT_OverloadedOperatorLParen,
6456 TT_OverloadedOperator)) {
6459 if (
Left.is(TT_RangeBasedForLoopColon))
6461 if (
Right.is(TT_RangeBasedForLoopColon))
6463 if (
Left.is(TT_TemplateCloser) &&
Right.is(TT_TemplateOpener))
6465 if ((
Left.is(tok::greater) &&
Right.is(tok::greater)) ||
6466 (
Left.is(tok::less) &&
Right.is(tok::less))) {
6469 if (
Right.is(TT_BinaryOperator) &&
6470 Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None &&
6471 (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_All ||
6475 if (
Left.isOneOf(TT_TemplateCloser, TT_UnaryOperator, tok::kw_operator))
6477 if (
Left.is(tok::equal) &&
Right.isNoneOf(tok::kw_default, tok::kw_delete) &&
6481 if (
Left.is(tok::equal) &&
Right.is(tok::l_brace) &&
6482 Style.Cpp11BracedListStyle == FormatStyle::BLS_Block) {
6485 if (
Left.is(TT_AttributeLParen) ||
6486 (
Left.is(tok::l_paren) &&
Left.is(TT_TypeDeclarationParen))) {
6489 if (
Left.is(tok::l_paren) &&
Left.Previous &&
6490 (
Left.Previous->isOneOf(TT_BinaryOperator, TT_CastRParen))) {
6493 if (
Right.is(TT_ImplicitStringLiteral))
6496 if (
Right.is(tok::r_square) &&
Right.MatchingParen &&
6497 Right.MatchingParen->is(TT_LambdaLSquare)) {
6503 if (
Left.is(TT_TrailingAnnotation)) {
6504 return Right.isNoneOf(tok::l_brace, tok::semi, tok::equal, tok::l_paren,
6505 tok::less, tok::coloncolon);
6508 if (
Right.isAttribute())
6511 if (
Right.is(TT_AttributeLSquare)) {
6512 assert(
Left.isNot(tok::l_square));
6516 if (
Left.is(tok::identifier) &&
Right.is(tok::string_literal))
6519 if (
Right.is(tok::identifier) &&
Right.Next &&
Right.Next->is(TT_DictLiteral))
6522 if (
Left.is(TT_CtorInitializerColon)) {
6523 return (Style.BreakConstructorInitializers ==
6524 FormatStyle::BCIS_AfterColon ||
6525 Style.BreakConstructorInitializers ==
6526 FormatStyle::BCIS_AfterComma) &&
6527 (!
Right.isTrailingComment() ||
Right.NewlinesBefore > 0);
6529 if (
Right.is(TT_CtorInitializerColon)) {
6530 return Style.BreakConstructorInitializers != FormatStyle::BCIS_AfterColon &&
6531 Style.BreakConstructorInitializers != FormatStyle::BCIS_AfterComma;
6533 if (
Left.is(TT_CtorInitializerComma) &&
6534 Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) {
6537 if (
Right.is(TT_CtorInitializerComma) &&
6538 Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) {
6541 if (
Left.is(TT_InheritanceComma) &&
6542 Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma) {
6545 if (
Right.is(TT_InheritanceComma) &&
6546 Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma) {
6549 if (
Left.is(TT_ArrayInitializerLSquare))
6551 if (
Right.is(tok::kw_typename) &&
Left.isNot(tok::kw_const))
6553 if ((
Left.isBinaryOperator() ||
Left.is(TT_BinaryOperator)) &&
6554 Left.isNoneOf(tok::arrowstar, tok::lessless) &&
6555 Style.BreakBeforeBinaryOperators != FormatStyle::BOS_All &&
6556 (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None ||
6560 if (
Left.is(TT_AttributeLSquare) &&
Right.is(tok::l_square)) {
6561 assert(
Right.isNot(TT_AttributeLSquare));
6564 if (
Left.is(tok::r_square) &&
Right.is(TT_AttributeRSquare)) {
6565 assert(
Left.isNot(TT_AttributeRSquare));
6569 auto ShortLambdaOption = Style.AllowShortLambdasOnASingleLine;
6570 if (Style.BraceWrapping.BeforeLambdaBody &&
Right.is(TT_LambdaLBrace)) {
6577 if (
Right.is(tok::kw_noexcept) &&
Right.is(TT_TrailingAnnotation)) {
6578 switch (Style.AllowBreakBeforeNoexceptSpecifier) {
6579 case FormatStyle::BBNSS_Never:
6581 case FormatStyle::BBNSS_Always:
6583 case FormatStyle::BBNSS_OnlyWithParen:
6584 return Right.Next &&
Right.Next->is(tok::l_paren);
6588 return Left.isOneOf(tok::comma, tok::coloncolon, tok::semi, tok::l_brace,
6589 tok::kw_class, tok::kw_struct, tok::comment) ||
6590 Right.isMemberAccess() ||
6591 Right.isOneOf(TT_TrailingReturnArrow, TT_LambdaArrow, tok::lessless,
6592 tok::colon, tok::l_square, tok::at) ||
6593 (
Left.is(tok::r_paren) &&
6594 Right.isOneOf(tok::identifier, tok::kw_const)) ||
6595 (
Left.is(tok::l_paren) &&
Right.isNot(tok::r_paren)) ||
6596 (
Left.is(TT_TemplateOpener) &&
Right.isNot(TT_TemplateCloser));
6600 llvm::errs() <<
"AnnotatedTokens(L=" <<
Line.Level <<
", P=" <<
Line.PPLevel
6601 <<
", T=" <<
Line.Type <<
", C=" <<
Line.IsContinuation
6605 llvm::errs() <<
" I=" <<
Tok->IndentLevel <<
" M=" <<
Tok->MustBreakBefore
6606 <<
" C=" <<
Tok->CanBreakBefore
6608 <<
" S=" <<
Tok->SpacesRequiredBefore
6609 <<
" F=" <<
Tok->Finalized <<
" B=" <<
Tok->BlockParameterCount
6610 <<
" BK=" <<
Tok->getBlockKind() <<
" P=" <<
Tok->SplitPenalty
6611 <<
" Name=" <<
Tok->Tok.getName() <<
" N=" <<
Tok->NestingLevel
6612 <<
" L=" <<
Tok->TotalLength
6613 <<
" PPK=" <<
Tok->getPackingKind() <<
" FakeLParens=";
6615 llvm::errs() << LParen <<
"/";
6616 llvm::errs() <<
" FakeRParens=" <<
Tok->FakeRParens;
6617 llvm::errs() <<
" II=" <<
Tok->Tok.getIdentifierInfo();
6618 llvm::errs() <<
" Text='" <<
Tok->TokenText <<
"'\n";
6623 llvm::errs() <<
"----\n";
6626FormatStyle::PointerAlignmentStyle
6628 assert(
Reference.isOneOf(tok::amp, tok::ampamp));
6629 switch (Style.ReferenceAlignment) {
6630 case FormatStyle::RAS_Pointer:
6631 return Style.PointerAlignment;
6632 case FormatStyle::RAS_Left:
6633 return FormatStyle::PAS_Left;
6634 case FormatStyle::RAS_Right:
6635 return FormatStyle::PAS_Right;
6636 case FormatStyle::RAS_Middle:
6637 return FormatStyle::PAS_Middle;
6640 return Style.PointerAlignment;
6643FormatStyle::PointerAlignmentStyle
6644TokenAnnotator::getTokenPointerOrReferenceAlignment(
6646 if (PointerOrReference.isOneOf(tok::amp, tok::ampamp))
6647 return getTokenReferenceAlignment(PointerOrReference);
6648 assert(PointerOrReference.is(tok::star));
6649 return Style.PointerAlignment;
This file implements a token annotator, i.e.
Defines the clang::TokenKind enum and support functions.
#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _)
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Parser - This implements a parser for the C family of languages.
bool Ret(InterpState &S, CodePtr &PC)
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
@ Type
The name was classified as a type.
prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, bool CPlusPlus11)
Return the precedence of the specified binary operator token.