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;
644 std::optional<MacroExpansion>
MacroCtx;
657 return Tok.getObjCKeywordID() == Kind;
661 return II && II ==
Tok.getIdentifierInfo();
664 return Tok.getIdentifierInfo() &&
665 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
670 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
671 return is(K1) ||
is(K2);
673 template <
typename A,
typename B,
typename... Ts>
677 template <
typename T>
bool isNot(
T Kind)
const {
return !
is(Kind); }
678 template <
typename... Ts>
bool isNoneOf(Ts... Ks)
const {
682 bool isIf(
bool AllowConstexprMacro =
true)
const {
683 return is(tok::kw_if) || endsSequence(tok::kw_constexpr, tok::kw_if) ||
684 (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
688 return isOneOf(tok::kw_for, tok::kw_while) ||
697 return Previous->closesScopeAfterBlock();
703 template <
typename A,
typename... Ts>
704 bool startsSequence(A K1, Ts... Tokens)
const {
705 return startsSequenceInternal(K1, Tokens...);
714 template <
typename A,
typename... Ts>
715 bool endsSequence(A K1, Ts... Tokens)
const {
716 return endsSequenceInternal(K1, Tokens...);
721 bool isAttribute()
const {
722 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
725 bool isAccessSpecifierKeyword()
const {
726 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
729 bool isAccessSpecifier(
bool ColonRequired =
true)
const {
730 if (!isAccessSpecifierKeyword())
735 return NextNonComment && NextNonComment->is(tok::colon);
738 bool canBePointerOrReferenceQualifier()
const {
739 return isOneOf(tok::kw_const, tok::kw_restrict, tok::kw_volatile,
740 tok::kw__Nonnull, tok::kw__Nullable,
741 tok::kw__Null_unspecified, tok::kw___ptr32, tok::kw___ptr64,
742 tok::kw___funcref) ||
746 [[nodiscard]]
bool isQtProperty()
const;
747 [[nodiscard]]
bool isTypeName(
const LangOptions &LangOpts)
const;
748 [[nodiscard]]
bool isTypeOrIdentifier(
const LangOptions &LangOpts)
const;
750 bool isObjCAccessSpecifier()
const {
751 return is(tok::at) &&
Next &&
752 Next->isOneOf(tok::objc_public, tok::objc_protected,
753 tok::objc_package, tok::objc_private);
756 bool isObjCLifetimeQualifier(
const FormatStyle &Style)
const {
768 bool opensScope()
const {
769 if (
is(TT_TemplateString) &&
TokenText.ends_with(
"${"))
771 if (
is(TT_DictLiteral) &&
is(tok::less))
773 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
778 bool closesScope()
const {
779 if (
is(TT_TemplateString) &&
TokenText.starts_with(
"}"))
781 if (
is(TT_DictLiteral) &&
is(tok::greater))
783 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
788 bool isMemberAccess()
const {
789 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
790 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
791 TT_LambdaArrow, TT_LeadingJavaAnnotation);
794 bool isPointerOrReference()
const {
795 return isOneOf(tok::star, tok::amp, tok::ampamp);
798 bool isPlacementOperator()
const {
799 return isOneOf(tok::kw_new, tok::kw_delete);
802 bool isUnaryOperator()
const {
803 switch (
Tok.getKind()) {
807 case tok::minusminus:
811 case tok::kw_alignof:
818 bool isBinaryOperator()
const {
823 bool isTrailingComment()
const {
824 return is(tok::comment) &&
825 (
is(TT_LineComment) || !
Next ||
Next->NewlinesBefore > 0);
830 bool isFunctionLikeKeyword()
const {
834 return isOneOf(tok::kw_throw, tok::kw_typeid, tok::kw_return,
835 tok::kw_sizeof, tok::kw_alignof, tok::kw_alignas,
836 tok::kw_decltype, tok::kw_noexcept, tok::kw_static_assert,
839#include
"clang/Basic/BuiltinTraits.inc"
845 bool isLabelString()
const {
846 if (
isNot(tok::string_literal))
849 if (Content.starts_with(
"\"") || Content.starts_with(
"'"))
850 Content = Content.drop_front(1);
851 if (Content.ends_with(
"\"") || Content.ends_with(
"'"))
852 Content = Content.drop_back(1);
853 Content = Content.trim();
854 return Content.size() > 1 &&
855 (Content.back() ==
':' || Content.back() ==
'=');
869 bool hasWhitespaceBefore()
const {
882 while (
Tok &&
Tok->isNot(A1))
887 template <
typename... Ts>
890 while (
Tok && (
Tok->isNot(Ks) && ...))
898 while (
Tok &&
Tok->is(tok::comment))
927 if (Prev && Prev->is(tok::coloncolon))
929 if (!AllowFollowingColonColon) {
956 T = T->getPreviousNonComment();
957 }
while (
T &&
T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
959 return T &&
T->is(tok::kw_auto);
964 if (
is(TT_TemplateString) && closesScope())
973 if (
is(tok::comment))
974 NamespaceTok = NamespaceTok->getNextNonComment();
976 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
977 NamespaceTok = NamespaceTok->getNextNonComment();
978 return NamespaceTok &&
979 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
991 template <
typename A,
typename... Ts>
992 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
993 if (
is(tok::comment) &&
Next)
994 return Next->startsSequenceInternal(K1, Tokens...);
995 return is(K1) &&
Next &&
Next->startsSequenceInternal(Tokens...);
998 template <
typename A>
bool startsSequenceInternal(A K1)
const {
999 if (
is(tok::comment) &&
Next)
1000 return Next->startsSequenceInternal(K1);
1004 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
1006 return Previous->endsSequenceInternal(K1);
1010 template <
typename A,
typename... Ts>
1011 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
1013 return Previous->endsSequenceInternal(K1, Tokens...);
1018class ContinuationIndenter;
1024 virtual ~TokenRole();
1028 virtual void precomputeFormattingInfos(
const FormatToken *Token);
1036 virtual unsigned formatFromToken(LineState &State,
1037 ContinuationIndenter *Indenter,
1045 ContinuationIndenter *Indenter,
1051 virtual void CommaFound(
const FormatToken *Token) {}
1053 virtual const FormatToken *lastComma() {
return nullptr; }
1059class CommaSeparatedList :
public TokenRole {
1062 : TokenRole(Style), HasNestedBracedList(
false) {}
1066 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1067 bool DryRun)
override;
1069 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1070 bool DryRun)
override;
1073 void CommaFound(
const FormatToken *Token)
override {
1074 Commas.push_back(Token);
1080 return Commas.back();
1086 struct ColumnFormat {
1091 unsigned TotalWidth;
1102 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
1114 bool HasNestedBracedList;
1119struct AdditionalKeywords {
1120 AdditionalKeywords(IdentifierTable &IdentTable) {
1121 kw_final = &IdentTable.get(
"final");
1122 kw_override = &IdentTable.get(
"override");
1123 kw_in = &IdentTable.get(
"in");
1124 kw_of = &IdentTable.get(
"of");
1125 kw_CF_CLOSED_ENUM = &IdentTable.get(
"CF_CLOSED_ENUM");
1126 kw_CF_ENUM = &IdentTable.get(
"CF_ENUM");
1127 kw_CF_OPTIONS = &IdentTable.get(
"CF_OPTIONS");
1128 kw_NS_CLOSED_ENUM = &IdentTable.get(
"NS_CLOSED_ENUM");
1129 kw_NS_ENUM = &IdentTable.get(
"NS_ENUM");
1130 kw_NS_ERROR_ENUM = &IdentTable.get(
"NS_ERROR_ENUM");
1131 kw_NS_OPTIONS = &IdentTable.get(
"NS_OPTIONS");
1133 kw_as = &IdentTable.get(
"as");
1134 kw_async = &IdentTable.get(
"async");
1135 kw_await = &IdentTable.get(
"await");
1136 kw_declare = &IdentTable.get(
"declare");
1137 kw_finally = &IdentTable.get(
"finally");
1138 kw_from = &IdentTable.get(
"from");
1139 kw_function = &IdentTable.get(
"function");
1140 kw_get = &IdentTable.get(
"get");
1141 kw_import = &IdentTable.get(
"import");
1142 kw_infer = &IdentTable.get(
"infer");
1143 kw_is = &IdentTable.get(
"is");
1144 kw_let = &IdentTable.get(
"let");
1145 kw_module = &IdentTable.get(
"module");
1146 kw_readonly = &IdentTable.get(
"readonly");
1147 kw_set = &IdentTable.get(
"set");
1148 kw_type = &IdentTable.get(
"type");
1149 kw_typeof = &IdentTable.get(
"typeof");
1150 kw_var = &IdentTable.get(
"var");
1151 kw_yield = &IdentTable.get(
"yield");
1153 kw_abstract = &IdentTable.get(
"abstract");
1154 kw_assert = &IdentTable.get(
"assert");
1155 kw_extends = &IdentTable.get(
"extends");
1156 kw_implements = &IdentTable.get(
"implements");
1157 kw_instanceof = &IdentTable.get(
"instanceof");
1158 kw_interface = &IdentTable.get(
"interface");
1159 kw_native = &IdentTable.get(
"native");
1160 kw_package = &IdentTable.get(
"package");
1161 kw_record = &IdentTable.get(
"record");
1162 kw_synchronized = &IdentTable.get(
"synchronized");
1163 kw_throws = &IdentTable.get(
"throws");
1164 kw___except = &IdentTable.get(
"__except");
1165 kw___has_include = &IdentTable.get(
"__has_include");
1166 kw___has_include_next = &IdentTable.get(
"__has_include_next");
1168 kw_mark = &IdentTable.get(
"mark");
1169 kw_region = &IdentTable.get(
"region");
1171 kw_extend = &IdentTable.get(
"extend");
1172 kw_option = &IdentTable.get(
"option");
1173 kw_optional = &IdentTable.get(
"optional");
1174 kw_repeated = &IdentTable.get(
"repeated");
1175 kw_required = &IdentTable.get(
"required");
1176 kw_returns = &IdentTable.get(
"returns");
1178 kw_signals = &IdentTable.get(
"signals");
1179 kw_qsignals = &IdentTable.get(
"Q_SIGNALS");
1180 kw_slots = &IdentTable.get(
"slots");
1181 kw_qslots = &IdentTable.get(
"Q_SLOTS");
1184 kw_internal_ident_after_define =
1185 &IdentTable.get(
"__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
1188 kw_dollar = &IdentTable.get(
"dollar");
1189 kw_base = &IdentTable.get(
"base");
1190 kw_byte = &IdentTable.get(
"byte");
1191 kw_checked = &IdentTable.get(
"checked");
1192 kw_decimal = &IdentTable.get(
"decimal");
1193 kw_delegate = &IdentTable.get(
"delegate");
1194 kw_event = &IdentTable.get(
"event");
1195 kw_fixed = &IdentTable.get(
"fixed");
1196 kw_foreach = &IdentTable.get(
"foreach");
1197 kw_init = &IdentTable.get(
"init");
1198 kw_implicit = &IdentTable.get(
"implicit");
1199 kw_internal = &IdentTable.get(
"internal");
1200 kw_lock = &IdentTable.get(
"lock");
1201 kw_null = &IdentTable.get(
"null");
1202 kw_object = &IdentTable.get(
"object");
1203 kw_out = &IdentTable.get(
"out");
1204 kw_params = &IdentTable.get(
"params");
1205 kw_ref = &IdentTable.get(
"ref");
1206 kw_string = &IdentTable.get(
"string");
1207 kw_stackalloc = &IdentTable.get(
"stackalloc");
1208 kw_sbyte = &IdentTable.get(
"sbyte");
1209 kw_sealed = &IdentTable.get(
"sealed");
1210 kw_uint = &IdentTable.get(
"uint");
1211 kw_ulong = &IdentTable.get(
"ulong");
1212 kw_unchecked = &IdentTable.get(
"unchecked");
1213 kw_unsafe = &IdentTable.get(
"unsafe");
1214 kw_ushort = &IdentTable.get(
"ushort");
1215 kw_when = &IdentTable.get(
"when");
1216 kw_where = &IdentTable.get(
"where");
1219 kw_always = &IdentTable.get(
"always");
1220 kw_always_comb = &IdentTable.get(
"always_comb");
1221 kw_always_ff = &IdentTable.get(
"always_ff");
1222 kw_always_latch = &IdentTable.get(
"always_latch");
1223 kw_assign = &IdentTable.get(
"assign");
1224 kw_assume = &IdentTable.get(
"assume");
1225 kw_automatic = &IdentTable.get(
"automatic");
1226 kw_before = &IdentTable.get(
"before");
1227 kw_begin = &IdentTable.get(
"begin");
1228 kw_begin_keywords = &IdentTable.get(
"begin_keywords");
1229 kw_bins = &IdentTable.get(
"bins");
1230 kw_binsof = &IdentTable.get(
"binsof");
1231 kw_casex = &IdentTable.get(
"casex");
1232 kw_casez = &IdentTable.get(
"casez");
1233 kw_celldefine = &IdentTable.get(
"celldefine");
1234 kw_checker = &IdentTable.get(
"checker");
1235 kw_clocking = &IdentTable.get(
"clocking");
1236 kw_constraint = &IdentTable.get(
"constraint");
1237 kw_context = &IdentTable.get(
"context");
1238 kw_cover = &IdentTable.get(
"cover");
1239 kw_covergroup = &IdentTable.get(
"covergroup");
1240 kw_coverpoint = &IdentTable.get(
"coverpoint");
1241 kw_data_block = &IdentTable.get(
"data_block");
1242 kw_data_decrypt_key = &IdentTable.get(
"data_decrypt_key");
1243 kw_data_public_key = &IdentTable.get(
"data_public_key");
1244 kw_default_decay_time = &IdentTable.get(
"default_decay_time");
1245 kw_default_nettype = &IdentTable.get(
"default_nettype");
1246 kw_default_trireg_strength = &IdentTable.get(
"default_trireg_strength");
1247 kw_delay_mode_distributed = &IdentTable.get(
"delay_mode_distributed");
1248 kw_delay_mode_path = &IdentTable.get(
"delay_mode_path");
1249 kw_delay_mode_unit = &IdentTable.get(
"delay_mode_unit");
1250 kw_delay_mode_zero = &IdentTable.get(
"delay_mode_zero");
1251 kw_digest_block = &IdentTable.get(
"digest_block");
1252 kw_digest_decrypt_key = &IdentTable.get(
"digest_decrypt_key");
1253 kw_digest_public_key = &IdentTable.get(
"digest_public_key");
1254 kw_disable = &IdentTable.get(
"disable");
1255 kw_dist = &IdentTable.get(
"dist");
1256 kw_edge = &IdentTable.get(
"edge");
1257 kw_elsif = &IdentTable.get(
"elsif");
1258 kw_end = &IdentTable.get(
"end");
1259 kw_end_keywords = &IdentTable.get(
"end_keywords");
1260 kw_endcase = &IdentTable.get(
"endcase");
1261 kw_endcelldefine = &IdentTable.get(
"endcelldefine");
1262 kw_endchecker = &IdentTable.get(
"endchecker");
1263 kw_endclass = &IdentTable.get(
"endclass");
1264 kw_endclocking = &IdentTable.get(
"endclocking");
1265 kw_endfunction = &IdentTable.get(
"endfunction");
1266 kw_endgenerate = &IdentTable.get(
"endgenerate");
1267 kw_endgroup = &IdentTable.get(
"endgroup");
1268 kw_endinterface = &IdentTable.get(
"endinterface");
1269 kw_endmodule = &IdentTable.get(
"endmodule");
1270 kw_endpackage = &IdentTable.get(
"endpackage");
1271 kw_endprimitive = &IdentTable.get(
"endprimitive");
1272 kw_endprogram = &IdentTable.get(
"endprogram");
1273 kw_endproperty = &IdentTable.get(
"endproperty");
1274 kw_endsequence = &IdentTable.get(
"endsequence");
1275 kw_endspecify = &IdentTable.get(
"endspecify");
1276 kw_endtable = &IdentTable.get(
"endtable");
1277 kw_endtask = &IdentTable.get(
"endtask");
1278 kw_forever = &IdentTable.get(
"forever");
1279 kw_fork = &IdentTable.get(
"fork");
1280 kw_generate = &IdentTable.get(
"generate");
1281 kw_highz0 = &IdentTable.get(
"highz0");
1282 kw_highz1 = &IdentTable.get(
"highz1");
1283 kw_iff = &IdentTable.get(
"iff");
1284 kw_ifnone = &IdentTable.get(
"ifnone");
1285 kw_ignore_bins = &IdentTable.get(
"ignore_bins");
1286 kw_illegal_bins = &IdentTable.get(
"illegal_bins");
1287 kw_initial = &IdentTable.get(
"initial");
1288 kw_inout = &IdentTable.get(
"inout");
1289 kw_input = &IdentTable.get(
"input");
1290 kw_inside = &IdentTable.get(
"inside");
1291 kw_interconnect = &IdentTable.get(
"interconnect");
1292 kw_intersect = &IdentTable.get(
"intersect");
1293 kw_join = &IdentTable.get(
"join");
1294 kw_join_any = &IdentTable.get(
"join_any");
1295 kw_join_none = &IdentTable.get(
"join_none");
1296 kw_key_block = &IdentTable.get(
"key_block");
1297 kw_key_public_key = &IdentTable.get(
"key_public_key");
1298 kw_large = &IdentTable.get(
"large");
1299 kw_local = &IdentTable.get(
"local");
1300 kw_localparam = &IdentTable.get(
"localparam");
1301 kw_macromodule = &IdentTable.get(
"macromodule");
1302 kw_matches = &IdentTable.get(
"matches");
1303 kw_medium = &IdentTable.get(
"medium");
1304 kw_negedge = &IdentTable.get(
"negedge");
1305 kw_nounconnected_drive = &IdentTable.get(
"nounconnected_drive");
1306 kw_output = &IdentTable.get(
"output");
1307 kw_packed = &IdentTable.get(
"packed");
1308 kw_parameter = &IdentTable.get(
"parameter");
1309 kw_posedge = &IdentTable.get(
"posedge");
1310 kw_primitive = &IdentTable.get(
"primitive");
1311 kw_priority = &IdentTable.get(
"priority");
1312 kw_program = &IdentTable.get(
"program");
1313 kw_property = &IdentTable.get(
"property");
1314 kw_protect = &IdentTable.get(
"protect");
1315 kw_pull0 = &IdentTable.get(
"pull0");
1316 kw_pull1 = &IdentTable.get(
"pull1");
1317 kw_pure = &IdentTable.get(
"pure");
1318 kw_rand = &IdentTable.get(
"rand");
1319 kw_randc = &IdentTable.get(
"randc");
1320 kw_randcase = &IdentTable.get(
"randcase");
1321 kw_randsequence = &IdentTable.get(
"randsequence");
1322 kw_repeat = &IdentTable.get(
"repeat");
1323 kw_resetall = &IdentTable.get(
"resetall");
1324 kw_sample = &IdentTable.get(
"sample");
1325 kw_scalared = &IdentTable.get(
"scalared");
1326 kw_sequence = &IdentTable.get(
"sequence");
1327 kw_small = &IdentTable.get(
"small");
1328 kw_soft = &IdentTable.get(
"soft");
1329 kw_solve = &IdentTable.get(
"solve");
1330 kw_specify = &IdentTable.get(
"specify");
1331 kw_specparam = &IdentTable.get(
"specparam");
1332 kw_strong0 = &IdentTable.get(
"strong0");
1333 kw_strong1 = &IdentTable.get(
"strong1");
1334 kw_supply0 = &IdentTable.get(
"supply0");
1335 kw_supply1 = &IdentTable.get(
"supply1");
1336 kw_table = &IdentTable.get(
"table");
1337 kw_tagged = &IdentTable.get(
"tagged");
1338 kw_task = &IdentTable.get(
"task");
1339 kw_timescale = &IdentTable.get(
"timescale");
1340 kw_tri = &IdentTable.get(
"tri");
1341 kw_tri0 = &IdentTable.get(
"tri0");
1342 kw_tri1 = &IdentTable.get(
"tri1");
1343 kw_triand = &IdentTable.get(
"triand");
1344 kw_trior = &IdentTable.get(
"trior");
1345 kw_trireg = &IdentTable.get(
"trireg");
1346 kw_unconnected_drive = &IdentTable.get(
"unconnected_drive");
1347 kw_undefineall = &IdentTable.get(
"undefineall");
1348 kw_unique = &IdentTable.get(
"unique");
1349 kw_unique0 = &IdentTable.get(
"unique0");
1350 kw_uwire = &IdentTable.get(
"uwire");
1351 kw_vectored = &IdentTable.get(
"vectored");
1352 kw_wait = &IdentTable.get(
"wait");
1353 kw_wand = &IdentTable.get(
"wand");
1354 kw_weak0 = &IdentTable.get(
"weak0");
1355 kw_weak1 = &IdentTable.get(
"weak1");
1356 kw_wildcard = &IdentTable.get(
"wildcard");
1357 kw_wire = &IdentTable.get(
"wire");
1358 kw_with = &IdentTable.get(
"with");
1359 kw_wor = &IdentTable.get(
"wor");
1362 kw_verilogHash = &IdentTable.get(
"#");
1363 kw_verilogHashHash = &IdentTable.get(
"##");
1364 kw_apostrophe = &IdentTable.get(
"\'");
1367 kw_bit = &IdentTable.get(
"bit");
1368 kw_bits = &IdentTable.get(
"bits");
1369 kw_code = &IdentTable.get(
"code");
1370 kw_dag = &IdentTable.get(
"dag");
1371 kw_def = &IdentTable.get(
"def");
1372 kw_defm = &IdentTable.get(
"defm");
1373 kw_defset = &IdentTable.get(
"defset");
1374 kw_defvar = &IdentTable.get(
"defvar");
1375 kw_dump = &IdentTable.get(
"dump");
1376 kw_include = &IdentTable.get(
"include");
1377 kw_list = &IdentTable.get(
"list");
1378 kw_multiclass = &IdentTable.get(
"multiclass");
1379 kw_then = &IdentTable.get(
"then");
1383 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
1384 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
1385 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_override,
1386 kw_readonly, kw_set, kw_type, kw_typeof, kw_var, kw_yield,
1388 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
1390 CSharpExtraKeywords = JsExtraKeywords;
1391 CSharpExtraKeywords.insert(
1392 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate,
1393 kw_event, kw_fixed, kw_foreach, kw_implicit, kw_in,
1394 kw_init, kw_internal, kw_lock, kw_null, kw_object,
1395 kw_out, kw_params, kw_ref, kw_string, kw_stackalloc,
1396 kw_sbyte, kw_sealed, kw_uint, kw_ulong, kw_unchecked,
1397 kw_unsafe, kw_ushort, kw_when, kw_where});
1402 VerilogExtraKeywords =
1403 std::unordered_set<IdentifierInfo *>{kw_always,
1535 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>{
1814 return Tok.Tok.getIdentifierInfo() &&
1824 bool AcceptIdentifierName =
true)
const {
1827 if (
Tok.isAccessSpecifierKeyword())
1829 switch (
Tok.Tok.getKind()) {
1834 case tok::kw_continue:
1836 case tok::kw_default:
1837 case tok::kw_delete:
1841 case tok::kw_export:
1845 case tok::kw_import:
1846 case tok::kw_module:
1848 case tok::kw_return:
1849 case tok::kw_static:
1850 case tok::kw_switch:
1855 case tok::kw_typeof:
1860 case tok::identifier: {
1863 bool IsPseudoKeyword =
1864 JsExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
1865 JsExtraKeywords.end();
1866 return AcceptIdentifierName || !IsPseudoKeyword;
1874 switch (
Tok.Tok.getKind()) {
1876#define KEYWORD(X, Y) case tok::kw_##X:
1877#include "clang/Basic/TokenKinds.def"
1890 if (
Tok.isAccessSpecifierKeyword())
1892 switch (
Tok.Tok.getKind()) {
1900 case tok::kw_continue:
1901 case tok::kw_default:
1903 case tok::kw_double:
1906 case tok::kw_explicit:
1907 case tok::kw_extern:
1915 case tok::kw_namespace:
1917 case tok::kw_operator:
1918 case tok::kw_return:
1920 case tok::kw_sizeof:
1921 case tok::kw_static:
1922 case tok::kw_struct:
1923 case tok::kw_switch:
1928 case tok::kw_typeof:
1930 case tok::kw_virtual:
1932 case tok::kw_volatile:
1936 return Tok.is(tok::identifier) &&
1937 CSharpExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1938 CSharpExtraKeywords.end();
1943 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1947 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1952 switch (
Tok.Tok.getKind()) {
1956 case tok::kw_continue:
1957 case tok::kw_default:
1961 case tok::kw_export:
1962 case tok::kw_extern:
1965 case tok::kw_import:
1966 case tok::kw_protected:
1967 case tok::kw_restrict:
1968 case tok::kw_signed:
1969 case tok::kw_static:
1970 case tok::kw_struct:
1971 case tok::kw_typedef:
1973 case tok::kw_unsigned:
1974 case tok::kw_virtual:
1977 case tok::identifier:
1979 VerilogExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1980 VerilogExtraKeywords.end();
1983 return Tok.Tok.getIdentifierInfo();
1991 auto Info =
Tok.Tok.getIdentifierInfo();
1994 switch (Info->getPPKeywordID()) {
1995 case tok::pp_define:
1999 case tok::pp_ifndef:
2000 case tok::pp_include:
2002 case tok::pp_pragma:
2023 const auto *Prev =
Tok.getPreviousNonComment();
2041 if (
Tok.endsSequence(kw_function, kw_with))
2048 return Tok.isOneOf(tok::kw_case, tok::kw_class, kw_function, kw_module,
2049 kw_interface, kw_package, kw_casex, kw_casez, kw_checker,
2050 kw_clocking, kw_covergroup, kw_macromodule, kw_primitive,
2051 kw_program, kw_property, kw_randcase, kw_randsequence,
2058 return Tok.is(TT_CaseLabelColon) ||
2059 (
Tok.is(tok::kw_default) &&
2066 bool isVerilogStructuredProcedure(
const FormatToken &
Tok)
const {
2067 return Tok.isOneOf(kw_always, kw_always_comb, kw_always_ff, kw_always_latch,
2068 kw_final, kw_forever, kw_initial);
2072 switch (
Tok.Tok.getKind()) {
2073 case tok::kw_extern:
2074 case tok::kw_signed:
2075 case tok::kw_static:
2076 case tok::kw_unsigned:
2077 case tok::kw_virtual:
2079 case tok::identifier:
2093 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2094 kw_let, tok::kw_class);
2098 switch (
Tok.Tok.getKind()) {
2107 return Tok.is(tok::identifier) &&
2108 TableGenExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
2109 TableGenExtraKeywords.end();
2115 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2118 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2121 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2124 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2128 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with(
"/*");
2140 if (FormatTok.Finalized !=
Previous->Finalized)
2142 unsigned MinContinueColumn =
2143 MinColumnToken->OriginalColumn + (
isLineComment(*MinColumnToken) ? 0 : 1);
2144 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2146 FormatTok.OriginalColumn >= MinContinueColumn;
2155 return Tok.isOneOf(tok::kw_static, tok::kw_extern, tok::kw_inline,
2156 tok::kw_virtual, tok::kw_constexpr, tok::kw_consteval,
2157 tok::kw_friend, tok::kw_export, tok::kw__Noreturn,
2158 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, _)
unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter, bool DryRun) override
Same as formatFromToken, but assumes that the first token has already been set thereby deciding on th...
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)
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 int8_t
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 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