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) \
86 TYPE(FunctionAnnotationRParen) \
87 TYPE(FunctionDeclarationName) \
88 TYPE(FunctionDeclarationLParen) \
89 TYPE(FunctionLBrace) \
90 TYPE(FunctionLikeMacro) \
91 TYPE(FunctionLikeOrFreestandingMacro) \
92 TYPE(FunctionTypeLParen) \
94 TYPE(GenericSelectionColon) \
96 TYPE(GotoLabelColon) \
98 TYPE(ImplicitStringLiteral) \
99 TYPE(InheritanceColon) \
100 TYPE(InheritanceComma) \
101 TYPE(InlineASMBrace) \
102 TYPE(InlineASMColon) \
103 TYPE(InlineASMParen) \
104 TYPE(InlineASMSymbolicNameLSquare) \
105 TYPE(JavaAnnotation) \
106 TYPE(JsAndAndEqual) \
107 TYPE(JsComputedPropertyName) \
108 TYPE(JsExponentiation) \
109 TYPE(JsExponentiationEqual) \
110 TYPE(JsPipePipeEqual) \
111 TYPE(JsPrivateIdentifier) \
113 TYPE(JsTypeOperator) \
114 TYPE(JsTypeOptionalQuestion) \
116 TYPE(LambdaDefinitionLParen) \
118 TYPE(LambdaLSquare) \
119 TYPE(LeadingJavaAnnotation) \
121 TYPE(MacroBlockBegin) \
122 TYPE(MacroBlockEnd) \
123 TYPE(ModulePartitionColon) \
124 TYPE(NamespaceLBrace) \
125 TYPE(NamespaceMacro) \
126 TYPE(NamespaceRBrace) \
127 TYPE(NonNullAssertion) \
128 TYPE(NullCoalescingEqual) \
129 TYPE(NullCoalescingOperator) \
130 TYPE(NullPropagatingOperator) \
131 TYPE(ObjCBlockLBrace) \
132 TYPE(ObjCBlockLParen) \
139 TYPE(ObjCMethodExpr) \
141 TYPE(ObjCMethodSpecifier) \
146 TYPE(ObjCStringLiteral) \
147 TYPE(OverloadedOperator) \
148 TYPE(OverloadedOperatorLParen) \
149 TYPE(PointerOrReference) \
150 TYPE(ProtoExtensionLSquare) \
151 TYPE(PureVirtualSpecifier) \
153 TYPE(RangeBasedForLoopColon) \
157 TYPE(RequiresClause) \
158 TYPE(RequiresClauseInARequiresExpression) \
159 TYPE(RequiresExpression) \
160 TYPE(RequiresExpressionLBrace) \
161 TYPE(RequiresExpressionLParen) \
167 TYPE(StatementAttributeLikeMacro) \
168 TYPE(StatementMacro) \
173 TYPE(StringInConcatenation) \
176 TYPE(StructuredBindingLSquare) \
177 TYPE(SwitchExpressionLabel) \
178 TYPE(SwitchExpressionLBrace) \
179 TYPE(TableGenBangOperator) \
180 TYPE(TableGenCondOperator) \
181 TYPE(TableGenCondOperatorColon) \
182 TYPE(TableGenCondOperatorComma) \
183 TYPE(TableGenDAGArgCloser) \
184 TYPE(TableGenDAGArgListColon) \
185 TYPE(TableGenDAGArgListColonToAlign) \
186 TYPE(TableGenDAGArgListComma) \
187 TYPE(TableGenDAGArgListCommaToBreak) \
188 TYPE(TableGenDAGArgOpener) \
189 TYPE(TableGenDAGArgOpenerToBreak) \
190 TYPE(TableGenDAGArgOperatorID) \
191 TYPE(TableGenDAGArgOperatorToBreak) \
192 TYPE(TableGenListCloser) \
193 TYPE(TableGenListOpener) \
194 TYPE(TableGenMultiLineString) \
195 TYPE(TableGenTrailingPasteOperator) \
196 TYPE(TableGenValueSuffix) \
197 TYPE(TemplateCloser) \
198 TYPE(TemplateOpener) \
199 TYPE(TemplateString) \
200 TYPE(TrailingAnnotation) \
201 TYPE(TrailingReturnArrow) \
202 TYPE(TrailingUnaryOperator) \
203 TYPE(TypeDeclarationParen) \
206 TYPE(TypenameMacro) \
207 TYPE(UnaryOperator) \
210 TYPE(UntouchableMacroFunc) \
211 TYPE(VariableTemplate) \
213 TYPE(VerilogAssignComma) \
215 TYPE(VerilogBlockLabelColon) \
219 TYPE(VerilogDimensionedTypeName) \
221 TYPE(VerilogInstancePortComma) \
222 TYPE(VerilogInstancePortLParen) \
225 TYPE(VerilogMultiLineListLParen) \
227 TYPE(VerilogNumberBase) \
230 TYPE(VerilogProtected) \
232 TYPE(VerilogStrength) \
234 TYPE(VerilogTableItem) \
236 TYPE(VerilogTypeComma) \
242#define TYPE(X) TT_##X,
337 TypeIsFinalized(
false), Type(TT_Unknown) {}
352 std::shared_ptr<TokenRole>
Role;
418 unsigned BlockKind : 2;
426 assert(
getBlockKind() == BBK &&
"BraceBlockKind overflow!");
431 unsigned Decision : 2;
439 assert(
getDecision() == D &&
"FormatDecision overflow!");
444 unsigned PackingKind : 2;
452 assert(
getPackingKind() == K &&
"ParameterPackingKind overflow!");
456 unsigned TypeIsFinalized : 1;
469 assert((!TypeIsFinalized ||
T == Type) &&
470 "Please use overwriteFixedType to change a fixed type.");
481 TypeIsFinalized =
true;
486 TypeIsFinalized =
false;
640 std::optional<MacroExpansion>
MacroCtx;
653 return Tok.getObjCKeywordID() == Kind;
657 return II && II ==
Tok.getIdentifierInfo();
660 return Tok.getIdentifierInfo() &&
661 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
666 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
667 return is(K1) ||
is(K2);
669 template <
typename A,
typename B,
typename... Ts>
673 template <
typename T>
bool isNot(
T Kind)
const {
return !
is(Kind); }
674 template <
typename... Ts>
bool isNoneOf(Ts... Ks)
const {
678 bool isIf(
bool AllowConstexprMacro =
true)
const {
679 return is(tok::kw_if) || endsSequence(tok::kw_constexpr, tok::kw_if) ||
680 (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
684 return isOneOf(tok::kw_for, tok::kw_while) ||
693 return Previous->closesScopeAfterBlock();
699 template <
typename A,
typename... Ts>
700 bool startsSequence(A K1, Ts... Tokens)
const {
701 return startsSequenceInternal(K1, Tokens...);
710 template <
typename A,
typename... Ts>
711 bool endsSequence(A K1, Ts... Tokens)
const {
712 return endsSequenceInternal(K1, Tokens...);
717 bool isAttribute()
const {
718 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
721 bool isAccessSpecifierKeyword()
const {
722 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
725 bool isAccessSpecifier(
bool ColonRequired =
true)
const {
726 if (!isAccessSpecifierKeyword())
731 return NextNonComment && NextNonComment->is(tok::colon);
734 bool canBePointerOrReferenceQualifier()
const {
735 return isOneOf(tok::kw_const, tok::kw_restrict, tok::kw_volatile,
736 tok::kw__Nonnull, tok::kw__Nullable,
737 tok::kw__Null_unspecified, tok::kw___ptr32, tok::kw___ptr64,
738 tok::kw___funcref) ||
742 [[nodiscard]]
bool isQtProperty()
const;
743 [[nodiscard]]
bool isTypeName(
const LangOptions &LangOpts)
const;
744 [[nodiscard]]
bool isTypeOrIdentifier(
const LangOptions &LangOpts)
const;
746 bool isObjCAccessSpecifier()
const {
747 return is(tok::at) &&
Next &&
748 Next->isOneOf(tok::objc_public, tok::objc_protected,
749 tok::objc_package, tok::objc_private);
752 bool isObjCLifetimeQualifier(
const FormatStyle &Style)
const {
764 bool opensScope()
const {
765 if (
is(TT_TemplateString) &&
TokenText.ends_with(
"${"))
767 if (
is(TT_DictLiteral) &&
is(tok::less))
769 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
774 bool closesScope()
const {
775 if (
is(TT_TemplateString) &&
TokenText.starts_with(
"}"))
777 if (
is(TT_DictLiteral) &&
is(tok::greater))
779 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
784 bool isMemberAccess()
const {
785 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
786 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
787 TT_LambdaArrow, TT_LeadingJavaAnnotation);
790 bool isPointerOrReference()
const {
791 return isOneOf(tok::star, tok::amp, tok::ampamp);
794 bool isPlacementOperator()
const {
795 return isOneOf(tok::kw_new, tok::kw_delete);
798 bool isUnaryOperator()
const {
799 switch (
Tok.getKind()) {
803 case tok::minusminus:
807 case tok::kw_alignof:
814 bool isBinaryOperator()
const {
819 bool isTrailingComment()
const {
820 return is(tok::comment) &&
821 (
is(TT_LineComment) || !
Next ||
Next->NewlinesBefore > 0);
826 bool isFunctionLikeKeyword()
const {
830 return isOneOf(tok::kw_throw, tok::kw_typeid, tok::kw_return,
831 tok::kw_sizeof, tok::kw_alignof, tok::kw_alignas,
832 tok::kw_decltype, tok::kw_noexcept, tok::kw_static_assert,
835#include
"clang/Basic/BuiltinTraits.inc"
841 bool isLabelString()
const {
842 if (
isNot(tok::string_literal))
845 if (Content.starts_with(
"\"") || Content.starts_with(
"'"))
846 Content = Content.drop_front(1);
847 if (Content.ends_with(
"\"") || Content.ends_with(
"'"))
848 Content = Content.drop_back(1);
849 Content = Content.trim();
850 return Content.size() > 1 &&
851 (Content.back() ==
':' || Content.back() ==
'=');
865 bool hasWhitespaceBefore()
const {
878 while (
Tok &&
Tok->isNot(A1))
883 template <
typename... Ts>
886 while (
Tok && (
Tok->isNot(Ks) && ...))
894 while (
Tok &&
Tok->is(tok::comment))
923 if (Prev && Prev->is(tok::coloncolon))
925 if (!AllowFollowingColonColon) {
944 if (!IsCpp ||
isNot(tok::l_square))
948 T = T->getPreviousNonComment();
949 }
while (
T &&
T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
951 return T && T->is(tok::kw_auto);
956 if (
is(TT_TemplateString) && closesScope())
965 if (
is(tok::comment))
966 NamespaceTok = NamespaceTok->getNextNonComment();
968 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
969 NamespaceTok = NamespaceTok->getNextNonComment();
970 return NamespaceTok &&
971 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
983 template <
typename A,
typename... Ts>
984 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
985 if (
is(tok::comment) &&
Next)
986 return Next->startsSequenceInternal(K1, Tokens...);
987 return is(K1) &&
Next &&
Next->startsSequenceInternal(Tokens...);
990 template <
typename A>
bool startsSequenceInternal(A K1)
const {
991 if (
is(tok::comment) &&
Next)
992 return Next->startsSequenceInternal(K1);
996 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
998 return Previous->endsSequenceInternal(K1);
1002 template <
typename A,
typename... Ts>
1003 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
1005 return Previous->endsSequenceInternal(K1, Tokens...);
1010class ContinuationIndenter;
1028 virtual unsigned formatFromToken(LineState &State,
1029 ContinuationIndenter *Indenter,
1037 ContinuationIndenter *Indenter,
1043 virtual void CommaFound(
const FormatToken *Token) {}
1048 const FormatStyle &Style;
1051class CommaSeparatedList :
public TokenRole {
1054 : TokenRole(Style), HasNestedBracedList(
false) {}
1058 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1059 bool DryRun)
override;
1061 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1062 bool DryRun)
override;
1065 void CommaFound(
const FormatToken *Token)
override {
1066 Commas.push_back(Token);
1072 return Commas.back();
1078 struct ColumnFormat {
1083 unsigned TotalWidth;
1094 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
1106 bool HasNestedBracedList;
1111struct AdditionalKeywords {
1112 AdditionalKeywords(IdentifierTable &IdentTable) {
1113 kw_final = &IdentTable.get(
"final");
1114 kw_override = &IdentTable.get(
"override");
1115 kw_in = &IdentTable.get(
"in");
1116 kw_of = &IdentTable.get(
"of");
1117 kw_CF_CLOSED_ENUM = &IdentTable.get(
"CF_CLOSED_ENUM");
1118 kw_CF_ENUM = &IdentTable.get(
"CF_ENUM");
1119 kw_CF_OPTIONS = &IdentTable.get(
"CF_OPTIONS");
1120 kw_NS_CLOSED_ENUM = &IdentTable.get(
"NS_CLOSED_ENUM");
1121 kw_NS_ENUM = &IdentTable.get(
"NS_ENUM");
1122 kw_NS_ERROR_ENUM = &IdentTable.get(
"NS_ERROR_ENUM");
1123 kw_NS_OPTIONS = &IdentTable.get(
"NS_OPTIONS");
1125 kw_as = &IdentTable.get(
"as");
1126 kw_async = &IdentTable.get(
"async");
1127 kw_await = &IdentTable.get(
"await");
1128 kw_declare = &IdentTable.get(
"declare");
1129 kw_finally = &IdentTable.get(
"finally");
1130 kw_from = &IdentTable.get(
"from");
1131 kw_function = &IdentTable.get(
"function");
1132 kw_get = &IdentTable.get(
"get");
1133 kw_import = &IdentTable.get(
"import");
1134 kw_infer = &IdentTable.get(
"infer");
1135 kw_is = &IdentTable.get(
"is");
1136 kw_let = &IdentTable.get(
"let");
1137 kw_module = &IdentTable.get(
"module");
1138 kw_readonly = &IdentTable.get(
"readonly");
1139 kw_set = &IdentTable.get(
"set");
1140 kw_type = &IdentTable.get(
"type");
1141 kw_typeof = &IdentTable.get(
"typeof");
1142 kw_var = &IdentTable.get(
"var");
1143 kw_yield = &IdentTable.get(
"yield");
1145 kw_abstract = &IdentTable.get(
"abstract");
1146 kw_assert = &IdentTable.get(
"assert");
1147 kw_extends = &IdentTable.get(
"extends");
1148 kw_implements = &IdentTable.get(
"implements");
1149 kw_instanceof = &IdentTable.get(
"instanceof");
1150 kw_interface = &IdentTable.get(
"interface");
1151 kw_native = &IdentTable.get(
"native");
1152 kw_package = &IdentTable.get(
"package");
1153 kw_record = &IdentTable.get(
"record");
1154 kw_synchronized = &IdentTable.get(
"synchronized");
1155 kw_throws = &IdentTable.get(
"throws");
1156 kw___except = &IdentTable.get(
"__except");
1157 kw___has_include = &IdentTable.get(
"__has_include");
1158 kw___has_include_next = &IdentTable.get(
"__has_include_next");
1160 kw_mark = &IdentTable.get(
"mark");
1161 kw_region = &IdentTable.get(
"region");
1163 kw_extend = &IdentTable.get(
"extend");
1164 kw_option = &IdentTable.get(
"option");
1165 kw_optional = &IdentTable.get(
"optional");
1166 kw_repeated = &IdentTable.get(
"repeated");
1167 kw_required = &IdentTable.get(
"required");
1168 kw_returns = &IdentTable.get(
"returns");
1170 kw_signals = &IdentTable.get(
"signals");
1171 kw_qsignals = &IdentTable.get(
"Q_SIGNALS");
1172 kw_slots = &IdentTable.get(
"slots");
1173 kw_qslots = &IdentTable.get(
"Q_SLOTS");
1176 kw_internal_ident_after_define =
1177 &IdentTable.get(
"__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
1180 kw_dollar = &IdentTable.get(
"dollar");
1181 kw_base = &IdentTable.get(
"base");
1182 kw_byte = &IdentTable.get(
"byte");
1183 kw_checked = &IdentTable.get(
"checked");
1184 kw_decimal = &IdentTable.get(
"decimal");
1185 kw_delegate = &IdentTable.get(
"delegate");
1186 kw_event = &IdentTable.get(
"event");
1187 kw_fixed = &IdentTable.get(
"fixed");
1188 kw_foreach = &IdentTable.get(
"foreach");
1189 kw_init = &IdentTable.get(
"init");
1190 kw_implicit = &IdentTable.get(
"implicit");
1191 kw_internal = &IdentTable.get(
"internal");
1192 kw_lock = &IdentTable.get(
"lock");
1193 kw_null = &IdentTable.get(
"null");
1194 kw_object = &IdentTable.get(
"object");
1195 kw_out = &IdentTable.get(
"out");
1196 kw_params = &IdentTable.get(
"params");
1197 kw_ref = &IdentTable.get(
"ref");
1198 kw_string = &IdentTable.get(
"string");
1199 kw_stackalloc = &IdentTable.get(
"stackalloc");
1200 kw_sbyte = &IdentTable.get(
"sbyte");
1201 kw_sealed = &IdentTable.get(
"sealed");
1202 kw_uint = &IdentTable.get(
"uint");
1203 kw_ulong = &IdentTable.get(
"ulong");
1204 kw_unchecked = &IdentTable.get(
"unchecked");
1205 kw_unsafe = &IdentTable.get(
"unsafe");
1206 kw_ushort = &IdentTable.get(
"ushort");
1207 kw_when = &IdentTable.get(
"when");
1208 kw_where = &IdentTable.get(
"where");
1211 kw_always = &IdentTable.get(
"always");
1212 kw_always_comb = &IdentTable.get(
"always_comb");
1213 kw_always_ff = &IdentTable.get(
"always_ff");
1214 kw_always_latch = &IdentTable.get(
"always_latch");
1215 kw_assign = &IdentTable.get(
"assign");
1216 kw_assume = &IdentTable.get(
"assume");
1217 kw_automatic = &IdentTable.get(
"automatic");
1218 kw_before = &IdentTable.get(
"before");
1219 kw_begin = &IdentTable.get(
"begin");
1220 kw_begin_keywords = &IdentTable.get(
"begin_keywords");
1221 kw_bins = &IdentTable.get(
"bins");
1222 kw_binsof = &IdentTable.get(
"binsof");
1223 kw_casex = &IdentTable.get(
"casex");
1224 kw_casez = &IdentTable.get(
"casez");
1225 kw_celldefine = &IdentTable.get(
"celldefine");
1226 kw_checker = &IdentTable.get(
"checker");
1227 kw_clocking = &IdentTable.get(
"clocking");
1228 kw_constraint = &IdentTable.get(
"constraint");
1229 kw_context = &IdentTable.get(
"context");
1230 kw_cover = &IdentTable.get(
"cover");
1231 kw_covergroup = &IdentTable.get(
"covergroup");
1232 kw_coverpoint = &IdentTable.get(
"coverpoint");
1233 kw_data_block = &IdentTable.get(
"data_block");
1234 kw_data_decrypt_key = &IdentTable.get(
"data_decrypt_key");
1235 kw_data_public_key = &IdentTable.get(
"data_public_key");
1236 kw_default_decay_time = &IdentTable.get(
"default_decay_time");
1237 kw_default_nettype = &IdentTable.get(
"default_nettype");
1238 kw_default_trireg_strength = &IdentTable.get(
"default_trireg_strength");
1239 kw_delay_mode_distributed = &IdentTable.get(
"delay_mode_distributed");
1240 kw_delay_mode_path = &IdentTable.get(
"delay_mode_path");
1241 kw_delay_mode_unit = &IdentTable.get(
"delay_mode_unit");
1242 kw_delay_mode_zero = &IdentTable.get(
"delay_mode_zero");
1243 kw_digest_block = &IdentTable.get(
"digest_block");
1244 kw_digest_decrypt_key = &IdentTable.get(
"digest_decrypt_key");
1245 kw_digest_public_key = &IdentTable.get(
"digest_public_key");
1246 kw_disable = &IdentTable.get(
"disable");
1247 kw_dist = &IdentTable.get(
"dist");
1248 kw_edge = &IdentTable.get(
"edge");
1249 kw_elsif = &IdentTable.get(
"elsif");
1250 kw_end = &IdentTable.get(
"end");
1251 kw_end_keywords = &IdentTable.get(
"end_keywords");
1252 kw_endcase = &IdentTable.get(
"endcase");
1253 kw_endcelldefine = &IdentTable.get(
"endcelldefine");
1254 kw_endchecker = &IdentTable.get(
"endchecker");
1255 kw_endclass = &IdentTable.get(
"endclass");
1256 kw_endclocking = &IdentTable.get(
"endclocking");
1257 kw_endfunction = &IdentTable.get(
"endfunction");
1258 kw_endgenerate = &IdentTable.get(
"endgenerate");
1259 kw_endgroup = &IdentTable.get(
"endgroup");
1260 kw_endinterface = &IdentTable.get(
"endinterface");
1261 kw_endmodule = &IdentTable.get(
"endmodule");
1262 kw_endpackage = &IdentTable.get(
"endpackage");
1263 kw_endprimitive = &IdentTable.get(
"endprimitive");
1264 kw_endprogram = &IdentTable.get(
"endprogram");
1265 kw_endproperty = &IdentTable.get(
"endproperty");
1266 kw_endsequence = &IdentTable.get(
"endsequence");
1267 kw_endspecify = &IdentTable.get(
"endspecify");
1268 kw_endtable = &IdentTable.get(
"endtable");
1269 kw_endtask = &IdentTable.get(
"endtask");
1270 kw_forever = &IdentTable.get(
"forever");
1271 kw_fork = &IdentTable.get(
"fork");
1272 kw_generate = &IdentTable.get(
"generate");
1273 kw_highz0 = &IdentTable.get(
"highz0");
1274 kw_highz1 = &IdentTable.get(
"highz1");
1275 kw_iff = &IdentTable.get(
"iff");
1276 kw_ifnone = &IdentTable.get(
"ifnone");
1277 kw_ignore_bins = &IdentTable.get(
"ignore_bins");
1278 kw_illegal_bins = &IdentTable.get(
"illegal_bins");
1279 kw_initial = &IdentTable.get(
"initial");
1280 kw_inout = &IdentTable.get(
"inout");
1281 kw_input = &IdentTable.get(
"input");
1282 kw_inside = &IdentTable.get(
"inside");
1283 kw_interconnect = &IdentTable.get(
"interconnect");
1284 kw_intersect = &IdentTable.get(
"intersect");
1285 kw_join = &IdentTable.get(
"join");
1286 kw_join_any = &IdentTable.get(
"join_any");
1287 kw_join_none = &IdentTable.get(
"join_none");
1288 kw_key_block = &IdentTable.get(
"key_block");
1289 kw_key_public_key = &IdentTable.get(
"key_public_key");
1290 kw_large = &IdentTable.get(
"large");
1291 kw_local = &IdentTable.get(
"local");
1292 kw_localparam = &IdentTable.get(
"localparam");
1293 kw_macromodule = &IdentTable.get(
"macromodule");
1294 kw_matches = &IdentTable.get(
"matches");
1295 kw_medium = &IdentTable.get(
"medium");
1296 kw_negedge = &IdentTable.get(
"negedge");
1297 kw_nounconnected_drive = &IdentTable.get(
"nounconnected_drive");
1298 kw_output = &IdentTable.get(
"output");
1299 kw_packed = &IdentTable.get(
"packed");
1300 kw_parameter = &IdentTable.get(
"parameter");
1301 kw_posedge = &IdentTable.get(
"posedge");
1302 kw_primitive = &IdentTable.get(
"primitive");
1303 kw_priority = &IdentTable.get(
"priority");
1304 kw_program = &IdentTable.get(
"program");
1305 kw_property = &IdentTable.get(
"property");
1306 kw_protect = &IdentTable.get(
"protect");
1307 kw_pull0 = &IdentTable.get(
"pull0");
1308 kw_pull1 = &IdentTable.get(
"pull1");
1309 kw_pure = &IdentTable.get(
"pure");
1310 kw_rand = &IdentTable.get(
"rand");
1311 kw_randc = &IdentTable.get(
"randc");
1312 kw_randcase = &IdentTable.get(
"randcase");
1313 kw_randsequence = &IdentTable.get(
"randsequence");
1314 kw_repeat = &IdentTable.get(
"repeat");
1315 kw_resetall = &IdentTable.get(
"resetall");
1316 kw_sample = &IdentTable.get(
"sample");
1317 kw_scalared = &IdentTable.get(
"scalared");
1318 kw_sequence = &IdentTable.get(
"sequence");
1319 kw_small = &IdentTable.get(
"small");
1320 kw_soft = &IdentTable.get(
"soft");
1321 kw_solve = &IdentTable.get(
"solve");
1322 kw_specify = &IdentTable.get(
"specify");
1323 kw_specparam = &IdentTable.get(
"specparam");
1324 kw_strong0 = &IdentTable.get(
"strong0");
1325 kw_strong1 = &IdentTable.get(
"strong1");
1326 kw_supply0 = &IdentTable.get(
"supply0");
1327 kw_supply1 = &IdentTable.get(
"supply1");
1328 kw_table = &IdentTable.get(
"table");
1329 kw_tagged = &IdentTable.get(
"tagged");
1330 kw_task = &IdentTable.get(
"task");
1331 kw_timescale = &IdentTable.get(
"timescale");
1332 kw_tri = &IdentTable.get(
"tri");
1333 kw_tri0 = &IdentTable.get(
"tri0");
1334 kw_tri1 = &IdentTable.get(
"tri1");
1335 kw_triand = &IdentTable.get(
"triand");
1336 kw_trior = &IdentTable.get(
"trior");
1337 kw_trireg = &IdentTable.get(
"trireg");
1338 kw_unconnected_drive = &IdentTable.get(
"unconnected_drive");
1339 kw_undefineall = &IdentTable.get(
"undefineall");
1340 kw_unique = &IdentTable.get(
"unique");
1341 kw_unique0 = &IdentTable.get(
"unique0");
1342 kw_uwire = &IdentTable.get(
"uwire");
1343 kw_vectored = &IdentTable.get(
"vectored");
1344 kw_wait = &IdentTable.get(
"wait");
1345 kw_wand = &IdentTable.get(
"wand");
1346 kw_weak0 = &IdentTable.get(
"weak0");
1347 kw_weak1 = &IdentTable.get(
"weak1");
1348 kw_wildcard = &IdentTable.get(
"wildcard");
1349 kw_wire = &IdentTable.get(
"wire");
1350 kw_with = &IdentTable.get(
"with");
1351 kw_wor = &IdentTable.get(
"wor");
1354 kw_verilogHash = &IdentTable.get(
"#");
1355 kw_verilogHashHash = &IdentTable.get(
"##");
1356 kw_apostrophe = &IdentTable.get(
"\'");
1359 kw_bit = &IdentTable.get(
"bit");
1360 kw_bits = &IdentTable.get(
"bits");
1361 kw_code = &IdentTable.get(
"code");
1362 kw_dag = &IdentTable.get(
"dag");
1363 kw_def = &IdentTable.get(
"def");
1364 kw_defm = &IdentTable.get(
"defm");
1365 kw_defset = &IdentTable.get(
"defset");
1366 kw_defvar = &IdentTable.get(
"defvar");
1367 kw_dump = &IdentTable.get(
"dump");
1368 kw_include = &IdentTable.get(
"include");
1369 kw_list = &IdentTable.get(
"list");
1370 kw_multiclass = &IdentTable.get(
"multiclass");
1371 kw_then = &IdentTable.get(
"then");
1375 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
1376 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
1377 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_override,
1378 kw_readonly, kw_set, kw_type, kw_typeof, kw_var, kw_yield,
1380 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
1382 CSharpExtraKeywords = JsExtraKeywords;
1383 CSharpExtraKeywords.insert(
1384 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate,
1385 kw_event, kw_fixed, kw_foreach, kw_implicit, kw_in,
1386 kw_init, kw_internal, kw_lock, kw_null, kw_object,
1387 kw_out, kw_params, kw_ref, kw_string, kw_stackalloc,
1388 kw_sbyte, kw_sealed, kw_uint, kw_ulong, kw_unchecked,
1389 kw_unsafe, kw_ushort, kw_when, kw_where});
1394 VerilogExtraKeywords =
1395 std::unordered_set<IdentifierInfo *>{kw_always,
1527 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>{
1806 return Tok.Tok.getIdentifierInfo() &&
1816 bool AcceptIdentifierName =
true)
const {
1819 if (
Tok.isAccessSpecifierKeyword())
1821 switch (
Tok.Tok.getKind()) {
1826 case tok::kw_continue:
1828 case tok::kw_default:
1829 case tok::kw_delete:
1833 case tok::kw_export:
1837 case tok::kw_import:
1838 case tok::kw_module:
1840 case tok::kw_return:
1841 case tok::kw_static:
1842 case tok::kw_switch:
1847 case tok::kw_typeof:
1852 case tok::identifier: {
1855 bool IsPseudoKeyword =
1856 JsExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
1857 JsExtraKeywords.end();
1858 return AcceptIdentifierName || !IsPseudoKeyword;
1866 switch (
Tok.Tok.getKind()) {
1868#define KEYWORD(X, Y) case tok::kw_##X:
1869#include "clang/Basic/TokenKinds.def"
1882 if (
Tok.isAccessSpecifierKeyword())
1884 switch (
Tok.Tok.getKind()) {
1892 case tok::kw_continue:
1893 case tok::kw_default:
1895 case tok::kw_double:
1898 case tok::kw_explicit:
1899 case tok::kw_extern:
1907 case tok::kw_namespace:
1909 case tok::kw_operator:
1910 case tok::kw_return:
1912 case tok::kw_sizeof:
1913 case tok::kw_static:
1914 case tok::kw_struct:
1915 case tok::kw_switch:
1920 case tok::kw_typeof:
1922 case tok::kw_virtual:
1924 case tok::kw_volatile:
1928 return Tok.is(tok::identifier) &&
1929 CSharpExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1930 CSharpExtraKeywords.end();
1935 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1939 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1944 switch (
Tok.Tok.getKind()) {
1948 case tok::kw_continue:
1949 case tok::kw_default:
1953 case tok::kw_export:
1954 case tok::kw_extern:
1957 case tok::kw_import:
1958 case tok::kw_protected:
1959 case tok::kw_restrict:
1960 case tok::kw_signed:
1961 case tok::kw_static:
1962 case tok::kw_struct:
1963 case tok::kw_typedef:
1965 case tok::kw_unsigned:
1966 case tok::kw_virtual:
1969 case tok::identifier:
1971 VerilogExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1972 VerilogExtraKeywords.end();
1975 return Tok.Tok.getIdentifierInfo();
1983 auto Info =
Tok.Tok.getIdentifierInfo();
1986 switch (Info->getPPKeywordID()) {
1987 case tok::pp_define:
1991 case tok::pp_ifndef:
1992 case tok::pp_include:
1994 case tok::pp_pragma:
2015 const auto *Prev =
Tok.getPreviousNonComment();
2033 if (
Tok.endsSequence(kw_function, kw_with))
2040 return Tok.isOneOf(tok::kw_case, tok::kw_class, kw_function, kw_module,
2041 kw_interface, kw_package, kw_casex, kw_casez, kw_checker,
2042 kw_clocking, kw_covergroup, kw_macromodule, kw_primitive,
2043 kw_program, kw_property, kw_randcase, kw_randsequence,
2050 return Tok.is(TT_CaseLabelColon) ||
2051 (
Tok.is(tok::kw_default) &&
2058 bool isVerilogStructuredProcedure(
const FormatToken &
Tok)
const {
2059 return Tok.isOneOf(kw_always, kw_always_comb, kw_always_ff, kw_always_latch,
2060 kw_final, kw_forever, kw_initial);
2064 switch (
Tok.Tok.getKind()) {
2065 case tok::kw_extern:
2066 case tok::kw_signed:
2067 case tok::kw_static:
2068 case tok::kw_unsigned:
2069 case tok::kw_virtual:
2071 case tok::identifier:
2085 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2086 kw_let, tok::kw_class);
2090 switch (
Tok.Tok.getKind()) {
2099 return Tok.is(tok::identifier) &&
2100 TableGenExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
2101 TableGenExtraKeywords.end();
2107 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2110 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2113 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2116 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2120 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with(
"/*");
2131 unsigned MinContinueColumn =
2132 MinColumnToken->OriginalColumn + (
isLineComment(*MinColumnToken) ? 0 : 1);
2133 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2135 FormatTok.OriginalColumn >= MinContinueColumn;
2144 return Tok.isOneOf(tok::kw_static, tok::kw_extern, tok::kw_inline,
2145 tok::kw_virtual, tok::kw_constexpr, tok::kw_consteval,
2146 tok::kw_friend, tok::kw_export, tok::kw__Noreturn,
2147 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.
Top level wrappers for InstallAPI frontend operations.
bool isLineComment(const FormatToken &FormatTok)
const FunctionProtoType * T
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