15#ifndef LLVM_CLANG_LIB_FORMAT_FORMATTOKEN_H
16#define LLVM_CLANG_LIB_FORMAT_FORMATTOKEN_H
22#include <unordered_set>
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) \
42 TYPE(BracedListLBrace) \
43 TYPE(CaseLabelArrow) \
45 TYPE(CaseLabelColon) \
51 TYPE(CompoundRequirementLBrace) \
53 TYPE(ConditionalExpr) \
55 TYPE(ConditionLParen) \
56 TYPE(ConflictAlternative) \
60 TYPE(ControlStatementLBrace) \
61 TYPE(ControlStatementRBrace) \
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) \
82 TYPE(EnumUnderlyingTypeColon) \
85 TYPE(FunctionAnnotationRParen) \
86 TYPE(FunctionDeclarationName) \
87 TYPE(FunctionDeclarationLParen) \
88 TYPE(FunctionLBrace) \
89 TYPE(FunctionLikeMacro) \
90 TYPE(FunctionLikeOrFreestandingMacro) \
91 TYPE(FunctionTypeLParen) \
93 TYPE(GenericSelectionColon) \
95 TYPE(GotoLabelColon) \
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) \
112 TYPE(JsTypeOperator) \
113 TYPE(JsTypeOptionalQuestion) \
115 TYPE(LambdaDefinitionLParen) \
117 TYPE(LambdaLSquare) \
118 TYPE(LeadingJavaAnnotation) \
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) \
138 TYPE(ObjCMethodExpr) \
140 TYPE(ObjCMethodSpecifier) \
145 TYPE(ObjCStringLiteral) \
146 TYPE(OverloadedOperator) \
147 TYPE(OverloadedOperatorLParen) \
148 TYPE(PointerOrReference) \
149 TYPE(ProtoExtensionLSquare) \
150 TYPE(PureVirtualSpecifier) \
152 TYPE(RangeBasedForLoopColon) \
156 TYPE(RequiresClause) \
157 TYPE(RequiresClauseInARequiresExpression) \
158 TYPE(RequiresExpression) \
159 TYPE(RequiresExpressionLBrace) \
160 TYPE(RequiresExpressionLParen) \
166 TYPE(StatementAttributeLikeMacro) \
167 TYPE(StatementMacro) \
172 TYPE(StringInConcatenation) \
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) \
205 TYPE(TypenameMacro) \
206 TYPE(UnaryOperator) \
209 TYPE(UntouchableMacroFunc) \
210 TYPE(VariableTemplate) \
212 TYPE(VerilogAssignComma) \
214 TYPE(VerilogBlockLabelColon) \
218 TYPE(VerilogDimensionedTypeName) \
220 TYPE(VerilogInstancePortComma) \
221 TYPE(VerilogInstancePortLParen) \
224 TYPE(VerilogMultiLineListLParen) \
226 TYPE(VerilogNumberBase) \
229 TYPE(VerilogProtected) \
231 TYPE(VerilogStrength) \
233 TYPE(VerilogTableItem) \
235 TYPE(VerilogTypeComma) \
241#define TYPE(X) TT_##X,
336 TypeIsFinalized(
false), Type(TT_Unknown) {}
351 std::shared_ptr<TokenRole>
Role;
417 unsigned BlockKind : 2;
425 assert(
getBlockKind() == BBK &&
"BraceBlockKind overflow!");
430 unsigned Decision : 2;
438 assert(
getDecision() == D &&
"FormatDecision overflow!");
443 unsigned PackingKind : 2;
451 assert(
getPackingKind() == K &&
"ParameterPackingKind overflow!");
455 unsigned TypeIsFinalized : 1;
468 assert((!TypeIsFinalized || T == Type) &&
469 "Please use overwriteFixedType to change a fixed type.");
480 TypeIsFinalized =
true;
485 TypeIsFinalized =
false;
639 std::optional<MacroExpansion>
MacroCtx;
652 return Tok.getObjCKeywordID() == Kind;
656 return II && II ==
Tok.getIdentifierInfo();
659 return Tok.getIdentifierInfo() &&
660 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
665 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
666 return is(K1) ||
is(K2);
668 template <
typename A,
typename B,
typename... Ts>
672 template <
typename T>
bool isNot(T Kind)
const {
return !
is(Kind); }
673 template <
typename... Ts>
bool isNoneOf(Ts... Ks)
const {
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);
682 bool isLoop(
const FormatStyle &Style)
const {
683 return isOneOf(tok::kw_for, tok::kw_while) ||
692 return Previous->closesScopeAfterBlock();
698 template <
typename A,
typename... Ts>
699 bool startsSequence(A K1, Ts... Tokens)
const {
700 return startsSequenceInternal(K1, Tokens...);
709 template <
typename A,
typename... Ts>
710 bool endsSequence(A K1, Ts... Tokens)
const {
711 return endsSequenceInternal(K1, Tokens...);
716 bool isAttribute()
const {
717 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
720 bool isAccessSpecifierKeyword()
const {
721 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
724 bool isAccessSpecifier(
bool ColonRequired =
true)
const {
725 if (!isAccessSpecifierKeyword())
730 return NextNonComment && NextNonComment->is(tok::colon);
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) ||
741 [[nodiscard]]
bool isQtProperty()
const;
742 [[nodiscard]]
bool isTypeName(
const LangOptions &LangOpts)
const;
743 [[nodiscard]]
bool isTypeOrIdentifier(
const LangOptions &LangOpts)
const;
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);
751 bool isObjCLifetimeQualifier(
const FormatStyle &Style)
const {
752 if (Style.Language != FormatStyle::LK_ObjC ||
isNot(tok::identifier) ||
763 bool opensScope()
const {
764 if (
is(TT_TemplateString) &&
TokenText.ends_with(
"${"))
766 if (
is(TT_DictLiteral) &&
is(tok::less))
768 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
773 bool closesScope()
const {
774 if (
is(TT_TemplateString) &&
TokenText.starts_with(
"}"))
776 if (
is(TT_DictLiteral) &&
is(tok::greater))
778 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
783 bool isMemberAccess()
const {
784 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
785 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
786 TT_LambdaArrow, TT_LeadingJavaAnnotation);
789 bool isPointerOrReference()
const {
790 return isOneOf(tok::star, tok::amp, tok::ampamp);
793 bool isPlacementOperator()
const {
794 return isOneOf(tok::kw_new, tok::kw_delete);
797 bool isUnaryOperator()
const {
798 switch (
Tok.getKind()) {
802 case tok::minusminus:
806 case tok::kw_alignof:
813 bool isBinaryOperator()
const {
818 bool isTrailingComment()
const {
819 return is(tok::comment) &&
820 (
is(TT_LineComment) || !
Next ||
Next->NewlinesBefore > 0);
825 bool isFunctionLikeKeyword()
const {
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,
834#include
"clang/Basic/TransformTypeTraits.def"
840 bool isLabelString()
const {
841 if (
isNot(tok::string_literal))
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() ==
'=');
864 bool hasWhitespaceBefore()
const {
877 while (
Tok &&
Tok->isNot(A1))
882 template <
typename... Ts>
885 while (
Tok && (
Tok->isNot(Ks) && ...))
893 while (
Tok &&
Tok->is(tok::comment))
922 if (Prev && Prev->is(tok::coloncolon))
924 if (!AllowFollowingColonColon) {
943 if (!IsCpp ||
isNot(tok::l_square))
947 T = T->getPreviousNonComment();
948 }
while (T && T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
950 return T && T->is(tok::kw_auto);
955 if (
is(TT_TemplateString) && closesScope())
964 if (
is(tok::comment))
965 NamespaceTok = NamespaceTok->getNextNonComment();
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)
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...);
989 template <
typename A>
bool startsSequenceInternal(A K1)
const {
990 if (
is(tok::comment) &&
Next)
991 return Next->startsSequenceInternal(K1);
995 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
997 return Previous->endsSequenceInternal(K1);
1001 template <
typename A,
typename... Ts>
1002 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
1004 return Previous->endsSequenceInternal(K1, Tokens...);
1009class ContinuationIndenter;
1027 virtual unsigned formatFromToken(LineState &State,
1028 ContinuationIndenter *Indenter,
1036 ContinuationIndenter *Indenter,
1042 virtual void CommaFound(
const FormatToken *Token) {}
1047 const FormatStyle &Style;
1050class CommaSeparatedList :
public TokenRole {
1053 : TokenRole(Style), HasNestedBracedList(
false) {}
1057 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1058 bool DryRun)
override;
1060 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1061 bool DryRun)
override;
1064 void CommaFound(
const FormatToken *Token)
override {
1065 Commas.push_back(Token);
1071 return Commas.back();
1077 struct ColumnFormat {
1082 unsigned TotalWidth;
1093 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
1105 bool HasNestedBracedList;
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");
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");
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");
1159 kw_mark = &IdentTable.get(
"mark");
1160 kw_region = &IdentTable.get(
"region");
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");
1175 kw_internal_ident_after_define =
1176 &IdentTable.get(
"__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
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");
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");
1353 kw_verilogHash = &IdentTable.get(
"#");
1354 kw_verilogHashHash = &IdentTable.get(
"##");
1355 kw_apostrophe = &IdentTable.get(
"\'");
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");
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,
1379 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
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});
1393 VerilogExtraKeywords =
1394 std::unordered_set<IdentifierInfo *>{kw_always,
1526 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>{
1805 return Tok.Tok.getIdentifierInfo() &&
1815 bool AcceptIdentifierName =
true)
const {
1818 if (
Tok.isAccessSpecifierKeyword())
1820 switch (
Tok.Tok.getKind()) {
1825 case tok::kw_continue:
1827 case tok::kw_default:
1828 case tok::kw_delete:
1832 case tok::kw_export:
1836 case tok::kw_import:
1837 case tok::kw_module:
1839 case tok::kw_return:
1840 case tok::kw_static:
1841 case tok::kw_switch:
1846 case tok::kw_typeof:
1851 case tok::identifier: {
1854 bool IsPseudoKeyword =
1855 JsExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
1856 JsExtraKeywords.end();
1857 return AcceptIdentifierName || !IsPseudoKeyword;
1865 switch (
Tok.Tok.getKind()) {
1867#define KEYWORD(X, Y) case tok::kw_##X:
1868#include "clang/Basic/TokenKinds.def"
1881 if (
Tok.isAccessSpecifierKeyword())
1883 switch (
Tok.Tok.getKind()) {
1891 case tok::kw_continue:
1892 case tok::kw_default:
1894 case tok::kw_double:
1897 case tok::kw_explicit:
1898 case tok::kw_extern:
1906 case tok::kw_namespace:
1908 case tok::kw_operator:
1909 case tok::kw_return:
1911 case tok::kw_sizeof:
1912 case tok::kw_static:
1913 case tok::kw_struct:
1914 case tok::kw_switch:
1919 case tok::kw_typeof:
1921 case tok::kw_virtual:
1923 case tok::kw_volatile:
1927 return Tok.is(tok::identifier) &&
1928 CSharpExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1929 CSharpExtraKeywords.end();
1934 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1938 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1943 switch (
Tok.Tok.getKind()) {
1947 case tok::kw_continue:
1948 case tok::kw_default:
1952 case tok::kw_export:
1953 case tok::kw_extern:
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:
1964 case tok::kw_unsigned:
1965 case tok::kw_virtual:
1968 case tok::identifier:
1970 VerilogExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1971 VerilogExtraKeywords.end();
1974 return Tok.Tok.getIdentifierInfo();
1982 auto Info =
Tok.Tok.getIdentifierInfo();
1985 switch (Info->getPPKeywordID()) {
1986 case tok::pp_define:
1990 case tok::pp_ifndef:
1991 case tok::pp_include:
1993 case tok::pp_pragma:
2014 const auto *Prev =
Tok.getPreviousNonComment();
2032 if (
Tok.endsSequence(kw_function, kw_with))
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,
2049 return Tok.is(TT_CaseLabelColon) ||
2050 (
Tok.is(tok::kw_default) &&
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);
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:
2070 case tok::identifier:
2084 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2085 kw_let, tok::kw_class);
2089 switch (
Tok.Tok.getKind()) {
2098 return Tok.is(tok::identifier) &&
2099 TableGenExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
2100 TableGenExtraKeywords.end();
2106 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2109 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2112 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2115 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2119 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with(
"/*");
2130 unsigned MinContinueColumn =
2131 MinColumnToken->OriginalColumn + (
isLineComment(*MinColumnToken) ? 0 : 1);
2132 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2134 FormatTok.OriginalColumn >= MinContinueColumn;
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);
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.
The base class of the type hierarchy.
bool isStringLiteral(TokenKind K)
Return true if this is a C or C++ string-literal (or C++11 user-defined-string-literal) token.
ObjCKeywordKind
Provides a namespace for Objective-C keywords which start with an '@'.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
PPKeywordKind
Provides a namespace for preprocessor keywords which start with a '#' at the beginning of the line.
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
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_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_extends
IdentifierInfo * kw_coverpoint
IdentifierInfo * kw_begin_keywords
IdentifierInfo * kw_assert
IdentifierInfo * kw_async
IdentifierInfo * kw_CF_ENUM
IdentifierInfo * kw_qslots
IdentifierInfo * kw_nounconnected_drive
IdentifierInfo * kw_trireg
IdentifierInfo * kw_join_any
IdentifierInfo * kw_solve
IdentifierInfo * kw_abstract
IdentifierInfo * kw_default_nettype
IdentifierInfo * kw_ifnone
IdentifierInfo * kw_highz1
IdentifierInfo * kw_unique0
IdentifierInfo * kw_input
IdentifierInfo * kw_randc
IdentifierInfo * kw_always_ff
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_initial
IdentifierInfo * kw_macromodule
bool isVerilogKeywordSymbol(const FormatToken &Tok) const
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_synchronized
IdentifierInfo * kw_params
IdentifierInfo * kw_endtable
IdentifierInfo * kw_endpackage
IdentifierInfo * kw_function
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_returns
IdentifierInfo * kw_supply0
IdentifierInfo * kw_large
IdentifierInfo * kw_endclocking
IdentifierInfo * kw_endfunction
IdentifierInfo * kw_endprimitive
IdentifierInfo * kw_implicit
IdentifierInfo * kw_where
IdentifierInfo * kw_randcase
IdentifierInfo * kw_NS_OPTIONS
IdentifierInfo * kw_triand
IdentifierInfo * kw_inside
IdentifierInfo * kw_native
IdentifierInfo * kw_clocking
IdentifierInfo * kw_typeof
IdentifierInfo * kw_join_none
IdentifierInfo * kw_endcase
IdentifierInfo * kw_intersect
IdentifierInfo * kw_include
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_key_block
IdentifierInfo * kw_parameter
IdentifierInfo * kw_endtask
IdentifierInfo * kw_NS_CLOSED_ENUM
IdentifierInfo * kw_unconnected_drive
IdentifierInfo * kw_option
IdentifierInfo * kw_negedge
IdentifierInfo * kw_unique
IdentifierInfo * kw_timescale
IdentifierInfo * kw_package
IdentifierInfo * kw_generate
IdentifierInfo * kw_constraint
IdentifierInfo * kw_endprogram
IdentifierInfo * kw_delay_mode_unit
IdentifierInfo * kw_always_comb
IdentifierInfo * kw_module
IdentifierInfo * kw_stackalloc
IdentifierInfo * kw_delay_mode_path
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_specify
IdentifierInfo * kw_endproperty
IdentifierInfo * kw_endclass
IdentifierInfo * kw_digest_block
IdentifierInfo * kw_data_public_key
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_delegate
IdentifierInfo * kw_ignore_bins
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_forever
IdentifierInfo * kw_optional
IdentifierInfo * kw_default_trireg_strength
IdentifierInfo * kw_assume
IdentifierInfo * kw_dollar
IdentifierInfo * kw_verilogHashHash
IdentifierInfo * kw_casez
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_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_table
IdentifierInfo * kw_import
IdentifierInfo * kw_resetall
IdentifierInfo * kw_finally