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(InlineASMSymbolicNameLSquare) \
103 TYPE(JavaAnnotation) \
104 TYPE(JsAndAndEqual) \
105 TYPE(JsComputedPropertyName) \
106 TYPE(JsExponentiation) \
107 TYPE(JsExponentiationEqual) \
108 TYPE(JsPipePipeEqual) \
109 TYPE(JsPrivateIdentifier) \
111 TYPE(JsTypeOperator) \
112 TYPE(JsTypeOptionalQuestion) \
114 TYPE(LambdaDefinitionLParen) \
116 TYPE(LambdaLSquare) \
117 TYPE(LeadingJavaAnnotation) \
119 TYPE(MacroBlockBegin) \
120 TYPE(MacroBlockEnd) \
121 TYPE(ModulePartitionColon) \
122 TYPE(NamespaceLBrace) \
123 TYPE(NamespaceMacro) \
124 TYPE(NamespaceRBrace) \
125 TYPE(NonNullAssertion) \
126 TYPE(NullCoalescingEqual) \
127 TYPE(NullCoalescingOperator) \
128 TYPE(NullPropagatingOperator) \
129 TYPE(ObjCBlockLBrace) \
130 TYPE(ObjCBlockLParen) \
137 TYPE(ObjCMethodExpr) \
139 TYPE(ObjCMethodSpecifier) \
144 TYPE(ObjCStringLiteral) \
145 TYPE(OverloadedOperator) \
146 TYPE(OverloadedOperatorLParen) \
147 TYPE(PointerOrReference) \
148 TYPE(ProtoExtensionLSquare) \
149 TYPE(PureVirtualSpecifier) \
151 TYPE(RangeBasedForLoopColon) \
155 TYPE(RequiresClause) \
156 TYPE(RequiresClauseInARequiresExpression) \
157 TYPE(RequiresExpression) \
158 TYPE(RequiresExpressionLBrace) \
159 TYPE(RequiresExpressionLParen) \
165 TYPE(StatementAttributeLikeMacro) \
166 TYPE(StatementMacro) \
171 TYPE(StringInConcatenation) \
174 TYPE(StructuredBindingLSquare) \
175 TYPE(SwitchExpressionLabel) \
176 TYPE(SwitchExpressionLBrace) \
177 TYPE(TableGenBangOperator) \
178 TYPE(TableGenCondOperator) \
179 TYPE(TableGenCondOperatorColon) \
180 TYPE(TableGenCondOperatorComma) \
181 TYPE(TableGenDAGArgCloser) \
182 TYPE(TableGenDAGArgListColon) \
183 TYPE(TableGenDAGArgListColonToAlign) \
184 TYPE(TableGenDAGArgListComma) \
185 TYPE(TableGenDAGArgListCommaToBreak) \
186 TYPE(TableGenDAGArgOpener) \
187 TYPE(TableGenDAGArgOpenerToBreak) \
188 TYPE(TableGenDAGArgOperatorID) \
189 TYPE(TableGenDAGArgOperatorToBreak) \
190 TYPE(TableGenListCloser) \
191 TYPE(TableGenListOpener) \
192 TYPE(TableGenMultiLineString) \
193 TYPE(TableGenTrailingPasteOperator) \
194 TYPE(TableGenValueSuffix) \
195 TYPE(TemplateCloser) \
196 TYPE(TemplateOpener) \
197 TYPE(TemplateString) \
198 TYPE(TrailingAnnotation) \
199 TYPE(TrailingReturnArrow) \
200 TYPE(TrailingUnaryOperator) \
201 TYPE(TypeDeclarationParen) \
204 TYPE(TypenameMacro) \
205 TYPE(UnaryOperator) \
208 TYPE(UntouchableMacroFunc) \
209 TYPE(VariableTemplate) \
211 TYPE(VerilogAssignComma) \
213 TYPE(VerilogBlockLabelColon) \
217 TYPE(VerilogDimensionedTypeName) \
219 TYPE(VerilogInstancePortComma) \
220 TYPE(VerilogInstancePortLParen) \
223 TYPE(VerilogMultiLineListLParen) \
225 TYPE(VerilogNumberBase) \
228 TYPE(VerilogProtected) \
230 TYPE(VerilogStrength) \
232 TYPE(VerilogTableItem) \
234 TYPE(VerilogTypeComma) \
240#define TYPE(X) TT_##X,
350 std::shared_ptr<TokenRole>
Role;
413 unsigned BlockKind : 2;
421 assert(
getBlockKind() == BBK &&
"BraceBlockKind overflow!");
426 unsigned Decision : 2;
434 assert(
getDecision() == D &&
"FormatDecision overflow!");
439 unsigned PackingKind : 2;
447 assert(
getPackingKind() == K &&
"ParameterPackingKind overflow!");
451 unsigned TypeIsFinalized : 1;
464 assert((!TypeIsFinalized || T == Type) &&
465 "Please use overwriteFixedType to change a fixed type.");
476 TypeIsFinalized =
true;
481 TypeIsFinalized =
false;
635 std::optional<MacroExpansion>
MacroCtx;
648 return Tok.getObjCKeywordID() == Kind;
652 return II && II ==
Tok.getIdentifierInfo();
655 return Tok.getIdentifierInfo() &&
656 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
661 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
662 return is(K1) ||
is(K2);
664 template <
typename A,
typename B,
typename... Ts>
668 template <
typename T>
bool isNot(T Kind)
const {
return !
is(Kind); }
669 template <
typename... Ts>
bool isNoneOf(Ts... Ks)
const {
673 bool isIf(
bool AllowConstexprMacro =
true)
const {
674 return is(tok::kw_if) || endsSequence(tok::kw_constexpr, tok::kw_if) ||
675 (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
678 bool isLoop(
const FormatStyle &Style)
const {
679 return isOneOf(tok::kw_for, tok::kw_while) ||
688 return Previous->closesScopeAfterBlock();
694 template <
typename A,
typename... Ts>
695 bool startsSequence(A K1, Ts... Tokens)
const {
696 return startsSequenceInternal(K1, Tokens...);
705 template <
typename A,
typename... Ts>
706 bool endsSequence(A K1, Ts... Tokens)
const {
707 return endsSequenceInternal(K1, Tokens...);
712 bool isAttribute()
const {
713 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
716 bool isAccessSpecifierKeyword()
const {
717 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
720 bool isAccessSpecifier(
bool ColonRequired =
true)
const {
721 if (!isAccessSpecifierKeyword())
726 return NextNonComment && NextNonComment->is(tok::colon);
729 bool canBePointerOrReferenceQualifier()
const {
730 return isOneOf(tok::kw_const, tok::kw_restrict, tok::kw_volatile,
731 tok::kw__Nonnull, tok::kw__Nullable,
732 tok::kw__Null_unspecified, tok::kw___ptr32, tok::kw___ptr64,
733 tok::kw___funcref) ||
737 [[nodiscard]]
bool isQtProperty()
const;
738 [[nodiscard]]
bool isTypeName(
const LangOptions &LangOpts)
const;
739 [[nodiscard]]
bool isTypeOrIdentifier(
const LangOptions &LangOpts)
const;
741 bool isObjCAccessSpecifier()
const {
742 return is(tok::at) &&
Next &&
743 Next->isOneOf(tok::objc_public, tok::objc_protected,
744 tok::objc_package, tok::objc_private);
747 bool isObjCLifetimeQualifier(
const FormatStyle &Style)
const {
748 if (Style.Language != FormatStyle::LK_ObjC ||
isNot(tok::identifier) ||
759 bool opensScope()
const {
760 if (
is(TT_TemplateString) &&
TokenText.ends_with(
"${"))
762 if (
is(TT_DictLiteral) &&
is(tok::less))
764 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
769 bool closesScope()
const {
770 if (
is(TT_TemplateString) &&
TokenText.starts_with(
"}"))
772 if (
is(TT_DictLiteral) &&
is(tok::greater))
774 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
779 bool isMemberAccess()
const {
780 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
781 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
782 TT_LambdaArrow, TT_LeadingJavaAnnotation);
785 bool isPointerOrReference()
const {
786 return isOneOf(tok::star, tok::amp, tok::ampamp);
789 bool isPlacementOperator()
const {
790 return isOneOf(tok::kw_new, tok::kw_delete);
793 bool isUnaryOperator()
const {
794 switch (
Tok.getKind()) {
798 case tok::minusminus:
802 case tok::kw_alignof:
809 bool isBinaryOperator()
const {
814 bool isTrailingComment()
const {
815 return is(tok::comment) &&
816 (
is(TT_LineComment) || !
Next ||
Next->NewlinesBefore > 0);
821 bool isFunctionLikeKeyword()
const {
825 return isOneOf(tok::kw_throw, tok::kw_typeid, tok::kw_return,
826 tok::kw_sizeof, tok::kw_alignof, tok::kw_alignas,
827 tok::kw_decltype, tok::kw_noexcept, tok::kw_static_assert,
830#include
"clang/Basic/TransformTypeTraits.def"
836 bool isLabelString()
const {
837 if (
isNot(tok::string_literal))
840 if (Content.starts_with(
"\"") || Content.starts_with(
"'"))
841 Content = Content.drop_front(1);
842 if (Content.ends_with(
"\"") || Content.ends_with(
"'"))
843 Content = Content.drop_back(1);
844 Content = Content.trim();
845 return Content.size() > 1 &&
846 (Content.back() ==
':' || Content.back() ==
'=');
860 bool hasWhitespaceBefore()
const {
873 while (
Tok &&
Tok->isNot(A1))
878 template <
typename... Ts>
881 while (
Tok && (
Tok->isNot(Ks) && ...))
889 while (
Tok &&
Tok->is(tok::comment))
918 if (Prev && Prev->is(tok::coloncolon))
920 if (!AllowFollowingColonColon) {
939 if (!IsCpp ||
isNot(tok::l_square))
943 T = T->getPreviousNonComment();
944 }
while (T && T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
946 return T && T->is(tok::kw_auto);
951 if (
is(TT_TemplateString) && closesScope())
960 if (
is(tok::comment))
961 NamespaceTok = NamespaceTok->getNextNonComment();
963 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
964 NamespaceTok = NamespaceTok->getNextNonComment();
965 return NamespaceTok &&
966 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
978 template <
typename A,
typename... Ts>
979 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
980 if (
is(tok::comment) &&
Next)
981 return Next->startsSequenceInternal(K1, Tokens...);
982 return is(K1) &&
Next &&
Next->startsSequenceInternal(Tokens...);
985 template <
typename A>
bool startsSequenceInternal(A K1)
const {
986 if (
is(tok::comment) &&
Next)
987 return Next->startsSequenceInternal(K1);
991 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
993 return Previous->endsSequenceInternal(K1);
997 template <
typename A,
typename... Ts>
998 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
1000 return Previous->endsSequenceInternal(K1, Tokens...);
1005class ContinuationIndenter;
1015 virtual void precomputeFormattingInfos(
const FormatToken *Token);
1023 virtual unsigned formatFromToken(LineState &State,
1024 ContinuationIndenter *Indenter,
1032 ContinuationIndenter *Indenter,
1038 virtual void CommaFound(
const FormatToken *Token) {}
1040 virtual const FormatToken *lastComma() {
return nullptr; }
1043 const FormatStyle &Style;
1046class CommaSeparatedList :
public TokenRole {
1049 : TokenRole(Style), HasNestedBracedList(
false) {}
1053 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1054 bool DryRun)
override;
1056 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1057 bool DryRun)
override;
1061 Commas.push_back(Token);
1067 return Commas.back();
1073 struct ColumnFormat {
1078 unsigned TotalWidth;
1089 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
1101 bool HasNestedBracedList;
1106struct AdditionalKeywords {
1107 AdditionalKeywords(IdentifierTable &IdentTable) {
1108 kw_final = &IdentTable.get(
"final");
1109 kw_override = &IdentTable.get(
"override");
1110 kw_in = &IdentTable.get(
"in");
1111 kw_of = &IdentTable.get(
"of");
1112 kw_CF_CLOSED_ENUM = &IdentTable.get(
"CF_CLOSED_ENUM");
1113 kw_CF_ENUM = &IdentTable.get(
"CF_ENUM");
1114 kw_CF_OPTIONS = &IdentTable.get(
"CF_OPTIONS");
1115 kw_NS_CLOSED_ENUM = &IdentTable.get(
"NS_CLOSED_ENUM");
1116 kw_NS_ENUM = &IdentTable.get(
"NS_ENUM");
1117 kw_NS_ERROR_ENUM = &IdentTable.get(
"NS_ERROR_ENUM");
1118 kw_NS_OPTIONS = &IdentTable.get(
"NS_OPTIONS");
1120 kw_as = &IdentTable.get(
"as");
1121 kw_async = &IdentTable.get(
"async");
1122 kw_await = &IdentTable.get(
"await");
1123 kw_declare = &IdentTable.get(
"declare");
1124 kw_finally = &IdentTable.get(
"finally");
1125 kw_from = &IdentTable.get(
"from");
1126 kw_function = &IdentTable.get(
"function");
1127 kw_get = &IdentTable.get(
"get");
1128 kw_import = &IdentTable.get(
"import");
1129 kw_infer = &IdentTable.get(
"infer");
1130 kw_is = &IdentTable.get(
"is");
1131 kw_let = &IdentTable.get(
"let");
1132 kw_module = &IdentTable.get(
"module");
1133 kw_readonly = &IdentTable.get(
"readonly");
1134 kw_set = &IdentTable.get(
"set");
1135 kw_type = &IdentTable.get(
"type");
1136 kw_typeof = &IdentTable.get(
"typeof");
1137 kw_var = &IdentTable.get(
"var");
1138 kw_yield = &IdentTable.get(
"yield");
1140 kw_abstract = &IdentTable.get(
"abstract");
1141 kw_assert = &IdentTable.get(
"assert");
1142 kw_extends = &IdentTable.get(
"extends");
1143 kw_implements = &IdentTable.get(
"implements");
1144 kw_instanceof = &IdentTable.get(
"instanceof");
1145 kw_interface = &IdentTable.get(
"interface");
1146 kw_native = &IdentTable.get(
"native");
1147 kw_package = &IdentTable.get(
"package");
1148 kw_record = &IdentTable.get(
"record");
1149 kw_synchronized = &IdentTable.get(
"synchronized");
1150 kw_throws = &IdentTable.get(
"throws");
1151 kw___except = &IdentTable.get(
"__except");
1152 kw___has_include = &IdentTable.get(
"__has_include");
1153 kw___has_include_next = &IdentTable.get(
"__has_include_next");
1155 kw_mark = &IdentTable.get(
"mark");
1156 kw_region = &IdentTable.get(
"region");
1158 kw_extend = &IdentTable.get(
"extend");
1159 kw_option = &IdentTable.get(
"option");
1160 kw_optional = &IdentTable.get(
"optional");
1161 kw_repeated = &IdentTable.get(
"repeated");
1162 kw_required = &IdentTable.get(
"required");
1163 kw_returns = &IdentTable.get(
"returns");
1165 kw_signals = &IdentTable.get(
"signals");
1166 kw_qsignals = &IdentTable.get(
"Q_SIGNALS");
1167 kw_slots = &IdentTable.get(
"slots");
1168 kw_qslots = &IdentTable.get(
"Q_SLOTS");
1171 kw_internal_ident_after_define =
1172 &IdentTable.get(
"__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
1175 kw_dollar = &IdentTable.get(
"dollar");
1176 kw_base = &IdentTable.get(
"base");
1177 kw_byte = &IdentTable.get(
"byte");
1178 kw_checked = &IdentTable.get(
"checked");
1179 kw_decimal = &IdentTable.get(
"decimal");
1180 kw_delegate = &IdentTable.get(
"delegate");
1181 kw_event = &IdentTable.get(
"event");
1182 kw_fixed = &IdentTable.get(
"fixed");
1183 kw_foreach = &IdentTable.get(
"foreach");
1184 kw_init = &IdentTable.get(
"init");
1185 kw_implicit = &IdentTable.get(
"implicit");
1186 kw_internal = &IdentTable.get(
"internal");
1187 kw_lock = &IdentTable.get(
"lock");
1188 kw_null = &IdentTable.get(
"null");
1189 kw_object = &IdentTable.get(
"object");
1190 kw_out = &IdentTable.get(
"out");
1191 kw_params = &IdentTable.get(
"params");
1192 kw_ref = &IdentTable.get(
"ref");
1193 kw_string = &IdentTable.get(
"string");
1194 kw_stackalloc = &IdentTable.get(
"stackalloc");
1195 kw_sbyte = &IdentTable.get(
"sbyte");
1196 kw_sealed = &IdentTable.get(
"sealed");
1197 kw_uint = &IdentTable.get(
"uint");
1198 kw_ulong = &IdentTable.get(
"ulong");
1199 kw_unchecked = &IdentTable.get(
"unchecked");
1200 kw_unsafe = &IdentTable.get(
"unsafe");
1201 kw_ushort = &IdentTable.get(
"ushort");
1202 kw_when = &IdentTable.get(
"when");
1203 kw_where = &IdentTable.get(
"where");
1206 kw_always = &IdentTable.get(
"always");
1207 kw_always_comb = &IdentTable.get(
"always_comb");
1208 kw_always_ff = &IdentTable.get(
"always_ff");
1209 kw_always_latch = &IdentTable.get(
"always_latch");
1210 kw_assign = &IdentTable.get(
"assign");
1211 kw_assume = &IdentTable.get(
"assume");
1212 kw_automatic = &IdentTable.get(
"automatic");
1213 kw_before = &IdentTable.get(
"before");
1214 kw_begin = &IdentTable.get(
"begin");
1215 kw_begin_keywords = &IdentTable.get(
"begin_keywords");
1216 kw_bins = &IdentTable.get(
"bins");
1217 kw_binsof = &IdentTable.get(
"binsof");
1218 kw_casex = &IdentTable.get(
"casex");
1219 kw_casez = &IdentTable.get(
"casez");
1220 kw_celldefine = &IdentTable.get(
"celldefine");
1221 kw_checker = &IdentTable.get(
"checker");
1222 kw_clocking = &IdentTable.get(
"clocking");
1223 kw_constraint = &IdentTable.get(
"constraint");
1224 kw_context = &IdentTable.get(
"context");
1225 kw_cover = &IdentTable.get(
"cover");
1226 kw_covergroup = &IdentTable.get(
"covergroup");
1227 kw_coverpoint = &IdentTable.get(
"coverpoint");
1228 kw_data_block = &IdentTable.get(
"data_block");
1229 kw_data_decrypt_key = &IdentTable.get(
"data_decrypt_key");
1230 kw_data_public_key = &IdentTable.get(
"data_public_key");
1231 kw_default_decay_time = &IdentTable.get(
"default_decay_time");
1232 kw_default_nettype = &IdentTable.get(
"default_nettype");
1233 kw_default_trireg_strength = &IdentTable.get(
"default_trireg_strength");
1234 kw_delay_mode_distributed = &IdentTable.get(
"delay_mode_distributed");
1235 kw_delay_mode_path = &IdentTable.get(
"delay_mode_path");
1236 kw_delay_mode_unit = &IdentTable.get(
"delay_mode_unit");
1237 kw_delay_mode_zero = &IdentTable.get(
"delay_mode_zero");
1238 kw_digest_block = &IdentTable.get(
"digest_block");
1239 kw_digest_decrypt_key = &IdentTable.get(
"digest_decrypt_key");
1240 kw_digest_public_key = &IdentTable.get(
"digest_public_key");
1241 kw_disable = &IdentTable.get(
"disable");
1242 kw_dist = &IdentTable.get(
"dist");
1243 kw_edge = &IdentTable.get(
"edge");
1244 kw_elsif = &IdentTable.get(
"elsif");
1245 kw_end = &IdentTable.get(
"end");
1246 kw_end_keywords = &IdentTable.get(
"end_keywords");
1247 kw_endcase = &IdentTable.get(
"endcase");
1248 kw_endcelldefine = &IdentTable.get(
"endcelldefine");
1249 kw_endchecker = &IdentTable.get(
"endchecker");
1250 kw_endclass = &IdentTable.get(
"endclass");
1251 kw_endclocking = &IdentTable.get(
"endclocking");
1252 kw_endfunction = &IdentTable.get(
"endfunction");
1253 kw_endgenerate = &IdentTable.get(
"endgenerate");
1254 kw_endgroup = &IdentTable.get(
"endgroup");
1255 kw_endinterface = &IdentTable.get(
"endinterface");
1256 kw_endmodule = &IdentTable.get(
"endmodule");
1257 kw_endpackage = &IdentTable.get(
"endpackage");
1258 kw_endprimitive = &IdentTable.get(
"endprimitive");
1259 kw_endprogram = &IdentTable.get(
"endprogram");
1260 kw_endproperty = &IdentTable.get(
"endproperty");
1261 kw_endsequence = &IdentTable.get(
"endsequence");
1262 kw_endspecify = &IdentTable.get(
"endspecify");
1263 kw_endtable = &IdentTable.get(
"endtable");
1264 kw_endtask = &IdentTable.get(
"endtask");
1265 kw_forever = &IdentTable.get(
"forever");
1266 kw_fork = &IdentTable.get(
"fork");
1267 kw_generate = &IdentTable.get(
"generate");
1268 kw_highz0 = &IdentTable.get(
"highz0");
1269 kw_highz1 = &IdentTable.get(
"highz1");
1270 kw_iff = &IdentTable.get(
"iff");
1271 kw_ifnone = &IdentTable.get(
"ifnone");
1272 kw_ignore_bins = &IdentTable.get(
"ignore_bins");
1273 kw_illegal_bins = &IdentTable.get(
"illegal_bins");
1274 kw_initial = &IdentTable.get(
"initial");
1275 kw_inout = &IdentTable.get(
"inout");
1276 kw_input = &IdentTable.get(
"input");
1277 kw_inside = &IdentTable.get(
"inside");
1278 kw_interconnect = &IdentTable.get(
"interconnect");
1279 kw_intersect = &IdentTable.get(
"intersect");
1280 kw_join = &IdentTable.get(
"join");
1281 kw_join_any = &IdentTable.get(
"join_any");
1282 kw_join_none = &IdentTable.get(
"join_none");
1283 kw_key_block = &IdentTable.get(
"key_block");
1284 kw_key_public_key = &IdentTable.get(
"key_public_key");
1285 kw_large = &IdentTable.get(
"large");
1286 kw_local = &IdentTable.get(
"local");
1287 kw_localparam = &IdentTable.get(
"localparam");
1288 kw_macromodule = &IdentTable.get(
"macromodule");
1289 kw_matches = &IdentTable.get(
"matches");
1290 kw_medium = &IdentTable.get(
"medium");
1291 kw_negedge = &IdentTable.get(
"negedge");
1292 kw_nounconnected_drive = &IdentTable.get(
"nounconnected_drive");
1293 kw_output = &IdentTable.get(
"output");
1294 kw_packed = &IdentTable.get(
"packed");
1295 kw_parameter = &IdentTable.get(
"parameter");
1296 kw_posedge = &IdentTable.get(
"posedge");
1297 kw_primitive = &IdentTable.get(
"primitive");
1298 kw_priority = &IdentTable.get(
"priority");
1299 kw_program = &IdentTable.get(
"program");
1300 kw_property = &IdentTable.get(
"property");
1301 kw_protect = &IdentTable.get(
"protect");
1302 kw_pull0 = &IdentTable.get(
"pull0");
1303 kw_pull1 = &IdentTable.get(
"pull1");
1304 kw_pure = &IdentTable.get(
"pure");
1305 kw_rand = &IdentTable.get(
"rand");
1306 kw_randc = &IdentTable.get(
"randc");
1307 kw_randcase = &IdentTable.get(
"randcase");
1308 kw_randsequence = &IdentTable.get(
"randsequence");
1309 kw_repeat = &IdentTable.get(
"repeat");
1310 kw_resetall = &IdentTable.get(
"resetall");
1311 kw_sample = &IdentTable.get(
"sample");
1312 kw_scalared = &IdentTable.get(
"scalared");
1313 kw_sequence = &IdentTable.get(
"sequence");
1314 kw_small = &IdentTable.get(
"small");
1315 kw_soft = &IdentTable.get(
"soft");
1316 kw_solve = &IdentTable.get(
"solve");
1317 kw_specify = &IdentTable.get(
"specify");
1318 kw_specparam = &IdentTable.get(
"specparam");
1319 kw_strong0 = &IdentTable.get(
"strong0");
1320 kw_strong1 = &IdentTable.get(
"strong1");
1321 kw_supply0 = &IdentTable.get(
"supply0");
1322 kw_supply1 = &IdentTable.get(
"supply1");
1323 kw_table = &IdentTable.get(
"table");
1324 kw_tagged = &IdentTable.get(
"tagged");
1325 kw_task = &IdentTable.get(
"task");
1326 kw_timescale = &IdentTable.get(
"timescale");
1327 kw_tri = &IdentTable.get(
"tri");
1328 kw_tri0 = &IdentTable.get(
"tri0");
1329 kw_tri1 = &IdentTable.get(
"tri1");
1330 kw_triand = &IdentTable.get(
"triand");
1331 kw_trior = &IdentTable.get(
"trior");
1332 kw_trireg = &IdentTable.get(
"trireg");
1333 kw_unconnected_drive = &IdentTable.get(
"unconnected_drive");
1334 kw_undefineall = &IdentTable.get(
"undefineall");
1335 kw_unique = &IdentTable.get(
"unique");
1336 kw_unique0 = &IdentTable.get(
"unique0");
1337 kw_uwire = &IdentTable.get(
"uwire");
1338 kw_vectored = &IdentTable.get(
"vectored");
1339 kw_wait = &IdentTable.get(
"wait");
1340 kw_wand = &IdentTable.get(
"wand");
1341 kw_weak0 = &IdentTable.get(
"weak0");
1342 kw_weak1 = &IdentTable.get(
"weak1");
1343 kw_wildcard = &IdentTable.get(
"wildcard");
1344 kw_wire = &IdentTable.get(
"wire");
1345 kw_with = &IdentTable.get(
"with");
1346 kw_wor = &IdentTable.get(
"wor");
1349 kw_verilogHash = &IdentTable.get(
"#");
1350 kw_verilogHashHash = &IdentTable.get(
"##");
1351 kw_apostrophe = &IdentTable.get(
"\'");
1354 kw_bit = &IdentTable.get(
"bit");
1355 kw_bits = &IdentTable.get(
"bits");
1356 kw_code = &IdentTable.get(
"code");
1357 kw_dag = &IdentTable.get(
"dag");
1358 kw_def = &IdentTable.get(
"def");
1359 kw_defm = &IdentTable.get(
"defm");
1360 kw_defset = &IdentTable.get(
"defset");
1361 kw_defvar = &IdentTable.get(
"defvar");
1362 kw_dump = &IdentTable.get(
"dump");
1363 kw_include = &IdentTable.get(
"include");
1364 kw_list = &IdentTable.get(
"list");
1365 kw_multiclass = &IdentTable.get(
"multiclass");
1366 kw_then = &IdentTable.get(
"then");
1370 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
1371 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
1372 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_override,
1373 kw_readonly, kw_set, kw_type, kw_typeof, kw_var, kw_yield,
1375 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
1377 CSharpExtraKeywords = JsExtraKeywords;
1378 CSharpExtraKeywords.insert(
1379 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate,
1380 kw_event, kw_fixed, kw_foreach, kw_implicit, kw_in,
1381 kw_init, kw_internal, kw_lock, kw_null, kw_object,
1382 kw_out, kw_params, kw_ref, kw_string, kw_stackalloc,
1383 kw_sbyte, kw_sealed, kw_uint, kw_ulong, kw_unchecked,
1384 kw_unsafe, kw_ushort, kw_when, kw_where});
1389 VerilogExtraKeywords =
1390 std::unordered_set<IdentifierInfo *>{kw_always,
1522 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>{
1801 return Tok.Tok.getIdentifierInfo() &&
1811 bool AcceptIdentifierName =
true)
const {
1814 if (
Tok.isAccessSpecifierKeyword())
1816 switch (
Tok.Tok.getKind()) {
1821 case tok::kw_continue:
1823 case tok::kw_default:
1824 case tok::kw_delete:
1828 case tok::kw_export:
1832 case tok::kw_import:
1833 case tok::kw_module:
1835 case tok::kw_return:
1836 case tok::kw_static:
1837 case tok::kw_switch:
1842 case tok::kw_typeof:
1847 case tok::identifier: {
1850 bool IsPseudoKeyword =
1851 JsExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
1852 JsExtraKeywords.end();
1853 return AcceptIdentifierName || !IsPseudoKeyword;
1861 switch (
Tok.Tok.getKind()) {
1863#define KEYWORD(X, Y) case tok::kw_##X:
1864#include "clang/Basic/TokenKinds.def"
1877 if (
Tok.isAccessSpecifierKeyword())
1879 switch (
Tok.Tok.getKind()) {
1887 case tok::kw_continue:
1888 case tok::kw_default:
1890 case tok::kw_double:
1893 case tok::kw_explicit:
1894 case tok::kw_extern:
1902 case tok::kw_namespace:
1904 case tok::kw_operator:
1905 case tok::kw_return:
1907 case tok::kw_sizeof:
1908 case tok::kw_static:
1909 case tok::kw_struct:
1910 case tok::kw_switch:
1915 case tok::kw_typeof:
1917 case tok::kw_virtual:
1919 case tok::kw_volatile:
1923 return Tok.is(tok::identifier) &&
1924 CSharpExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1925 CSharpExtraKeywords.end();
1930 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1934 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1939 switch (
Tok.Tok.getKind()) {
1943 case tok::kw_continue:
1944 case tok::kw_default:
1948 case tok::kw_export:
1949 case tok::kw_extern:
1952 case tok::kw_import:
1953 case tok::kw_restrict:
1954 case tok::kw_signed:
1955 case tok::kw_static:
1956 case tok::kw_struct:
1957 case tok::kw_typedef:
1959 case tok::kw_unsigned:
1960 case tok::kw_virtual:
1963 case tok::identifier:
1965 VerilogExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1966 VerilogExtraKeywords.end();
1969 return Tok.Tok.getIdentifierInfo();
1977 auto Info =
Tok.Tok.getIdentifierInfo();
1980 switch (Info->getPPKeywordID()) {
1981 case tok::pp_define:
1985 case tok::pp_ifndef:
1986 case tok::pp_include:
1988 case tok::pp_pragma:
2009 const auto *Prev =
Tok.getPreviousNonComment();
2027 if (
Tok.endsSequence(kw_function, kw_with))
2034 return Tok.isOneOf(tok::kw_case, tok::kw_class, kw_function, kw_module,
2035 kw_interface, kw_package, kw_casex, kw_casez, kw_checker,
2036 kw_clocking, kw_covergroup, kw_macromodule, kw_primitive,
2037 kw_program, kw_property, kw_randcase, kw_randsequence,
2044 return Tok.is(TT_CaseLabelColon) ||
2045 (
Tok.is(tok::kw_default) &&
2052 bool isVerilogStructuredProcedure(
const FormatToken &
Tok)
const {
2053 return Tok.isOneOf(kw_always, kw_always_comb, kw_always_ff, kw_always_latch,
2054 kw_final, kw_forever, kw_initial);
2058 switch (
Tok.Tok.getKind()) {
2059 case tok::kw_extern:
2060 case tok::kw_signed:
2061 case tok::kw_static:
2062 case tok::kw_unsigned:
2063 case tok::kw_virtual:
2065 case tok::identifier:
2079 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2080 kw_let, tok::kw_class);
2084 switch (
Tok.Tok.getKind()) {
2093 return Tok.is(tok::identifier) &&
2094 TableGenExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
2095 TableGenExtraKeywords.end();
2101 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2104 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2107 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2110 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2114 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with(
"/*");
2125 unsigned MinContinueColumn =
2126 MinColumnToken->OriginalColumn + (
isLineComment(*MinColumnToken) ? 0 : 1);
2127 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2129 FormatTok.OriginalColumn >= MinContinueColumn;
2138 return Tok.isOneOf(tok::kw_static, tok::kw_extern, tok::kw_inline,
2139 tok::kw_virtual, tok::kw_constexpr, tok::kw_consteval,
2140 tok::kw_friend, tok::kw_export, tok::kw__Noreturn,
2141 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)
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