clang 23.0.0git
FormatToken.h
Go to the documentation of this file.
1//===--- FormatToken.h - Format C++ code ------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file contains the declaration of the FormatToken, a wrapper
11/// around Token with additional information related to formatting.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_LIB_FORMAT_FORMATTOKEN_H
16#define LLVM_CLANG_LIB_FORMAT_FORMATTOKEN_H
17
20#include "clang/Format/Format.h"
21#include "clang/Lex/Lexer.h"
22#include <unordered_set>
23
24namespace clang {
25namespace format {
26
27#define LIST_TOKEN_TYPES \
28 TYPE(AfterPPDirective) \
29 TYPE(ArrayInitializerLSquare) \
30 TYPE(ArraySubscriptLSquare) \
31 TYPE(AttributeColon) \
32 TYPE(AttributeLParen) \
33 TYPE(AttributeLSquare) \
34 TYPE(AttributeMacro) \
35 TYPE(AttributeRParen) \
36 TYPE(AttributeRSquare) \
37 TYPE(BinaryOperator) \
38 TYPE(BitFieldColon) \
39 TYPE(BlockComment) \
40 /* l_brace of a block that is not the body of a (e.g. loop) statement. */ \
41 TYPE(BlockLBrace) \
42 TYPE(BracedListLBrace) \
43 TYPE(CaseLabelArrow) \
44 /* The colon at the end of a case label. */ \
45 TYPE(CaseLabelColon) \
46 TYPE(CastRParen) \
47 TYPE(ClassLBrace) \
48 /* Name of class/struct/union/interface definition. */ \
49 TYPE(ClassHeadName) \
50 TYPE(ClassRBrace) \
51 TYPE(CompoundRequirementLBrace) \
52 /* ternary ?: expression */ \
53 TYPE(ConditionalExpr) \
54 /* the condition in an if statement */ \
55 TYPE(ConditionLParen) \
56 TYPE(ConflictAlternative) \
57 TYPE(ConflictEnd) \
58 TYPE(ConflictStart) \
59 /* l_brace of if/for/while/switch/catch */ \
60 TYPE(ControlStatementLBrace) \
61 TYPE(ControlStatementRBrace) \
62 TYPE(CppCastLParen) \
63 TYPE(CSharpGenericTypeConstraint) \
64 TYPE(CSharpGenericTypeConstraintColon) \
65 TYPE(CSharpGenericTypeConstraintComma) \
66 TYPE(CSharpNamedArgumentColon) \
67 TYPE(CSharpNullable) \
68 TYPE(CSharpNullConditionalLSquare) \
69 TYPE(CSharpStringLiteral) \
70 TYPE(CtorInitializerColon) \
71 TYPE(CtorInitializerComma) \
72 TYPE(CtorDtorDeclName) \
73 TYPE(DesignatedInitializerLSquare) \
74 TYPE(DesignatedInitializerPeriod) \
75 TYPE(DictLiteral) \
76 TYPE(DoWhile) \
77 TYPE(ElseLBrace) \
78 TYPE(ElseRBrace) \
79 TYPE(EnumEqual) \
80 TYPE(EnumLBrace) \
81 TYPE(EnumRBrace) \
82 TYPE(EnumUnderlyingTypeColon) \
83 TYPE(FatArrow) \
84 TYPE(ForEachMacro) \
85 TYPE(FunctionAnnotationRParen) \
86 TYPE(FunctionDeclarationName) \
87 TYPE(FunctionDeclarationLParen) \
88 TYPE(FunctionLBrace) \
89 TYPE(FunctionLikeMacro) \
90 TYPE(FunctionLikeOrFreestandingMacro) \
91 TYPE(FunctionTypeLParen) \
92 /* The colons as part of a C11 _Generic selection */ \
93 TYPE(GenericSelectionColon) \
94 /* The colon at the end of a goto label. */ \
95 TYPE(GotoLabelColon) \
96 TYPE(IfMacro) \
97 TYPE(ImplicitStringLiteral) \
98 TYPE(InheritanceColon) \
99 TYPE(InheritanceComma) \
100 TYPE(InlineASMBrace) \
101 TYPE(InlineASMColon) \
102 TYPE(InlineASMParen) \
103 TYPE(InlineASMSymbolicNameLSquare) \
104 TYPE(JavaAnnotation) \
105 TYPE(JsAndAndEqual) \
106 TYPE(JsComputedPropertyName) \
107 TYPE(JsExponentiation) \
108 TYPE(JsExponentiationEqual) \
109 TYPE(JsPipePipeEqual) \
110 TYPE(JsPrivateIdentifier) \
111 TYPE(JsTypeColon) \
112 TYPE(JsTypeOperator) \
113 TYPE(JsTypeOptionalQuestion) \
114 TYPE(LambdaArrow) \
115 TYPE(LambdaDefinitionLParen) \
116 TYPE(LambdaLBrace) \
117 TYPE(LambdaLSquare) \
118 TYPE(LeadingJavaAnnotation) \
119 TYPE(LineComment) \
120 TYPE(MacroBlockBegin) \
121 TYPE(MacroBlockEnd) \
122 TYPE(ModulePartitionColon) \
123 TYPE(NamespaceLBrace) \
124 TYPE(NamespaceMacro) \
125 TYPE(NamespaceRBrace) \
126 TYPE(NonNullAssertion) \
127 TYPE(NullCoalescingEqual) \
128 TYPE(NullCoalescingOperator) \
129 TYPE(NullPropagatingOperator) \
130 TYPE(ObjCBlockLBrace) \
131 TYPE(ObjCBlockLParen) \
132 TYPE(ObjCDecl) \
133 TYPE(ObjCForIn) \
134 /* The square brackets surrounding a method call, the colon separating the \
135 * method or parameter name and the argument inside the square brackets, and \
136 * the colon separating the method or parameter name and the type inside the \
137 * method declaration. */ \
138 TYPE(ObjCMethodExpr) \
139 /* The '+' or '-' at the start of the line. */ \
140 TYPE(ObjCMethodSpecifier) \
141 TYPE(ObjCProperty) \
142 /* The parentheses following '@selector' and the colon following the method \
143 * or parameter name inside the parentheses. */ \
144 TYPE(ObjCSelector) \
145 TYPE(ObjCStringLiteral) \
146 TYPE(OverloadedOperator) \
147 TYPE(OverloadedOperatorLParen) \
148 TYPE(PointerOrReference) \
149 TYPE(ProtoExtensionLSquare) \
150 TYPE(PureVirtualSpecifier) \
151 TYPE(QtProperty) \
152 TYPE(RangeBasedForLoopColon) \
153 TYPE(RecordLBrace) \
154 TYPE(RecordRBrace) \
155 TYPE(RegexLiteral) \
156 TYPE(RequiresClause) \
157 TYPE(RequiresClauseInARequiresExpression) \
158 TYPE(RequiresExpression) \
159 TYPE(RequiresExpressionLBrace) \
160 TYPE(RequiresExpressionLParen) \
161 /* The hash key in languages that have hash literals, not including the \
162 * field name in the C++ struct literal. Also the method or parameter name \
163 * in the Objective-C method declaration or call. */ \
164 TYPE(SelectorName) \
165 TYPE(StartOfName) \
166 TYPE(StatementAttributeLikeMacro) \
167 TYPE(StatementMacro) \
168 /* A string that is part of a string concatenation. For C#, JavaScript, and \
169 * Java, it is used for marking whether a string needs parentheses around it \
170 * if it is to be split into parts joined by `+`. For Verilog, whether \
171 * braces need to be added to split it. Not used for other languages. */ \
172 TYPE(StringInConcatenation) \
173 TYPE(StructLBrace) \
174 TYPE(StructRBrace) \
175 TYPE(StructuredBindingLSquare) \
176 TYPE(SwitchExpressionLabel) \
177 TYPE(SwitchExpressionLBrace) \
178 TYPE(TableGenBangOperator) \
179 TYPE(TableGenCondOperator) \
180 TYPE(TableGenCondOperatorColon) \
181 TYPE(TableGenCondOperatorComma) \
182 TYPE(TableGenDAGArgCloser) \
183 TYPE(TableGenDAGArgListColon) \
184 TYPE(TableGenDAGArgListColonToAlign) \
185 TYPE(TableGenDAGArgListComma) \
186 TYPE(TableGenDAGArgListCommaToBreak) \
187 TYPE(TableGenDAGArgOpener) \
188 TYPE(TableGenDAGArgOpenerToBreak) \
189 TYPE(TableGenDAGArgOperatorID) \
190 TYPE(TableGenDAGArgOperatorToBreak) \
191 TYPE(TableGenListCloser) \
192 TYPE(TableGenListOpener) \
193 TYPE(TableGenMultiLineString) \
194 TYPE(TableGenTrailingPasteOperator) \
195 TYPE(TableGenValueSuffix) \
196 TYPE(TemplateCloser) \
197 TYPE(TemplateOpener) \
198 TYPE(TemplateString) \
199 TYPE(TrailingAnnotation) \
200 TYPE(TrailingReturnArrow) \
201 TYPE(TrailingUnaryOperator) \
202 TYPE(TypeDeclarationParen) \
203 TYPE(TemplateName) \
204 TYPE(TypeName) \
205 TYPE(TypenameMacro) \
206 TYPE(UnaryOperator) \
207 TYPE(UnionLBrace) \
208 TYPE(UnionRBrace) \
209 TYPE(UntouchableMacroFunc) \
210 TYPE(VariableTemplate) \
211 /* Like in 'assign x = 0, y = 1;' . */ \
212 TYPE(VerilogAssignComma) \
213 /* like in begin : block */ \
214 TYPE(VerilogBlockLabelColon) \
215 /* The square bracket for the dimension part of the type name. \
216 * In 'logic [1:0] x[1:0]', only the first '['. This way we can have space \
217 * before the first bracket but not the second. */ \
218 TYPE(VerilogDimensionedTypeName) \
219 /* list of port connections or parameters in a module instantiation */ \
220 TYPE(VerilogInstancePortComma) \
221 TYPE(VerilogInstancePortLParen) \
222 /* A parenthesized list within which line breaks are inserted by the \
223 * formatter, for example the list of ports in a module header. */ \
224 TYPE(VerilogMultiLineListLParen) \
225 /* for the base in a number literal, not including the quote */ \
226 TYPE(VerilogNumberBase) \
227 /* The text that is in the opaque protected block. Like the text between \
228 * 'pragma protect data_block' and 'pragma protect end_protected'. */ \
229 TYPE(VerilogProtected) \
230 /* like `(strong1, pull0)` */ \
231 TYPE(VerilogStrength) \
232 /* Things inside the table in user-defined primitives. */ \
233 TYPE(VerilogTableItem) \
234 /* those that separate ports of different types */ \
235 TYPE(VerilogTypeComma) \
236 TYPE(Unknown)
237
238/// Determines the semantic type of a syntactic token, e.g. whether "<" is a
239/// template opener or binary operator.
240enum TokenType : uint8_t {
241#define TYPE(X) TT_##X,
243#undef TYPE
245};
247/// Determines the name of a token type.
248const char *getTokenTypeName(TokenType Type);
250// Represents what type of block a set of braces open.
253// The packing kind of a function's parameters.
257
258/// Roles a token can take in a configured macro expansion.
259enum MacroRole {
260 /// The token was expanded from a macro argument when formatting the expanded
261 /// token sequence.
263 /// The token is part of a macro argument that was previously formatted as
264 /// expansion when formatting the unexpanded macro call.
266 /// The token was expanded from a macro definition, and is not visible as part
267 /// of the macro call.
268 MR_Hidden,
269};
270
271struct FormatToken;
272
273/// Contains information on the token's role in a macro expansion.
274///
275/// Given the following definitions:
276/// A(X) = [ X ]
277/// B(X) = < X >
278/// C(X) = X
279///
280/// Consider the macro call:
281/// A({B(C(C(x)))}) -> [{<x>}]
282///
283/// In this case, the tokens of the unexpanded macro call will have the
284/// following relevant entries in their macro context (note that formatting
285/// the unexpanded macro call happens *after* formatting the expanded macro
286/// call):
287/// A( { B( C( C(x) ) ) } )
288/// Role: NN U NN NN NNUN N N U N (N=None, U=UnexpandedArg)
289///
290/// [ { < x > } ]
291/// Role: H E H E H E H (H=Hidden, E=ExpandedArg)
292/// ExpandedFrom[0]: A A A A A A A
293/// ExpandedFrom[1]: B B B
294/// ExpandedFrom[2]: C
295/// ExpandedFrom[3]: C
296/// StartOfExpansion: 1 0 1 2 0 0 0
297/// EndOfExpansion: 0 0 0 2 1 0 1
298struct MacroExpansion {
301 /// The token's role in the macro expansion.
302 /// When formatting an expanded macro, all tokens that are part of macro
303 /// arguments will be MR_ExpandedArg, while all tokens that are not visible in
304 /// the macro call will be MR_Hidden.
305 /// When formatting an unexpanded macro call, all tokens that are part of
306 /// macro arguments will be MR_UnexpandedArg.
308
309 /// The stack of macro call identifier tokens this token was expanded from.
311
312 /// The number of expansions of which this macro is the first entry.
313 unsigned StartOfExpansion = 0;
314
315 /// The number of currently open expansions in \c ExpandedFrom this macro is
316 /// the last token in.
317 unsigned EndOfExpansion = 0;
318};
319
320class TokenRole;
321class AnnotatedLine;
322
323/// A wrapper around a \c Token storing information about the
324/// whitespace characters preceding it.
325struct FormatToken {
335 Decision(FD_Unformatted), PackingKind(PPK_Inconclusive),
336 TypeIsFinalized(false), Type(TT_Unknown) {}
337
338 /// The \c Token.
339 Token Tok;
340
341 /// The raw text of the token.
342 ///
343 /// Contains the raw token text without leading whitespace and without leading
344 /// escaped newlines.
345 StringRef TokenText;
346
347 /// A token can have a special role that can carry extra information
348 /// about the token's formatting.
349 /// FIXME: Make FormatToken for parsing and AnnotatedToken two different
350 /// classes and make this a unique_ptr in the AnnotatedToken class.
351 std::shared_ptr<TokenRole> Role;
352
353 /// The range of the whitespace immediately preceding the \c Token.
355
356 /// Whether there is at least one unescaped newline before the \c
357 /// Token.
358 unsigned HasUnescapedNewline : 1;
359
360 /// Whether the token text contains newlines (escaped or not).
361 unsigned IsMultiline : 1;
362
363 /// Indicates that this is the first token of the file.
364 unsigned IsFirst : 1;
365
366 /// Whether there must be a line break before this token.
367 ///
368 /// This happens for example when a preprocessor directive ended directly
369 /// before the token.
370 unsigned MustBreakBefore : 1;
371
372 /// Whether MustBreakBefore is finalized during parsing and must not
373 /// be reset between runs.
375
376 /// Set to \c true if this token is an unterminated literal.
377 unsigned IsUnterminatedLiteral : 1;
378
379 /// \c true if it is allowed to break before this token.
380 unsigned CanBreakBefore : 1;
382 /// \c true if this is the ">" of "template<..>".
383 unsigned ClosesTemplateDeclaration : 1;
384
385 /// \c true if this token starts a binary expression, i.e. has at least
386 /// one fake l_paren with a precedence greater than prec::Unknown.
387 unsigned StartsBinaryExpression : 1;
388 /// \c true if this token ends a binary expression.
389 unsigned EndsBinaryExpression : 1;
390
391 /// Is this token part of a \c DeclStmt defining multiple variables?
392 ///
393 /// Only set if \c Type == \c TT_StartOfName.
395
396 /// Does this line comment continue a line comment section?
397 ///
398 /// Only set to true if \c Type == \c TT_LineComment.
399 unsigned ContinuesLineCommentSection : 1;
401 /// If \c true, this token has been fully formatted (indented and
402 /// potentially re-formatted inside), and we do not allow further formatting
403 /// changes.
404 unsigned Finalized : 1;
405
406 /// \c true if this is the last token within requires clause.
408
409 /// \c true if this token ends a group of C++ attributes.
411
412 /// \c true if a comma has been inserted or removed after the token.
413 unsigned HasEnumTrailingCommaHandled : 1;
414
415private:
416 /// Contains the kind of block if this token is a brace.
417 unsigned BlockKind : 2;
418
419public:
421 return static_cast<BraceBlockKind>(BlockKind);
422 }
424 BlockKind = BBK;
425 assert(getBlockKind() == BBK && "BraceBlockKind overflow!");
426 }
427
428private:
429 /// Stores the formatting decision for the token once it was made.
430 unsigned Decision : 2;
431
432public:
434 return static_cast<FormatDecision>(Decision);
435 }
437 Decision = D;
438 assert(getDecision() == D && "FormatDecision overflow!");
439 }
440
441private:
442 /// If this is an opening parenthesis, how are the parameters packed?
443 unsigned PackingKind : 2;
444
445public:
447 return static_cast<ParameterPackingKind>(PackingKind);
450 PackingKind = K;
451 assert(getPackingKind() == K && "ParameterPackingKind overflow!");
452 }
453
454private:
455 unsigned TypeIsFinalized : 1;
457
458public:
459 /// Returns the token's type, e.g. whether "<" is a template opener or
460 /// binary operator.
461 TokenType getType() const { return Type; }
462 void setType(TokenType T) {
463 // If this token is a macro argument while formatting an unexpanded macro
464 // call, we do not change its type any more - the type was deduced from
465 // formatting the expanded macro stream already.
466 if (MacroCtx && MacroCtx->Role == MR_UnexpandedArg)
467 return;
468 assert((!TypeIsFinalized || T == Type) &&
469 "Please use overwriteFixedType to change a fixed type.");
470 Type = T;
471 }
472 /// Sets the type and also the finalized flag. This prevents the type to be
473 /// reset in TokenAnnotator::resetTokenMetadata(). If the type needs to be set
474 /// to another one please use overwriteFixedType, or even better remove the
475 /// need to reassign the type.
477 if (MacroCtx && MacroCtx->Role == MR_UnexpandedArg)
478 return;
479 Type = T;
480 TypeIsFinalized = true;
481 }
483 if (MacroCtx && MacroCtx->Role == MR_UnexpandedArg)
484 return;
485 TypeIsFinalized = false;
486 setType(T);
487 }
488 bool isTypeFinalized() const { return TypeIsFinalized; }
489
490 /// Used to set an operator precedence explicitly.
492
493 /// The number of newlines immediately before the \c Token.
494 ///
495 /// This can be used to determine what the user wrote in the original code
496 /// and thereby e.g. leave an empty line between two function definitions.
497 unsigned NewlinesBefore = 0;
498
499 /// The number of newlines immediately before the \c Token after formatting.
500 ///
501 /// This is used to avoid overlapping whitespace replacements when \c Newlines
502 /// is recomputed for a finalized preprocessor branching directive.
503 int Newlines = -1;
504
505 /// The offset just past the last '\n' in this token's leading
506 /// whitespace (relative to \c WhiteSpaceStart). 0 if there is no '\n'.
507 unsigned LastNewlineOffset = 0;
508
509 /// The width of the non-whitespace parts of the token (or its first
510 /// line for multi-line tokens) in columns.
511 /// We need this to correctly measure number of columns a token spans.
512 unsigned ColumnWidth = 0;
514 /// Contains the width in columns of the last line of a multi-line
515 /// token.
516 unsigned LastLineColumnWidth = 0;
518 /// The number of spaces that should be inserted before this token.
519 unsigned SpacesRequiredBefore = 0;
520
521 /// Number of parameters, if this is "(", "[" or "<".
522 unsigned ParameterCount = 0;
523
524 /// Number of parameters that are nested blocks,
525 /// if this is "(", "[" or "<".
526 unsigned BlockParameterCount = 0;
527
528 /// If this is a bracket ("<", "(", "[" or "{"), contains the kind of
529 /// the surrounding bracket.
530 tok::TokenKind ParentBracket = tok::unknown;
531
532 /// The total length of the unwrapped line up to and including this
533 /// token.
534 unsigned TotalLength = 0;
535
536 /// The original 0-based column of this token, including expanded tabs.
537 /// The configured TabWidth is used as tab width.
538 unsigned OriginalColumn = 0;
539
540 /// The length of following tokens until the next natural split point,
541 /// or the next token that can be broken.
542 unsigned UnbreakableTailLength = 0;
543
544 // FIXME: Come up with a 'cleaner' concept.
545 /// The binding strength of a token. This is a combined value of
546 /// operator precedence, parenthesis nesting, etc.
547 unsigned BindingStrength = 0;
549 /// The nesting level of this token, i.e. the number of surrounding (),
550 /// [], {} or <>.
551 unsigned NestingLevel = 0;
552
553 /// The indent level of this token. Copied from the surrounding line.
554 unsigned IndentLevel = 0;
556 /// Block + continuation indent level, applied by the WhitespaceManager to
557 /// this token.
558 mutable unsigned AppliedIndentLevel = 0;
559
560 /// Penalty for inserting a line break before this token.
561 unsigned SplitPenalty = 0;
562
563 /// If this is the first ObjC selector name in an ObjC method
564 /// definition or call, this contains the length of the longest name.
565 ///
566 /// This being set to 0 means that the selectors should not be colon-aligned,
567 /// e.g. because several of them are block-type.
568 unsigned LongestObjCSelectorName = 0;
569
570 /// If this is the first ObjC selector name in an ObjC method
571 /// definition or call, this contains the number of parts that the whole
572 /// selector consist of.
573 unsigned ObjCSelectorNameParts = 0;
575 /// The 0-based index of the parameter/argument. For ObjC it is set
576 /// for the selector name token.
577 /// For now calculated only for ObjC.
578 unsigned ParameterIndex = 0;
579
580 /// Stores the number of required fake parentheses and the
581 /// corresponding operator precedence.
582 ///
583 /// If multiple fake parentheses start at a token, this vector stores them in
584 /// reverse order, i.e. inner fake parenthesis first.
586 /// Insert this many fake ) after this token for correct indentation.
587 unsigned FakeRParens = 0;
589 /// If this is an operator (or "."/"->") in a sequence of operators
590 /// with the same precedence, contains the 0-based operator index.
591 unsigned OperatorIndex = 0;
592
593 /// If this is an operator (or "."/"->") in a sequence of operators
594 /// with the same precedence, points to the next operator.
595 FormatToken *NextOperator = nullptr;
596
597 /// If this is a bracket, this points to the matching one.
598 FormatToken *MatchingParen = nullptr;
599
600 /// The previous token in the unwrapped line.
601 FormatToken *Previous = nullptr;
602
603 /// The next token in the unwrapped line.
604 FormatToken *Next = nullptr;
605
606 /// The first token in set of column elements.
607 bool StartsColumn = false;
608
609 /// This notes the start of the line of an array initializer.
610 bool ArrayInitializerLineStart = false;
611
612 /// This starts an array initializer.
613 bool IsArrayInitializer = false;
614
615 /// Is optional and can be removed.
616 bool Optional = false;
617
618 /// Might be function declaration open/closing paren.
619 bool MightBeFunctionDeclParen = false;
620
621 /// Has "\n\f\n" or "\n\f\r\n" before TokenText.
622 bool HasFormFeedBefore = false;
623
624 /// Is the first token after a preprocessor line.
625 bool FirstAfterPPLine = false;
627 /// Number of optional braces to be inserted after this token:
628 /// -1: a single left brace
629 /// 0: no braces
630 /// >0: number of right braces
631 int8_t BraceCount = 0;
632
633 /// If this token starts a block, this contains all the unwrapped lines
634 /// in it.
636
637 // Contains all attributes related to how this token takes part
638 // in a configured macro expansion.
639 std::optional<MacroExpansion> MacroCtx;
640
641 /// When macro expansion introduces nodes with children, those are marked as
642 /// \c MacroParent.
643 /// FIXME: The formatting code currently hard-codes the assumption that
644 /// child nodes are introduced by blocks following an opening brace.
645 /// This is deeply baked into the code and disentangling this will require
646 /// signficant refactorings. \c MacroParent allows us to special-case the
647 /// cases in which we treat parents as block-openers for now.
648 bool MacroParent = false;
650 bool is(tok::TokenKind Kind) const { return Tok.is(Kind); }
651 bool is(tok::ObjCKeywordKind Kind) const {
652 return Tok.getObjCKeywordID() == Kind;
653 }
654 bool is(TokenType TT) const { return getType() == TT; }
655 bool is(const IdentifierInfo *II) const {
656 return II && II == Tok.getIdentifierInfo();
657 }
658 bool is(tok::PPKeywordKind Kind) const {
659 return Tok.getIdentifierInfo() &&
660 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
661 }
662 bool is(BraceBlockKind BBK) const { return getBlockKind() == BBK; }
663 bool is(ParameterPackingKind PPK) const { return getPackingKind() == PPK; }
665 template <typename A, typename B> bool isOneOf(A K1, B K2) const {
666 return is(K1) || is(K2);
667 }
668 template <typename A, typename B, typename... Ts>
669 bool isOneOf(A K1, B K2, Ts... Ks) const {
670 return is(K1) || isOneOf(K2, Ks...);
671 }
672 template <typename T> bool isNot(T Kind) const { return !is(Kind); }
673 template <typename... Ts> bool isNoneOf(Ts... Ks) const {
674 return !isOneOf(Ks...);
676
677 bool isIf(bool AllowConstexprMacro = true) const {
678 return is(tok::kw_if) || endsSequence(tok::kw_constexpr, tok::kw_if) ||
679 (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
680 }
681
682 bool isLoop(const FormatStyle &Style) const {
683 return isOneOf(tok::kw_for, tok::kw_while) ||
684 (Style.isJavaScript() && isNot(tok::l_paren) && Previous &&
685 Previous->is(tok::kw_for));
686 }
687
688 bool closesScopeAfterBlock() const {
689 if (getBlockKind() == BK_Block)
690 return true;
691 if (closesScope())
692 return Previous->closesScopeAfterBlock();
693 return false;
694 }
695
696 /// \c true if this token starts a sequence with the given tokens in order,
697 /// following the ``Next`` pointers, ignoring comments.
698 template <typename A, typename... Ts>
699 bool startsSequence(A K1, Ts... Tokens) const {
700 return startsSequenceInternal(K1, Tokens...);
701 }
702
703 /// \c true if this token ends a sequence with the given tokens in order,
704 /// following the ``Previous`` pointers, ignoring comments.
705 /// For example, given tokens [T1, T2, T3], the function returns true if
706 /// 3 tokens ending at this (ignoring comments) are [T3, T2, T1]. In other
707 /// words, the tokens passed to this function need to the reverse of the
708 /// order the tokens appear in code.
709 template <typename A, typename... Ts>
710 bool endsSequence(A K1, Ts... Tokens) const {
711 return endsSequenceInternal(K1, Tokens...);
712 }
713
714 bool isStringLiteral() const { return tok::isStringLiteral(Tok.getKind()); }
715
716 bool isAttribute() const {
717 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
718 }
719
720 bool isAccessSpecifierKeyword() const {
721 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
722 }
723
724 bool isAccessSpecifier(bool ColonRequired = true) const {
725 if (!isAccessSpecifierKeyword())
726 return false;
727 if (!ColonRequired)
728 return true;
729 const auto *NextNonComment = getNextNonComment();
730 return NextNonComment && NextNonComment->is(tok::colon);
731 }
732
733 bool canBePointerOrReferenceQualifier() const {
734 return isOneOf(tok::kw_const, tok::kw_restrict, tok::kw_volatile,
735 tok::kw__Nonnull, tok::kw__Nullable,
736 tok::kw__Null_unspecified, tok::kw___ptr32, tok::kw___ptr64,
737 tok::kw___funcref) ||
738 isAttribute();
739 }
740
741 [[nodiscard]] bool isQtProperty() const;
742 [[nodiscard]] bool isTypeName(const LangOptions &LangOpts) const;
743 [[nodiscard]] bool isTypeOrIdentifier(const LangOptions &LangOpts) const;
744
745 bool isObjCAccessSpecifier() const {
746 return is(tok::at) && Next &&
747 Next->isOneOf(tok::objc_public, tok::objc_protected,
748 tok::objc_package, tok::objc_private);
749 }
750
751 bool isObjCLifetimeQualifier(const FormatStyle &Style) const {
752 if (Style.Language != FormatStyle::LK_ObjC || isNot(tok::identifier) ||
753 !TokenText.starts_with("__")) {
754 return false;
755 }
756 const auto Qualifier = TokenText.substr(2);
757 return Qualifier == "autoreleasing" || Qualifier == "strong" ||
758 Qualifier == "weak" || Qualifier == "unsafe_unretained";
759 }
760
761 /// Returns whether \p Tok is ([{ or an opening < of a template or in
762 /// protos.
763 bool opensScope() const {
764 if (is(TT_TemplateString) && TokenText.ends_with("${"))
765 return true;
766 if (is(TT_DictLiteral) && is(tok::less))
767 return true;
768 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
769 TT_TemplateOpener);
770 }
771 /// Returns whether \p Tok is )]} or a closing > of a template or in
772 /// protos.
773 bool closesScope() const {
774 if (is(TT_TemplateString) && TokenText.starts_with("}"))
775 return true;
776 if (is(TT_DictLiteral) && is(tok::greater))
777 return true;
778 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
779 TT_TemplateCloser);
780 }
781
782 /// Returns \c true if this is a "." or "->" accessing a member.
783 bool isMemberAccess() const {
784 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
785 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
786 TT_LambdaArrow, TT_LeadingJavaAnnotation);
787 }
788
789 bool isPointerOrReference() const {
790 return isOneOf(tok::star, tok::amp, tok::ampamp);
791 }
792
793 bool isPlacementOperator() const {
794 return isOneOf(tok::kw_new, tok::kw_delete);
795 }
796
797 bool isUnaryOperator() const {
798 switch (Tok.getKind()) {
799 case tok::plus:
800 case tok::plusplus:
801 case tok::minus:
802 case tok::minusminus:
803 case tok::exclaim:
804 case tok::tilde:
805 case tok::kw_sizeof:
806 case tok::kw_alignof:
807 return true;
808 default:
809 return false;
810 }
811 }
812
813 bool isBinaryOperator() const {
814 // Comma is a binary operator, but does not behave as such wrt. formatting.
815 return getPrecedence() > prec::Comma;
816 }
817
818 bool isTrailingComment() const {
819 return is(tok::comment) &&
820 (is(TT_LineComment) || !Next || Next->NewlinesBefore > 0);
821 }
822
823 /// Returns \c true if this is a keyword that can be used
824 /// like a function call (e.g. sizeof, typeid, ...).
825 bool isFunctionLikeKeyword() const {
826 if (isAttribute())
827 return true;
828
829 return isOneOf(tok::kw_throw, tok::kw_typeid, tok::kw_return,
830 tok::kw_sizeof, tok::kw_alignof, tok::kw_alignas,
831 tok::kw_decltype, tok::kw_noexcept, tok::kw_static_assert,
832 tok::kw__Atomic,
833#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) tok::kw___##Trait,
834#include "clang/Basic/TransformTypeTraits.def"
835 tok::kw_requires);
836 }
837
838 /// Returns \c true if this is a string literal that's like a label,
839 /// e.g. ends with "=" or ":".
840 bool isLabelString() const {
841 if (isNot(tok::string_literal))
842 return false;
843 StringRef Content = TokenText;
844 if (Content.starts_with("\"") || Content.starts_with("'"))
845 Content = Content.drop_front(1);
846 if (Content.ends_with("\"") || Content.ends_with("'"))
847 Content = Content.drop_back(1);
848 Content = Content.trim();
849 return Content.size() > 1 &&
850 (Content.back() == ':' || Content.back() == '=');
851 }
852
853 /// Returns actual token start location without leading escaped
854 /// newlines and whitespace.
855 ///
856 /// This can be different to Tok.getLocation(), which includes leading escaped
857 /// newlines.
858 SourceLocation getStartOfNonWhitespace() const {
859 return WhitespaceRange.getEnd();
860 }
861
862 /// Returns \c true if the range of whitespace immediately preceding the \c
863 /// Token is not empty.
864 bool hasWhitespaceBefore() const {
865 return WhitespaceRange.getBegin() != WhitespaceRange.getEnd();
866 }
867
868 prec::Level getPrecedence() const {
871 return getBinOpPrecedence(Tok.getKind(), /*GreaterThanIsOperator=*/true,
872 /*CPlusPlus11=*/true);
873 }
874
875 template <typename T> [[nodiscard]] FormatToken *getPrevious(T A1) const {
877 while (Tok && Tok->isNot(A1))
878 Tok = Tok->Previous;
879 return Tok;
880 }
881
882 template <typename... Ts>
883 [[nodiscard]] FormatToken *getPreviousOneOf(Ts... Ks) const {
885 while (Tok && (Tok->isNot(Ks) && ...))
886 Tok = Tok->Previous;
887 return Tok;
889
890 /// Returns the previous token ignoring comments.
891 [[nodiscard]] FormatToken *getPreviousNonComment() const {
893 while (Tok && Tok->is(tok::comment))
894 Tok = Tok->Previous;
895 return Tok;
896 }
898 /// Returns the next token ignoring comments.
899 [[nodiscard]] FormatToken *getNextNonComment() const {
901 while (Tok && Tok->is(tok::comment))
902 Tok = Tok->Next;
903 return Tok;
904 }
905
906 /// Returns \c true if this token likely names an object-like macro.
907 ///
908 /// If \p AllowFollowingColonColon is \c true, a following \c :: does not
909 /// disqualify the token from being considered macro-like.
910 bool isPossibleMacro(bool AllowFollowingColonColon = false) const {
911 if (isNot(tok::identifier))
912 return false;
913
914 assert(!TokenText.empty());
915
916 // T, K, U, V likely could be template arguments.
917 if (TokenText.size() == 1)
918 return false;
919
920 // It's unlikely that qualified names are object-like macros.
921 const auto *Prev = getPreviousNonComment();
922 if (Prev && Prev->is(tok::coloncolon))
923 return false;
924 if (!AllowFollowingColonColon) {
925 const auto *Next = getNextNonComment();
926 if (Next && Next->is(tok::coloncolon))
927 return false;
928 }
930 return TokenText == TokenText.upper();
932
933 /// Returns \c true if this token ends a block indented initializer list.
934 [[nodiscard]] bool isBlockIndentedInitRBrace(const FormatStyle &Style) const;
935
936 /// Returns \c true if this tokens starts a block-type list, i.e. a
937 /// list that should be indented with a block indent.
938 [[nodiscard]] bool opensBlockOrBlockTypeList(const FormatStyle &Style) const;
939
940 /// Returns whether the token is the left square bracket of a C++
941 /// structured binding declaration.
942 bool isCppStructuredBinding(bool IsCpp) const {
943 if (!IsCpp || isNot(tok::l_square))
944 return false;
945 const FormatToken *T = this;
946 do {
947 T = T->getPreviousNonComment();
948 } while (T && T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
949 tok::ampamp));
950 return T && T->is(tok::kw_auto);
951 }
952
953 /// Same as opensBlockOrBlockTypeList, but for the closing token.
954 bool closesBlockOrBlockTypeList(const FormatStyle &Style) const {
955 if (is(TT_TemplateString) && closesScope())
956 return true;
957 return MatchingParen && MatchingParen->opensBlockOrBlockTypeList(Style);
958 }
959
960 /// Return the actual namespace token, if this token starts a namespace
961 /// block.
963 const FormatToken *NamespaceTok = this;
964 if (is(tok::comment))
965 NamespaceTok = NamespaceTok->getNextNonComment();
966 // Detect "(inline|export)? namespace" in the beginning of a line.
967 if (NamespaceTok && NamespaceTok->isOneOf(tok::kw_inline, tok::kw_export))
968 NamespaceTok = NamespaceTok->getNextNonComment();
969 return NamespaceTok &&
970 NamespaceTok->isOneOf(tok::kw_namespace, TT_NamespaceMacro)
971 ? NamespaceTok
972 : nullptr;
974
975 void copyFrom(const FormatToken &Tok) { *this = Tok; }
976
977private:
978 // Only allow copying via the explicit copyFrom method.
979 FormatToken(const FormatToken &) = delete;
980 FormatToken &operator=(const FormatToken &) = default;
981
982 template <typename A, typename... Ts>
983 bool startsSequenceInternal(A K1, Ts... Tokens) const {
984 if (is(tok::comment) && Next)
985 return Next->startsSequenceInternal(K1, Tokens...);
986 return is(K1) && Next && Next->startsSequenceInternal(Tokens...);
987 }
988
989 template <typename A> bool startsSequenceInternal(A K1) const {
990 if (is(tok::comment) && Next)
991 return Next->startsSequenceInternal(K1);
992 return is(K1);
993 }
994
995 template <typename A, typename... Ts> bool endsSequenceInternal(A K1) const {
996 if (is(tok::comment) && Previous)
997 return Previous->endsSequenceInternal(K1);
998 return is(K1);
1000
1001 template <typename A, typename... Ts>
1002 bool endsSequenceInternal(A K1, Ts... Tokens) const {
1003 if (is(tok::comment) && Previous)
1004 return Previous->endsSequenceInternal(K1, Tokens...);
1005 return is(K1) && Previous && Previous->endsSequenceInternal(Tokens...);
1006 }
1007};
1008
1009class ContinuationIndenter;
1010struct LineState;
1011
1012class TokenRole {
1013public:
1014 TokenRole(const FormatStyle &Style) : Style(Style) {}
1015 virtual ~TokenRole();
1016
1017 /// After the \c TokenAnnotator has finished annotating all the tokens,
1018 /// this function precomputes required information for formatting.
1019 virtual void precomputeFormattingInfos(const FormatToken *Token);
1020
1021 /// Apply the special formatting that the given role demands.
1022 ///
1023 /// Assumes that the token having this role is already formatted.
1024 ///
1025 /// Continues formatting from \p State leaving indentation to \p Indenter and
1026 /// returns the total penalty that this formatting incurs.
1027 virtual unsigned formatFromToken(LineState &State,
1028 ContinuationIndenter *Indenter,
1029 bool DryRun) {
1030 return 0;
1032
1033 /// Same as \c formatFromToken, but assumes that the first token has
1034 /// already been set thereby deciding on the first line break.
1035 virtual unsigned formatAfterToken(LineState &State,
1036 ContinuationIndenter *Indenter,
1037 bool DryRun) {
1038 return 0;
1041 /// Notifies the \c Role that a comma was found.
1042 virtual void CommaFound(const FormatToken *Token) {}
1043
1044 virtual const FormatToken *lastComma() { return nullptr; }
1045
1046protected:
1047 const FormatStyle &Style;
1048};
1050class CommaSeparatedList : public TokenRole {
1051public:
1052 CommaSeparatedList(const FormatStyle &Style)
1053 : TokenRole(Style), HasNestedBracedList(false) {}
1054
1057 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1058 bool DryRun) override;
1060 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1061 bool DryRun) override;
1062
1063 /// Adds \p Token as the next comma to the \c CommaSeparated list.
1064 void CommaFound(const FormatToken *Token) override {
1065 Commas.push_back(Token);
1066 }
1068 const FormatToken *lastComma() override {
1069 if (Commas.empty())
1070 return nullptr;
1071 return Commas.back();
1072 }
1073
1074private:
1075 /// A struct that holds information on how to format a given list with
1076 /// a specific number of columns.
1077 struct ColumnFormat {
1078 /// The number of columns to use.
1079 unsigned Columns;
1080
1081 /// The total width in characters.
1082 unsigned TotalWidth;
1083
1084 /// The number of lines required for this format.
1085 unsigned LineCount;
1086
1087 /// The size of each column in characters.
1089 };
1090
1091 /// Calculate which \c ColumnFormat fits best into
1092 /// \p RemainingCharacters.
1093 const ColumnFormat *getColumnFormat(unsigned RemainingCharacters) const;
1094
1095 /// The ordered \c FormatTokens making up the commas of this list.
1098 /// The length of each of the list's items in characters including the
1099 /// trailing comma.
1100 SmallVector<unsigned, 8> ItemLengths;
1101
1102 /// Precomputed formats that can be used for this list.
1104
1105 bool HasNestedBracedList;
1106};
1107
1108/// Encapsulates keywords that are context sensitive or for languages not
1109/// properly supported by Clang's lexer.
1110struct AdditionalKeywords {
1111 AdditionalKeywords(IdentifierTable &IdentTable) {
1112 kw_final = &IdentTable.get("final");
1113 kw_override = &IdentTable.get("override");
1114 kw_in = &IdentTable.get("in");
1115 kw_of = &IdentTable.get("of");
1116 kw_CF_CLOSED_ENUM = &IdentTable.get("CF_CLOSED_ENUM");
1117 kw_CF_ENUM = &IdentTable.get("CF_ENUM");
1118 kw_CF_OPTIONS = &IdentTable.get("CF_OPTIONS");
1119 kw_NS_CLOSED_ENUM = &IdentTable.get("NS_CLOSED_ENUM");
1120 kw_NS_ENUM = &IdentTable.get("NS_ENUM");
1121 kw_NS_ERROR_ENUM = &IdentTable.get("NS_ERROR_ENUM");
1122 kw_NS_OPTIONS = &IdentTable.get("NS_OPTIONS");
1123
1124 kw_as = &IdentTable.get("as");
1125 kw_async = &IdentTable.get("async");
1126 kw_await = &IdentTable.get("await");
1127 kw_declare = &IdentTable.get("declare");
1128 kw_finally = &IdentTable.get("finally");
1129 kw_from = &IdentTable.get("from");
1130 kw_function = &IdentTable.get("function");
1131 kw_get = &IdentTable.get("get");
1132 kw_import = &IdentTable.get("import");
1133 kw_infer = &IdentTable.get("infer");
1134 kw_is = &IdentTable.get("is");
1135 kw_let = &IdentTable.get("let");
1136 kw_module = &IdentTable.get("module");
1137 kw_readonly = &IdentTable.get("readonly");
1138 kw_set = &IdentTable.get("set");
1139 kw_type = &IdentTable.get("type");
1140 kw_typeof = &IdentTable.get("typeof");
1141 kw_var = &IdentTable.get("var");
1142 kw_yield = &IdentTable.get("yield");
1143
1144 kw_abstract = &IdentTable.get("abstract");
1145 kw_assert = &IdentTable.get("assert");
1146 kw_extends = &IdentTable.get("extends");
1147 kw_implements = &IdentTable.get("implements");
1148 kw_instanceof = &IdentTable.get("instanceof");
1149 kw_interface = &IdentTable.get("interface");
1150 kw_native = &IdentTable.get("native");
1151 kw_package = &IdentTable.get("package");
1152 kw_record = &IdentTable.get("record");
1153 kw_synchronized = &IdentTable.get("synchronized");
1154 kw_throws = &IdentTable.get("throws");
1155 kw___except = &IdentTable.get("__except");
1156 kw___has_include = &IdentTable.get("__has_include");
1157 kw___has_include_next = &IdentTable.get("__has_include_next");
1158
1159 kw_mark = &IdentTable.get("mark");
1160 kw_region = &IdentTable.get("region");
1161
1162 kw_extend = &IdentTable.get("extend");
1163 kw_option = &IdentTable.get("option");
1164 kw_optional = &IdentTable.get("optional");
1165 kw_repeated = &IdentTable.get("repeated");
1166 kw_required = &IdentTable.get("required");
1167 kw_returns = &IdentTable.get("returns");
1169 kw_signals = &IdentTable.get("signals");
1170 kw_qsignals = &IdentTable.get("Q_SIGNALS");
1171 kw_slots = &IdentTable.get("slots");
1172 kw_qslots = &IdentTable.get("Q_SLOTS");
1173
1174 // For internal clang-format use.
1175 kw_internal_ident_after_define =
1176 &IdentTable.get("__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
1177
1178 // C# keywords
1179 kw_dollar = &IdentTable.get("dollar");
1180 kw_base = &IdentTable.get("base");
1181 kw_byte = &IdentTable.get("byte");
1182 kw_checked = &IdentTable.get("checked");
1183 kw_decimal = &IdentTable.get("decimal");
1184 kw_delegate = &IdentTable.get("delegate");
1185 kw_event = &IdentTable.get("event");
1186 kw_fixed = &IdentTable.get("fixed");
1187 kw_foreach = &IdentTable.get("foreach");
1188 kw_init = &IdentTable.get("init");
1189 kw_implicit = &IdentTable.get("implicit");
1190 kw_internal = &IdentTable.get("internal");
1191 kw_lock = &IdentTable.get("lock");
1192 kw_null = &IdentTable.get("null");
1193 kw_object = &IdentTable.get("object");
1194 kw_out = &IdentTable.get("out");
1195 kw_params = &IdentTable.get("params");
1196 kw_ref = &IdentTable.get("ref");
1197 kw_string = &IdentTable.get("string");
1198 kw_stackalloc = &IdentTable.get("stackalloc");
1199 kw_sbyte = &IdentTable.get("sbyte");
1200 kw_sealed = &IdentTable.get("sealed");
1201 kw_uint = &IdentTable.get("uint");
1202 kw_ulong = &IdentTable.get("ulong");
1203 kw_unchecked = &IdentTable.get("unchecked");
1204 kw_unsafe = &IdentTable.get("unsafe");
1205 kw_ushort = &IdentTable.get("ushort");
1206 kw_when = &IdentTable.get("when");
1207 kw_where = &IdentTable.get("where");
1208
1209 // Verilog keywords
1210 kw_always = &IdentTable.get("always");
1211 kw_always_comb = &IdentTable.get("always_comb");
1212 kw_always_ff = &IdentTable.get("always_ff");
1213 kw_always_latch = &IdentTable.get("always_latch");
1214 kw_assign = &IdentTable.get("assign");
1215 kw_assume = &IdentTable.get("assume");
1216 kw_automatic = &IdentTable.get("automatic");
1217 kw_before = &IdentTable.get("before");
1218 kw_begin = &IdentTable.get("begin");
1219 kw_begin_keywords = &IdentTable.get("begin_keywords");
1220 kw_bins = &IdentTable.get("bins");
1221 kw_binsof = &IdentTable.get("binsof");
1222 kw_casex = &IdentTable.get("casex");
1223 kw_casez = &IdentTable.get("casez");
1224 kw_celldefine = &IdentTable.get("celldefine");
1225 kw_checker = &IdentTable.get("checker");
1226 kw_clocking = &IdentTable.get("clocking");
1227 kw_constraint = &IdentTable.get("constraint");
1228 kw_context = &IdentTable.get("context");
1229 kw_cover = &IdentTable.get("cover");
1230 kw_covergroup = &IdentTable.get("covergroup");
1231 kw_coverpoint = &IdentTable.get("coverpoint");
1232 kw_data_block = &IdentTable.get("data_block");
1233 kw_data_decrypt_key = &IdentTable.get("data_decrypt_key");
1234 kw_data_public_key = &IdentTable.get("data_public_key");
1235 kw_default_decay_time = &IdentTable.get("default_decay_time");
1236 kw_default_nettype = &IdentTable.get("default_nettype");
1237 kw_default_trireg_strength = &IdentTable.get("default_trireg_strength");
1238 kw_delay_mode_distributed = &IdentTable.get("delay_mode_distributed");
1239 kw_delay_mode_path = &IdentTable.get("delay_mode_path");
1240 kw_delay_mode_unit = &IdentTable.get("delay_mode_unit");
1241 kw_delay_mode_zero = &IdentTable.get("delay_mode_zero");
1242 kw_digest_block = &IdentTable.get("digest_block");
1243 kw_digest_decrypt_key = &IdentTable.get("digest_decrypt_key");
1244 kw_digest_public_key = &IdentTable.get("digest_public_key");
1245 kw_disable = &IdentTable.get("disable");
1246 kw_dist = &IdentTable.get("dist");
1247 kw_edge = &IdentTable.get("edge");
1248 kw_elsif = &IdentTable.get("elsif");
1249 kw_end = &IdentTable.get("end");
1250 kw_end_keywords = &IdentTable.get("end_keywords");
1251 kw_endcase = &IdentTable.get("endcase");
1252 kw_endcelldefine = &IdentTable.get("endcelldefine");
1253 kw_endchecker = &IdentTable.get("endchecker");
1254 kw_endclass = &IdentTable.get("endclass");
1255 kw_endclocking = &IdentTable.get("endclocking");
1256 kw_endfunction = &IdentTable.get("endfunction");
1257 kw_endgenerate = &IdentTable.get("endgenerate");
1258 kw_endgroup = &IdentTable.get("endgroup");
1259 kw_endinterface = &IdentTable.get("endinterface");
1260 kw_endmodule = &IdentTable.get("endmodule");
1261 kw_endpackage = &IdentTable.get("endpackage");
1262 kw_endprimitive = &IdentTable.get("endprimitive");
1263 kw_endprogram = &IdentTable.get("endprogram");
1264 kw_endproperty = &IdentTable.get("endproperty");
1265 kw_endsequence = &IdentTable.get("endsequence");
1266 kw_endspecify = &IdentTable.get("endspecify");
1267 kw_endtable = &IdentTable.get("endtable");
1268 kw_endtask = &IdentTable.get("endtask");
1269 kw_forever = &IdentTable.get("forever");
1270 kw_fork = &IdentTable.get("fork");
1271 kw_generate = &IdentTable.get("generate");
1272 kw_highz0 = &IdentTable.get("highz0");
1273 kw_highz1 = &IdentTable.get("highz1");
1274 kw_iff = &IdentTable.get("iff");
1275 kw_ifnone = &IdentTable.get("ifnone");
1276 kw_ignore_bins = &IdentTable.get("ignore_bins");
1277 kw_illegal_bins = &IdentTable.get("illegal_bins");
1278 kw_initial = &IdentTable.get("initial");
1279 kw_inout = &IdentTable.get("inout");
1280 kw_input = &IdentTable.get("input");
1281 kw_inside = &IdentTable.get("inside");
1282 kw_interconnect = &IdentTable.get("interconnect");
1283 kw_intersect = &IdentTable.get("intersect");
1284 kw_join = &IdentTable.get("join");
1285 kw_join_any = &IdentTable.get("join_any");
1286 kw_join_none = &IdentTable.get("join_none");
1287 kw_key_block = &IdentTable.get("key_block");
1288 kw_key_public_key = &IdentTable.get("key_public_key");
1289 kw_large = &IdentTable.get("large");
1290 kw_local = &IdentTable.get("local");
1291 kw_localparam = &IdentTable.get("localparam");
1292 kw_macromodule = &IdentTable.get("macromodule");
1293 kw_matches = &IdentTable.get("matches");
1294 kw_medium = &IdentTable.get("medium");
1295 kw_negedge = &IdentTable.get("negedge");
1296 kw_nounconnected_drive = &IdentTable.get("nounconnected_drive");
1297 kw_output = &IdentTable.get("output");
1298 kw_packed = &IdentTable.get("packed");
1299 kw_parameter = &IdentTable.get("parameter");
1300 kw_posedge = &IdentTable.get("posedge");
1301 kw_primitive = &IdentTable.get("primitive");
1302 kw_priority = &IdentTable.get("priority");
1303 kw_program = &IdentTable.get("program");
1304 kw_property = &IdentTable.get("property");
1305 kw_protect = &IdentTable.get("protect");
1306 kw_pull0 = &IdentTable.get("pull0");
1307 kw_pull1 = &IdentTable.get("pull1");
1308 kw_pure = &IdentTable.get("pure");
1309 kw_rand = &IdentTable.get("rand");
1310 kw_randc = &IdentTable.get("randc");
1311 kw_randcase = &IdentTable.get("randcase");
1312 kw_randsequence = &IdentTable.get("randsequence");
1313 kw_repeat = &IdentTable.get("repeat");
1314 kw_resetall = &IdentTable.get("resetall");
1315 kw_sample = &IdentTable.get("sample");
1316 kw_scalared = &IdentTable.get("scalared");
1317 kw_sequence = &IdentTable.get("sequence");
1318 kw_small = &IdentTable.get("small");
1319 kw_soft = &IdentTable.get("soft");
1320 kw_solve = &IdentTable.get("solve");
1321 kw_specify = &IdentTable.get("specify");
1322 kw_specparam = &IdentTable.get("specparam");
1323 kw_strong0 = &IdentTable.get("strong0");
1324 kw_strong1 = &IdentTable.get("strong1");
1325 kw_supply0 = &IdentTable.get("supply0");
1326 kw_supply1 = &IdentTable.get("supply1");
1327 kw_table = &IdentTable.get("table");
1328 kw_tagged = &IdentTable.get("tagged");
1329 kw_task = &IdentTable.get("task");
1330 kw_timescale = &IdentTable.get("timescale");
1331 kw_tri = &IdentTable.get("tri");
1332 kw_tri0 = &IdentTable.get("tri0");
1333 kw_tri1 = &IdentTable.get("tri1");
1334 kw_triand = &IdentTable.get("triand");
1335 kw_trior = &IdentTable.get("trior");
1336 kw_trireg = &IdentTable.get("trireg");
1337 kw_unconnected_drive = &IdentTable.get("unconnected_drive");
1338 kw_undefineall = &IdentTable.get("undefineall");
1339 kw_unique = &IdentTable.get("unique");
1340 kw_unique0 = &IdentTable.get("unique0");
1341 kw_uwire = &IdentTable.get("uwire");
1342 kw_vectored = &IdentTable.get("vectored");
1343 kw_wait = &IdentTable.get("wait");
1344 kw_wand = &IdentTable.get("wand");
1345 kw_weak0 = &IdentTable.get("weak0");
1346 kw_weak1 = &IdentTable.get("weak1");
1347 kw_wildcard = &IdentTable.get("wildcard");
1348 kw_wire = &IdentTable.get("wire");
1349 kw_with = &IdentTable.get("with");
1350 kw_wor = &IdentTable.get("wor");
1351
1352 // Symbols that are treated as keywords.
1353 kw_verilogHash = &IdentTable.get("#");
1354 kw_verilogHashHash = &IdentTable.get("##");
1355 kw_apostrophe = &IdentTable.get("\'");
1356
1357 // TableGen keywords.
1358 kw_bit = &IdentTable.get("bit");
1359 kw_bits = &IdentTable.get("bits");
1360 kw_code = &IdentTable.get("code");
1361 kw_dag = &IdentTable.get("dag");
1362 kw_def = &IdentTable.get("def");
1363 kw_defm = &IdentTable.get("defm");
1364 kw_defset = &IdentTable.get("defset");
1365 kw_defvar = &IdentTable.get("defvar");
1366 kw_dump = &IdentTable.get("dump");
1367 kw_include = &IdentTable.get("include");
1368 kw_list = &IdentTable.get("list");
1369 kw_multiclass = &IdentTable.get("multiclass");
1370 kw_then = &IdentTable.get("then");
1371
1372 // Keep this at the end of the constructor to make sure everything here is
1373 // already initialized.
1374 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
1375 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
1376 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_override,
1377 kw_readonly, kw_set, kw_type, kw_typeof, kw_var, kw_yield,
1378 // Keywords from the Java section.
1379 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
1380
1381 CSharpExtraKeywords = JsExtraKeywords;
1382 CSharpExtraKeywords.insert(
1383 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate,
1384 kw_event, kw_fixed, kw_foreach, kw_implicit, kw_in,
1385 kw_init, kw_internal, kw_lock, kw_null, kw_object,
1386 kw_out, kw_params, kw_ref, kw_string, kw_stackalloc,
1387 kw_sbyte, kw_sealed, kw_uint, kw_ulong, kw_unchecked,
1388 kw_unsafe, kw_ushort, kw_when, kw_where});
1389
1390 // Some keywords are not included here because they don't need special
1391 // treatment like `showcancelled` or they should be treated as identifiers
1392 // like `int` and `logic`.
1393 VerilogExtraKeywords =
1394 std::unordered_set<IdentifierInfo *>{kw_always,
1395 kw_always_comb,
1396 kw_always_ff,
1397 kw_always_latch,
1398 kw_assert,
1399 kw_assign,
1400 kw_assume,
1401 kw_automatic,
1402 kw_before,
1403 kw_begin,
1404 kw_bins,
1405 kw_binsof,
1406 kw_casex,
1407 kw_casez,
1408 kw_celldefine,
1409 kw_checker,
1410 kw_clocking,
1411 kw_constraint,
1412 kw_context,
1413 kw_cover,
1414 kw_covergroup,
1415 kw_coverpoint,
1416 kw_disable,
1417 kw_dist,
1418 kw_edge,
1419 kw_end,
1420 kw_endcase,
1421 kw_endchecker,
1422 kw_endclass,
1423 kw_endclocking,
1424 kw_endfunction,
1425 kw_endgenerate,
1426 kw_endgroup,
1427 kw_endinterface,
1428 kw_endmodule,
1429 kw_endpackage,
1430 kw_endprimitive,
1431 kw_endprogram,
1432 kw_endproperty,
1433 kw_endsequence,
1434 kw_endspecify,
1435 kw_endtable,
1436 kw_endtask,
1437 kw_extends,
1438 kw_final,
1439 kw_foreach,
1440 kw_forever,
1441 kw_fork,
1442 kw_function,
1443 kw_generate,
1444 kw_highz0,
1445 kw_highz1,
1446 kw_iff,
1447 kw_ifnone,
1448 kw_ignore_bins,
1449 kw_illegal_bins,
1450 kw_implements,
1451 kw_import,
1452 kw_initial,
1453 kw_inout,
1454 kw_input,
1455 kw_inside,
1456 kw_interconnect,
1457 kw_interface,
1458 kw_intersect,
1459 kw_join,
1460 kw_join_any,
1461 kw_join_none,
1462 kw_large,
1463 kw_let,
1464 kw_local,
1465 kw_localparam,
1466 kw_macromodule,
1467 kw_matches,
1468 kw_medium,
1469 kw_module,
1470 kw_negedge,
1471 kw_output,
1472 kw_package,
1473 kw_packed,
1474 kw_parameter,
1475 kw_posedge,
1476 kw_primitive,
1477 kw_priority,
1478 kw_program,
1479 kw_property,
1480 kw_pull0,
1481 kw_pull1,
1482 kw_pure,
1483 kw_rand,
1484 kw_randc,
1485 kw_randcase,
1486 kw_randsequence,
1487 kw_ref,
1488 kw_repeat,
1489 kw_sample,
1490 kw_scalared,
1491 kw_sequence,
1492 kw_small,
1493 kw_soft,
1494 kw_solve,
1495 kw_specify,
1496 kw_specparam,
1497 kw_strong0,
1498 kw_strong1,
1499 kw_supply0,
1500 kw_supply1,
1501 kw_table,
1502 kw_tagged,
1503 kw_task,
1504 kw_tri,
1505 kw_tri0,
1506 kw_tri1,
1507 kw_triand,
1508 kw_trior,
1509 kw_trireg,
1510 kw_unique,
1511 kw_unique0,
1512 kw_uwire,
1513 kw_var,
1514 kw_vectored,
1515 kw_wait,
1516 kw_wand,
1517 kw_weak0,
1518 kw_weak1,
1519 kw_wildcard,
1526 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>{
1532 // Context sensitive keywords.
1548 // JavaScript keywords.
1568
1569 // Java keywords.
1581
1582 // Pragma keywords.
1586 // Proto keywords.
1594 // QT keywords.
1600 // For internal use by clang-format.
1603 // C# keywords
1623
1637 // Verilog keywords
1780 // Workaround for hashes and backticks in Verilog.
1784 // Symbols in Verilog that don't exist in C++.
1787 // TableGen keywords
1802 /// Returns \c true if \p Tok is a keyword or an identifier.
1803 bool isWordLike(const FormatToken &Tok, bool IsVerilog = true) const {
1804 // getIdentifierinfo returns non-null for keywords as well as identifiers.
1805 return Tok.Tok.getIdentifierInfo() &&
1806 (!IsVerilog || !isVerilogKeywordSymbol(Tok));
1807 }
1808
1809 /// Returns \c true if \p Tok is a true JavaScript identifier, returns
1810 /// \c false if it is a keyword or a pseudo keyword.
1811 /// If \c AcceptIdentifierName is true, returns true not only for keywords,
1812 // but also for IdentifierName tokens (aka pseudo-keywords), such as
1813 // ``yield``.
1814 bool isJavaScriptIdentifier(const FormatToken &Tok,
1815 bool AcceptIdentifierName = true) const {
1816 // Based on the list of JavaScript & TypeScript keywords here:
1817 // https://github.com/microsoft/TypeScript/blob/main/src/compiler/scanner.ts#L74
1818 if (Tok.isAccessSpecifierKeyword())
1819 return false;
1820 switch (Tok.Tok.getKind()) {
1821 case tok::kw_break:
1822 case tok::kw_case:
1823 case tok::kw_catch:
1824 case tok::kw_class:
1825 case tok::kw_continue:
1826 case tok::kw_const:
1827 case tok::kw_default:
1828 case tok::kw_delete:
1829 case tok::kw_do:
1830 case tok::kw_else:
1831 case tok::kw_enum:
1832 case tok::kw_export:
1833 case tok::kw_false:
1834 case tok::kw_for:
1835 case tok::kw_if:
1836 case tok::kw_import:
1837 case tok::kw_module:
1838 case tok::kw_new:
1839 case tok::kw_return:
1840 case tok::kw_static:
1841 case tok::kw_switch:
1842 case tok::kw_this:
1843 case tok::kw_throw:
1844 case tok::kw_true:
1845 case tok::kw_try:
1846 case tok::kw_typeof:
1847 case tok::kw_void:
1848 case tok::kw_while:
1849 // These are JS keywords that are lexed by LLVM/clang as keywords.
1850 return false;
1851 case tok::identifier: {
1852 // For identifiers, make sure they are true identifiers, excluding the
1853 // JavaScript pseudo-keywords (not lexed by LLVM/clang as keywords).
1854 bool IsPseudoKeyword =
1855 JsExtraKeywords.find(Tok.Tok.getIdentifierInfo()) !=
1856 JsExtraKeywords.end();
1857 return AcceptIdentifierName || !IsPseudoKeyword;
1858 }
1859 default:
1860 // Other keywords are handled in the switch below, to avoid problems due
1861 // to duplicate case labels when using the #include trick.
1862 break;
1863 }
1864
1865 switch (Tok.Tok.getKind()) {
1866 // Handle C++ keywords not included above: these are all JS identifiers.
1867#define KEYWORD(X, Y) case tok::kw_##X:
1868#include "clang/Basic/TokenKinds.def"
1869 // #undef KEYWORD is not needed -- it's #undef-ed at the end of
1870 // TokenKinds.def
1871 return true;
1872 default:
1873 // All other tokens (punctuation etc) are not JS identifiers.
1874 return false;
1875 }
1876 }
1877
1878 /// Returns \c true if \p Tok is a C# keyword, returns \c false if it is
1879 /// anything else.
1880 bool isCSharpKeyword(const FormatToken &Tok) const {
1881 if (Tok.isAccessSpecifierKeyword())
1882 return true;
1883 switch (Tok.Tok.getKind()) {
1884 case tok::kw_bool:
1885 case tok::kw_break:
1886 case tok::kw_case:
1887 case tok::kw_catch:
1888 case tok::kw_char:
1889 case tok::kw_class:
1890 case tok::kw_const:
1891 case tok::kw_continue:
1892 case tok::kw_default:
1893 case tok::kw_do:
1894 case tok::kw_double:
1895 case tok::kw_else:
1896 case tok::kw_enum:
1897 case tok::kw_explicit:
1898 case tok::kw_extern:
1899 case tok::kw_false:
1900 case tok::kw_float:
1901 case tok::kw_for:
1902 case tok::kw_goto:
1903 case tok::kw_if:
1904 case tok::kw_int:
1905 case tok::kw_long:
1906 case tok::kw_namespace:
1907 case tok::kw_new:
1908 case tok::kw_operator:
1909 case tok::kw_return:
1910 case tok::kw_short:
1911 case tok::kw_sizeof:
1912 case tok::kw_static:
1913 case tok::kw_struct:
1914 case tok::kw_switch:
1915 case tok::kw_this:
1916 case tok::kw_throw:
1917 case tok::kw_true:
1918 case tok::kw_try:
1919 case tok::kw_typeof:
1920 case tok::kw_using:
1921 case tok::kw_virtual:
1922 case tok::kw_void:
1923 case tok::kw_volatile:
1924 case tok::kw_while:
1925 return true;
1926 default:
1927 return Tok.is(tok::identifier) &&
1928 CSharpExtraKeywords.find(Tok.Tok.getIdentifierInfo()) ==
1929 CSharpExtraKeywords.end();
1930 }
1931 }
1932
1933 bool isVerilogKeywordSymbol(const FormatToken &Tok) const {
1934 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1935 }
1936
1937 bool isVerilogWordOperator(const FormatToken &Tok) const {
1938 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1939 kw_with);
1940 }
1941
1942 bool isVerilogIdentifier(const FormatToken &Tok) const {
1943 switch (Tok.Tok.getKind()) {
1944 case tok::kw_case:
1945 case tok::kw_class:
1946 case tok::kw_const:
1947 case tok::kw_continue:
1948 case tok::kw_default:
1949 case tok::kw_do:
1950 case tok::kw_else:
1951 case tok::kw_enum:
1952 case tok::kw_export:
1953 case tok::kw_extern:
1954 case tok::kw_for:
1955 case tok::kw_if:
1956 case tok::kw_import:
1957 case tok::kw_protected:
1958 case tok::kw_restrict:
1959 case tok::kw_signed:
1960 case tok::kw_static:
1961 case tok::kw_struct:
1962 case tok::kw_typedef:
1963 case tok::kw_union:
1964 case tok::kw_unsigned:
1965 case tok::kw_virtual:
1966 case tok::kw_while:
1967 return false;
1968 case tok::identifier:
1969 return isWordLike(Tok) &&
1970 VerilogExtraKeywords.find(Tok.Tok.getIdentifierInfo()) ==
1971 VerilogExtraKeywords.end();
1972 default:
1973 // getIdentifierInfo returns non-null for both identifiers and keywords.
1974 return Tok.Tok.getIdentifierInfo();
1975 }
1976 }
1977
1978 /// Returns whether \p Tok is a Verilog preprocessor directive. This is
1979 /// needed because macro expansions start with a backtick as well and they
1980 /// need to be treated differently.
1981 bool isVerilogPPDirective(const FormatToken &Tok) const {
1982 auto Info = Tok.Tok.getIdentifierInfo();
1983 if (!Info)
1984 return false;
1985 switch (Info->getPPKeywordID()) {
1986 case tok::pp_define:
1987 case tok::pp_else:
1988 case tok::pp_endif:
1989 case tok::pp_ifdef:
1990 case tok::pp_ifndef:
1991 case tok::pp_include:
1992 case tok::pp_line:
1993 case tok::pp_pragma:
1994 case tok::pp_undef:
2004 }
2005 }
2007 /// Returns whether \p Tok is a Verilog keyword that opens a block.
2008 bool isVerilogBegin(const FormatToken &Tok) const {
2009 // `table` is not included since it needs to be treated specially.
2010 if (Tok.isOneOf(kw_begin, kw_generate, kw_specify))
2011 return true;
2012 if (Tok.isNot(kw_fork))
2013 return false;
2014 const auto *Prev = Tok.getPreviousNonComment();
2015 return !(Prev && Prev->isOneOf(kw_disable, kw_wait));
2016 }
2017
2018 /// Returns whether \p Tok is a Verilog keyword that closes a block.
2019 bool isVerilogEnd(const FormatToken &Tok) const {
2020 return !Tok.endsSequence(kw_join, kw_rand) &&
2021 Tok.isOneOf(TT_MacroBlockEnd, kw_end, kw_endcase, kw_endclass,
2028 }
2029
2030 /// Returns whether \p Tok is a Verilog keyword that opens a module, etc.
2031 bool isVerilogHierarchy(const FormatToken &Tok) const {
2032 if (Tok.endsSequence(kw_function, kw_with))
2033 return false;
2034 if (Tok.is(kw_property)) {
2035 const FormatToken *Prev = Tok.getPreviousNonComment();
2036 return !(Prev &&
2037 Prev->isOneOf(tok::kw_restrict, kw_assert, kw_assume, kw_cover));
2038 }
2039 return Tok.isOneOf(tok::kw_case, tok::kw_class, kw_function, kw_module,
2040 kw_interface, kw_package, kw_casex, kw_casez, kw_checker,
2041 kw_clocking, kw_covergroup, kw_macromodule, kw_primitive,
2042 kw_program, kw_property, kw_randcase, kw_randsequence,
2043 kw_task);
2045
2046 bool isVerilogEndOfLabel(const FormatToken &Tok) const {
2047 const FormatToken *Next = Tok.getNextNonComment();
2048 // In Verilog the colon in a default label is optional.
2049 return Tok.is(TT_CaseLabelColon) ||
2050 (Tok.is(tok::kw_default) &&
2051 !(Next && Next->isOneOf(tok::colon, tok::semi, kw_clocking, kw_iff,
2053 }
2054
2055 /// Returns whether \p Tok is a Verilog keyword that starts a
2056 /// structured procedure like 'always'.
2057 bool isVerilogStructuredProcedure(const FormatToken &Tok) const {
2058 return Tok.isOneOf(kw_always, kw_always_comb, kw_always_ff, kw_always_latch,
2059 kw_final, kw_forever, kw_initial);
2060 }
2061
2062 bool isVerilogQualifier(const FormatToken &Tok) const {
2063 switch (Tok.Tok.getKind()) {
2064 case tok::kw_extern:
2065 case tok::kw_signed:
2066 case tok::kw_static:
2067 case tok::kw_unsigned:
2068 case tok::kw_virtual:
2069 return true;
2078 default:
2079 return false;
2080 }
2081 }
2082
2083 bool isTableGenDefinition(const FormatToken &Tok) const {
2084 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2085 kw_let, tok::kw_class);
2086 }
2087
2088 bool isTableGenKeyword(const FormatToken &Tok) const {
2089 switch (Tok.Tok.getKind()) {
2090 case tok::kw_class:
2091 case tok::kw_else:
2092 case tok::kw_false:
2093 case tok::kw_if:
2094 case tok::kw_int:
2095 case tok::kw_true:
2096 return true;
2097 default:
2098 return Tok.is(tok::identifier) &&
2099 TableGenExtraKeywords.find(Tok.Tok.getIdentifierInfo()) !=
2100 TableGenExtraKeywords.end();
2101 }
2102 }
2103
2104private:
2105 /// The JavaScript keywords beyond the C++ keyword set.
2106 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2107
2108 /// The C# keywords beyond the C++ keyword set.
2109 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2110
2111 /// The Verilog keywords beyond the C++ keyword set.
2112 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2113
2114 /// The TableGen keywords beyond the C++ keyword set.
2115 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2116};
2117
2118inline bool isLineComment(const FormatToken &FormatTok) {
2119 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with("/*");
2120}
2121
2122// Checks if \p FormatTok is a line comment that continues the line comment
2123// \p Previous. The original column of \p MinColumnToken is used to determine
2124// whether \p FormatTok is indented enough to the right to continue \p Previous.
2125inline bool continuesLineComment(const FormatToken &FormatTok,
2126 const FormatToken *Previous,
2127 const FormatToken *MinColumnToken) {
2128 if (!Previous || !MinColumnToken)
2129 return false;
2130 unsigned MinContinueColumn =
2131 MinColumnToken->OriginalColumn + (isLineComment(*MinColumnToken) ? 0 : 1);
2132 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2134 FormatTok.OriginalColumn >= MinContinueColumn;
2135}
2136
2137// Returns \c true if \c Current starts a new parameter.
2138bool startsNextParameter(const FormatToken &Current, const FormatStyle &Style);
2139
2140// Returns \c true if \c Tok is a function/storage specifier that may appear
2141// before a function return type (e.g. ``static``, ``inline``, ``constexpr``).
2142inline bool isReturnTypePrefixSpecifier(const FormatToken &Tok) {
2143 return Tok.isOneOf(tok::kw_static, tok::kw_extern, tok::kw_inline,
2144 tok::kw_virtual, tok::kw_constexpr, tok::kw_consteval,
2145 tok::kw_friend, tok::kw_export, tok::kw__Noreturn,
2146 tok::kw___forceinline);
2147}
2148
2149} // namespace format
2150} // namespace clang
2151
2152#endif
#define LIST_TOKEN_TYPES
Definition FormatToken.h:27
prec::Level ForcedPrecedence
Used to set an operator precedence explicitly.
StringRef TokenText
The raw text of the token.
FormatToken()
Token Tok
The Token.
std::optional< MacroExpansion > MacroCtx
FormatToken * MatchingParen
If this is a bracket, this points to the matching one.
SourceRange WhitespaceRange
The range of the whitespace immediately preceding the Token.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Various functions to configurably format source code.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines and computes precedence levels for binary/ternary operators.
static unsigned getPrecedence(tok::TokenKind Kind)
getPrecedence - Return the precedence of the specified binary operator token.
static constexpr bool isOneOf()
#define TRANSFORM_TYPE_TRAIT_DEF(Enum, _)
CommaSeparatedList(const FormatStyle &Style)
void precomputeFormattingInfos(const FormatToken *Token) override
After the TokenAnnotator has finished annotating all the tokens, this function precomputes required i...
One of these records is kept for each identifier that is lexed.
Encodes a location in the source.
A trivial tuple used to represent a source range.
virtual unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter, bool DryRun)
Same as formatFromToken, but assumes that the first token has already been set thereby deciding on th...
TokenRole(const FormatStyle &Style)
const FormatStyle & Style
Token - This structure provides full information about a lexed token.
Definition Token.h:36
The base class of the type hierarchy.
Definition TypeBase.h:1875
const FormatToken * getNamespaceToken() const
Return the actual namespace token, if this token starts a namespace block.
const char * getTokenTypeName(TokenType Type)
Determines the name of a token type.
MacroRole
Roles a token can take in a configured macro expansion.
@ MR_UnexpandedArg
The token is part of a macro argument that was previously formatted as expansion when formatting the ...
@ MR_Hidden
The token was expanded from a macro definition, and is not visible as part of the macro call.
@ MR_ExpandedArg
The token was expanded from a macro argument when formatting the expanded token sequence.
bool closesBlockOrBlockTypeList(const FormatStyle &Style) const
Same as opensBlockOrBlockTypeList, but for the closing token.
void copyFrom(const FormatToken &Tok)
FormatToken * getPreviousNonComment() const
Returns the previous token ignoring comments.
FormatToken * getPreviousOneOf(Ts... Ks) const
struct clang::format::FormatToken getPrevious(T A1) const
bool isPossibleMacro(bool AllowFollowingColonColon=false) const
Returns true if this token likely names an object-like macro.
bool isBlockIndentedInitRBrace(const FormatStyle &Style) const
Returns true if this token ends a block indented initializer list.
bool opensBlockOrBlockTypeList(const FormatStyle &Style) const
Returns true if this tokens starts a block-type list, i.e. a list that should be indented with a bloc...
bool isCppStructuredBinding(bool IsCpp) const
Returns whether the token is the left square bracket of a C++ structured binding declaration.
TokenType
Determines the semantic type of a syntactic token, e.g.
FormatToken * getNextNonComment() const
Returns the next token ignoring comments.
bool startsNextParameter(const FormatToken &Current, const FormatStyle &Style)
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
Definition TokenKinds.h:95
ObjCKeywordKind
Provides a namespace for Objective-C keywords which start with an '@'.
Definition TokenKinds.h:43
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:27
PPKeywordKind
Provides a namespace for preprocessor keywords which start with a '#' at the beginning of the line.
Definition TokenKinds.h:35
The JSON file list parser is used to communicate input to InstallAPI.
bool isLineComment(const FormatToken &FormatTok)
bool isReturnTypePrefixSpecifier(const FormatToken &Tok)
prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, bool CPlusPlus11)
Return the precedence of the specified binary operator token.
bool continuesLineComment(const FormatToken &FormatTok, const FormatToken *Previous, const FormatToken *MinColumnToken)
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 uint8_t
#define false
Definition stdbool.h:26
IdentifierInfo * kw_signals
IdentifierInfo * kw_celldefine
IdentifierInfo * kw_delay_mode_distributed
IdentifierInfo * kw_pull0
IdentifierInfo * kw_instanceof
IdentifierInfo * kw_readonly
IdentifierInfo * kw___has_include
IdentifierInfo * kw_supply1
IdentifierInfo * kw_sealed
IdentifierInfo * kw_implements
IdentifierInfo * kw_infer
IdentifierInfo * kw_output
IdentifierInfo * kw_join
IdentifierInfo * kw_sbyte
IdentifierInfo * kw_override
IdentifierInfo * kw_always
IdentifierInfo * kw_endchecker
IdentifierInfo * kw___except
IdentifierInfo * kw_unchecked
IdentifierInfo * kw_vectored
IdentifierInfo * kw_specparam
IdentifierInfo * kw_decimal
IdentifierInfo * kw_default_decay_time
IdentifierInfo * kw_binsof
IdentifierInfo * kw_extend
IdentifierInfo * kw_await
IdentifierInfo * kw_def
IdentifierInfo * kw_extends
IdentifierInfo * kw_base
IdentifierInfo * kw_coverpoint
IdentifierInfo * kw_begin_keywords
IdentifierInfo * kw_assert
IdentifierInfo * kw_async
IdentifierInfo * kw_CF_ENUM
IdentifierInfo * kw_qslots
IdentifierInfo * kw_null
IdentifierInfo * kw_nounconnected_drive
IdentifierInfo * kw_trireg
IdentifierInfo * kw_join_any
IdentifierInfo * kw_from
IdentifierInfo * kw_solve
IdentifierInfo * kw_abstract
IdentifierInfo * kw_default_nettype
IdentifierInfo * kw_task
IdentifierInfo * kw_ifnone
IdentifierInfo * kw_highz1
IdentifierInfo * kw_unique0
IdentifierInfo * kw_input
IdentifierInfo * kw_randc
IdentifierInfo * kw_always_ff
IdentifierInfo * kw_byte
IdentifierInfo * kw_medium
IdentifierInfo * kw_weak0
IdentifierInfo * kw_protect
IdentifierInfo * kw_undefineall
IdentifierInfo * kw_sequence
IdentifierInfo * kw_event
IdentifierInfo * kw_foreach
IdentifierInfo * kw_apostrophe
IdentifierInfo * kw_weak1
IdentifierInfo * kw_program
IdentifierInfo * kw_required
IdentifierInfo * kw_fixed
IdentifierInfo * kw_assign
IdentifierInfo * kw_dist
IdentifierInfo * kw_var
IdentifierInfo * kw_initial
IdentifierInfo * kw_macromodule
IdentifierInfo * kw_code
bool isVerilogKeywordSymbol(const FormatToken &Tok) const
IdentifierInfo * kw_ref
IdentifierInfo * kw_property
bool isVerilogBegin(const FormatToken &Tok) const
Returns whether Tok is a Verilog keyword that opens a block.
IdentifierInfo * kw_CF_OPTIONS
IdentifierInfo * kw_tagged
IdentifierInfo * kw_interface
IdentifierInfo * kw_before
IdentifierInfo * kw_local
IdentifierInfo * kw___has_include_next
IdentifierInfo * kw_tri
IdentifierInfo * kw_synchronized
IdentifierInfo * kw_params
IdentifierInfo * kw_endtable
IdentifierInfo * kw_endpackage
IdentifierInfo * kw_function
IdentifierInfo * kw_list
IdentifierInfo * kw_yield
IdentifierInfo * kw_automatic
IdentifierInfo * kw_declare
IdentifierInfo * kw_endcelldefine
IdentifierInfo * kw_checker
IdentifierInfo * kw_verilogHash
IdentifierInfo * kw_digest_decrypt_key
IdentifierInfo * kw_multiclass
IdentifierInfo * kw_internal
IdentifierInfo * kw_soft
IdentifierInfo * kw_returns
IdentifierInfo * kw_supply0
IdentifierInfo * kw_when
IdentifierInfo * kw_large
IdentifierInfo * kw_endclocking
IdentifierInfo * kw_endfunction
IdentifierInfo * kw_endprimitive
IdentifierInfo * kw_implicit
IdentifierInfo * kw_where
IdentifierInfo * kw_randcase
IdentifierInfo * kw_rand
IdentifierInfo * kw_NS_OPTIONS
IdentifierInfo * kw_triand
IdentifierInfo * kw_inside
IdentifierInfo * kw_defm
IdentifierInfo * kw_native
IdentifierInfo * kw_get
IdentifierInfo * kw_clocking
IdentifierInfo * kw_typeof
IdentifierInfo * kw_join_none
IdentifierInfo * kw_wand
IdentifierInfo * kw_endcase
IdentifierInfo * kw_intersect
IdentifierInfo * kw_include
IdentifierInfo * kw_tri0
IdentifierInfo * kw_then
IdentifierInfo * kw_primitive
IdentifierInfo * kw_record
IdentifierInfo * kw_string
IdentifierInfo * kw_begin
IdentifierInfo * kw_throws
IdentifierInfo * kw_slots
IdentifierInfo * kw_elsif
IdentifierInfo * kw_NS_ENUM
IdentifierInfo * kw_end
IdentifierInfo * kw_set
IdentifierInfo * kw_key_block
IdentifierInfo * kw_parameter
IdentifierInfo * kw_fork
IdentifierInfo * kw_endtask
IdentifierInfo * kw_NS_CLOSED_ENUM
IdentifierInfo * kw_mark
IdentifierInfo * kw_unconnected_drive
IdentifierInfo * kw_option
IdentifierInfo * kw_negedge
IdentifierInfo * kw_unique
IdentifierInfo * kw_wire
IdentifierInfo * kw_timescale
IdentifierInfo * kw_package
IdentifierInfo * kw_generate
IdentifierInfo * kw_constraint
IdentifierInfo * kw_endprogram
IdentifierInfo * kw_iff
IdentifierInfo * kw_delay_mode_unit
IdentifierInfo * kw_always_comb
IdentifierInfo * kw_module
IdentifierInfo * kw_stackalloc
IdentifierInfo * kw_bins
IdentifierInfo * kw_delay_mode_path
IdentifierInfo * kw_let
bool isWordLike(const FormatToken &Tok, bool IsVerilog=true) const
Returns true if Tok is a keyword or an identifier.
IdentifierInfo * kw_trior
IdentifierInfo * kw_qsignals
IdentifierInfo * kw_dump
IdentifierInfo * kw_specify
IdentifierInfo * kw_out
IdentifierInfo * kw_endproperty
IdentifierInfo * kw_endclass
IdentifierInfo * kw_digest_block
IdentifierInfo * kw_data_public_key
IdentifierInfo * kw_uint
IdentifierInfo * kw_internal_ident_after_define
IdentifierInfo * kw_randsequence
IdentifierInfo * kw_data_block
IdentifierInfo * kw_checked
IdentifierInfo * kw_key_public_key
IdentifierInfo * kw_endmodule
IdentifierInfo * kw_ulong
IdentifierInfo * kw_casex
IdentifierInfo * kw_defvar
IdentifierInfo * kw_scalared
IdentifierInfo * kw_strong1
IdentifierInfo * kw_wor
IdentifierInfo * kw_wait
IdentifierInfo * kw_delegate
IdentifierInfo * kw_ignore_bins
IdentifierInfo * kw_type
IdentifierInfo * kw_lock
IdentifierInfo * kw_small
IdentifierInfo * kw_cover
IdentifierInfo * kw_disable
IdentifierInfo * kw_always_latch
IdentifierInfo * kw_final
IdentifierInfo * kw_posedge
IdentifierInfo * kw_region
IdentifierInfo * kw_wildcard
IdentifierInfo * kw_with
IdentifierInfo * kw_bits
IdentifierInfo * kw_edge
IdentifierInfo * kw_forever
IdentifierInfo * kw_optional
IdentifierInfo * kw_default_trireg_strength
IdentifierInfo * kw_assume
IdentifierInfo * kw_dollar
IdentifierInfo * kw_verilogHashHash
IdentifierInfo * kw_casez
IdentifierInfo * kw_init
IdentifierInfo * kw_pure
IdentifierInfo * kw_dag
IdentifierInfo * kw_endgroup
IdentifierInfo * kw_delay_mode_zero
IdentifierInfo * kw_strong0
IdentifierInfo * kw_illegal_bins
IdentifierInfo * kw_priority
IdentifierInfo * kw_ushort
IdentifierInfo * kw_localparam
IdentifierInfo * kw_object
IdentifierInfo * kw_context
IdentifierInfo * kw_endsequence
IdentifierInfo * kw_inout
IdentifierInfo * kw_defset
IdentifierInfo * kw_end_keywords
IdentifierInfo * kw_matches
IdentifierInfo * kw_uwire
IdentifierInfo * kw_endspecify
IdentifierInfo * kw_data_decrypt_key
IdentifierInfo * kw_CF_CLOSED_ENUM
IdentifierInfo * kw_digest_public_key
IdentifierInfo * kw_sample
IdentifierInfo * kw_packed
IdentifierInfo * kw_unsafe
IdentifierInfo * kw_interconnect
IdentifierInfo * kw_tri1
IdentifierInfo * kw_pull1
IdentifierInfo * kw_NS_ERROR_ENUM
IdentifierInfo * kw_covergroup
IdentifierInfo * kw_repeat
bool isVerilogEnd(const FormatToken &Tok) const
Returns whether Tok is a Verilog keyword that closes a block.
IdentifierInfo * kw_endinterface
IdentifierInfo * kw_highz0
IdentifierInfo * kw_repeated
IdentifierInfo * kw_endgenerate
IdentifierInfo * kw_bit
IdentifierInfo * kw_table
IdentifierInfo * kw_import
IdentifierInfo * kw_resetall
IdentifierInfo * kw_finally
A wrapper around a Token storing information about the whitespace characters preceding it.
unsigned NestingLevel
The nesting level of this token, i.e.
unsigned MustBreakBeforeFinalized
Whether MustBreakBefore is finalized during parsing and must not be reset between runs.
unsigned FakeRParens
Insert this many fake ) after this token for correct indentation.
bool ArrayInitializerLineStart
This notes the start of the line of an array initializer.
bool Optional
Is optional and can be removed.
bool MacroParent
When macro expansion introduces nodes with children, those are marked as MacroParent.
bool is(ParameterPackingKind PPK) const
int Newlines
The number of newlines immediately before the Token after formatting.
SmallVector< AnnotatedLine *, 1 > Children
If this token starts a block, this contains all the unwrapped lines in it.
bool closesScopeAfterBlock() const
prec::Level ForcedPrecedence
Used to set an operator precedence explicitly.
unsigned BindingStrength
The binding strength of a token.
unsigned StartsBinaryExpression
true if this token starts a binary expression, i.e.
void setPackingKind(ParameterPackingKind K)
unsigned ClosesTemplateDeclaration
true if this is the ">" of "template<..>".
unsigned OperatorIndex
If this is an operator (or "."/"->") in a sequence of operators with the same precedence,...
bool MightBeFunctionDeclParen
Might be function declaration open/closing paren.
unsigned OriginalColumn
The original 0-based column of this token, including expanded tabs.
unsigned ContinuesLineCommentSection
Does this line comment continue a line comment section?
unsigned CanBreakBefore
true if it is allowed to break before this token.
bool isNot(T Kind) const
StringRef TokenText
The raw text of the token.
unsigned LongestObjCSelectorName
If this is the first ObjC selector name in an ObjC method definition or call, this contains the lengt...
ParameterPackingKind getPackingKind() const
unsigned HasEnumTrailingCommaHandled
true if a comma has been inserted or removed after the token.
tok::TokenKind ParentBracket
If this is a bracket ("<", "(", "[" or "{"), contains the kind of the surrounding bracket.
unsigned LastNewlineOffset
The offset just past the last ' ' in this token's leading whitespace (relative to WhiteSpaceStart).
unsigned SplitPenalty
Penalty for inserting a line break before this token.
void setDecision(FormatDecision D)
SmallVector< prec::Level, 4 > FakeLParens
Stores the number of required fake parentheses and the corresponding operator precedence.
unsigned Finalized
If true, this token has been fully formatted (indented and potentially re-formatted inside),...
std::optional< MacroExpansion > MacroCtx
BraceBlockKind getBlockKind() const
bool isNoneOf(Ts... Ks) const
FormatToken * Next
The next token in the unwrapped line.
unsigned IsMultiline
Whether the token text contains newlines (escaped or not).
unsigned EndsCppAttributeGroup
true if this token ends a group of C++ attributes.
unsigned NewlinesBefore
The number of newlines immediately before the Token.
void setBlockKind(BraceBlockKind BBK)
bool isIf(bool AllowConstexprMacro=true) const
unsigned SpacesRequiredBefore
The number of spaces that should be inserted before this token.
std::shared_ptr< TokenRole > Role
A token can have a special role that can carry extra information about the token's formatting.
unsigned MustBreakBefore
Whether there must be a line break before this token.
unsigned HasUnescapedNewline
Whether there is at least one unescaped newline before the Token.
unsigned PartOfMultiVariableDeclStmt
Is this token part of a DeclStmt defining multiple variables?
unsigned ColumnWidth
The width of the non-whitespace parts of the token (or its first line for multi-line tokens) in colum...
unsigned ObjCSelectorNameParts
If this is the first ObjC selector name in an ObjC method definition or call, this contains the numbe...
bool FirstAfterPPLine
Is the first token after a preprocessor line.
void setType(TokenType T)
bool HasFormFeedBefore
Has "\n\f\n" or "\n\f\r\n" before TokenText.
bool IsArrayInitializer
This starts an array initializer.
unsigned EndsBinaryExpression
true if this token ends a binary expression.
unsigned UnbreakableTailLength
The length of following tokens until the next natural split point, or the next token that can be brok...
FormatDecision getDecision() const
bool is(tok::TokenKind Kind) const
unsigned LastLineColumnWidth
Contains the width in columns of the last line of a multi-line token.
unsigned IndentLevel
The indent level of this token. Copied from the surrounding line.
unsigned BlockParameterCount
Number of parameters that are nested blocks, if this is "(", "[" or "<".
unsigned TotalLength
The total length of the unwrapped line up to and including this token.
bool isOneOf(A K1, B K2) const
TokenType getType() const
Returns the token's type, e.g.
unsigned IsFirst
Indicates that this is the first token of the file.
unsigned AppliedIndentLevel
Block + continuation indent level, applied by the WhitespaceManager to this token.
unsigned IsUnterminatedLiteral
Set to true if this token is an unterminated literal.
unsigned ClosesRequiresClause
true if this is the last token within requires clause.
unsigned ParameterIndex
The 0-based index of the parameter/argument.
int8_t BraceCount
Number of optional braces to be inserted after this token: -1: a single left brace 0: no braces >0: n...
unsigned ParameterCount
Number of parameters, if this is "(", "[" or "<".
bool StartsColumn
The first token in set of column elements.
SourceRange WhitespaceRange
The range of the whitespace immediately preceding the Token.
FormatToken * NextOperator
If this is an operator (or "."/"->") in a sequence of operators with the same precedence,...
bool isLoop(const FormatStyle &Style) const
FormatToken * MatchingParen
If this is a bracket, this points to the matching one.
void overwriteFixedType(TokenType T)
FormatToken * Previous
The previous token in the unwrapped line.
void setFinalizedType(TokenType T)
Sets the type and also the finalized flag.
llvm::SmallVector< FormatToken *, 1 > ExpandedFrom
The stack of macro call identifier tokens this token was expanded from.
unsigned StartOfExpansion
The number of expansions of which this macro is the first entry.
MacroRole Role
The token's role in the macro expansion.
unsigned EndOfExpansion
The number of currently open expansions in ExpandedFrom this macro is the last token in.