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) \
81 TYPE(EnumUnderlyingTypeColon) \
84 TYPE(FunctionAnnotationRParen) \
85 TYPE(FunctionDeclarationName) \
86 TYPE(FunctionDeclarationLParen) \
87 TYPE(FunctionLBrace) \
88 TYPE(FunctionLikeMacro) \
89 TYPE(FunctionLikeOrFreestandingMacro) \
90 TYPE(FunctionTypeLParen) \
92 TYPE(GenericSelectionColon) \
94 TYPE(GotoLabelColon) \
96 TYPE(ImplicitStringLiteral) \
97 TYPE(InheritanceColon) \
98 TYPE(InheritanceComma) \
99 TYPE(InlineASMBrace) \
100 TYPE(InlineASMColon) \
101 TYPE(InlineASMSymbolicNameLSquare) \
102 TYPE(JavaAnnotation) \
103 TYPE(JsAndAndEqual) \
104 TYPE(JsComputedPropertyName) \
105 TYPE(JsExponentiation) \
106 TYPE(JsExponentiationEqual) \
107 TYPE(JsPipePipeEqual) \
108 TYPE(JsPrivateIdentifier) \
110 TYPE(JsTypeOperator) \
111 TYPE(JsTypeOptionalQuestion) \
113 TYPE(LambdaDefinitionLParen) \
115 TYPE(LambdaLSquare) \
116 TYPE(LeadingJavaAnnotation) \
118 TYPE(MacroBlockBegin) \
119 TYPE(MacroBlockEnd) \
120 TYPE(ModulePartitionColon) \
121 TYPE(NamespaceLBrace) \
122 TYPE(NamespaceMacro) \
123 TYPE(NamespaceRBrace) \
124 TYPE(NonNullAssertion) \
125 TYPE(NullCoalescingEqual) \
126 TYPE(NullCoalescingOperator) \
127 TYPE(NullPropagatingOperator) \
128 TYPE(ObjCBlockLBrace) \
129 TYPE(ObjCBlockLParen) \
136 TYPE(ObjCMethodExpr) \
138 TYPE(ObjCMethodSpecifier) \
143 TYPE(ObjCStringLiteral) \
144 TYPE(OverloadedOperator) \
145 TYPE(OverloadedOperatorLParen) \
146 TYPE(PointerOrReference) \
147 TYPE(ProtoExtensionLSquare) \
148 TYPE(PureVirtualSpecifier) \
150 TYPE(RangeBasedForLoopColon) \
154 TYPE(RequiresClause) \
155 TYPE(RequiresClauseInARequiresExpression) \
156 TYPE(RequiresExpression) \
157 TYPE(RequiresExpressionLBrace) \
158 TYPE(RequiresExpressionLParen) \
164 TYPE(StatementAttributeLikeMacro) \
165 TYPE(StatementMacro) \
170 TYPE(StringInConcatenation) \
173 TYPE(StructuredBindingLSquare) \
174 TYPE(SwitchExpressionLabel) \
175 TYPE(SwitchExpressionLBrace) \
176 TYPE(TableGenBangOperator) \
177 TYPE(TableGenCondOperator) \
178 TYPE(TableGenCondOperatorColon) \
179 TYPE(TableGenCondOperatorComma) \
180 TYPE(TableGenDAGArgCloser) \
181 TYPE(TableGenDAGArgListColon) \
182 TYPE(TableGenDAGArgListColonToAlign) \
183 TYPE(TableGenDAGArgListComma) \
184 TYPE(TableGenDAGArgListCommaToBreak) \
185 TYPE(TableGenDAGArgOpener) \
186 TYPE(TableGenDAGArgOpenerToBreak) \
187 TYPE(TableGenDAGArgOperatorID) \
188 TYPE(TableGenDAGArgOperatorToBreak) \
189 TYPE(TableGenListCloser) \
190 TYPE(TableGenListOpener) \
191 TYPE(TableGenMultiLineString) \
192 TYPE(TableGenTrailingPasteOperator) \
193 TYPE(TableGenValueSuffix) \
194 TYPE(TemplateCloser) \
195 TYPE(TemplateOpener) \
196 TYPE(TemplateString) \
197 TYPE(TrailingAnnotation) \
198 TYPE(TrailingReturnArrow) \
199 TYPE(TrailingUnaryOperator) \
200 TYPE(TypeDeclarationParen) \
203 TYPE(TypenameMacro) \
204 TYPE(UnaryOperator) \
207 TYPE(UntouchableMacroFunc) \
208 TYPE(VariableTemplate) \
210 TYPE(VerilogAssignComma) \
212 TYPE(VerilogBlockLabelColon) \
216 TYPE(VerilogDimensionedTypeName) \
218 TYPE(VerilogInstancePortComma) \
219 TYPE(VerilogInstancePortLParen) \
222 TYPE(VerilogMultiLineListLParen) \
224 TYPE(VerilogNumberBase) \
227 TYPE(VerilogProtected) \
229 TYPE(VerilogStrength) \
231 TYPE(VerilogTableItem) \
233 TYPE(VerilogTypeComma) \
239#define TYPE(X) TT_##X,
349 std::shared_ptr<TokenRole>
Role;
412 unsigned BlockKind : 2;
420 assert(
getBlockKind() == BBK &&
"BraceBlockKind overflow!");
425 unsigned Decision : 2;
433 assert(
getDecision() == D &&
"FormatDecision overflow!");
438 unsigned PackingKind : 2;
446 assert(
getPackingKind() == K &&
"ParameterPackingKind overflow!");
450 unsigned TypeIsFinalized : 1;
463 assert((!TypeIsFinalized || T == Type) &&
464 "Please use overwriteFixedType to change a fixed type.");
475 TypeIsFinalized =
true;
480 TypeIsFinalized =
false;
634 std::optional<MacroExpansion>
MacroCtx;
647 return Tok.getObjCKeywordID() == Kind;
651 return II && II ==
Tok.getIdentifierInfo();
654 return Tok.getIdentifierInfo() &&
655 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
660 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
661 return is(K1) ||
is(K2);
663 template <
typename A,
typename B,
typename... Ts>
667 template <
typename T>
bool isNot(T Kind)
const {
return !
is(Kind); }
668 template <
typename... Ts>
bool isNoneOf(Ts... Ks)
const {
672 bool isIf(
bool AllowConstexprMacro =
true)
const {
673 return is(tok::kw_if) || endsSequence(tok::kw_constexpr, tok::kw_if) ||
674 (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
677 bool isLoop(
const FormatStyle &Style)
const {
678 return isOneOf(tok::kw_for, tok::kw_while) ||
687 return Previous->closesScopeAfterBlock();
693 template <
typename A,
typename... Ts>
694 bool startsSequence(A K1, Ts... Tokens)
const {
695 return startsSequenceInternal(K1, Tokens...);
704 template <
typename A,
typename... Ts>
705 bool endsSequence(A K1, Ts... Tokens)
const {
706 return endsSequenceInternal(K1, Tokens...);
711 bool isAttribute()
const {
712 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
715 bool isAccessSpecifierKeyword()
const {
716 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
719 bool isAccessSpecifier(
bool ColonRequired =
true)
const {
720 if (!isAccessSpecifierKeyword())
725 return NextNonComment && NextNonComment->is(tok::colon);
728 bool canBePointerOrReferenceQualifier()
const {
729 return isOneOf(tok::kw_const, tok::kw_restrict, tok::kw_volatile,
730 tok::kw__Nonnull, tok::kw__Nullable,
731 tok::kw__Null_unspecified, tok::kw___ptr32, tok::kw___ptr64,
732 tok::kw___funcref) ||
736 [[nodiscard]]
bool isQtProperty()
const;
737 [[nodiscard]]
bool isTypeName(
const LangOptions &LangOpts)
const;
738 [[nodiscard]]
bool isTypeOrIdentifier(
const LangOptions &LangOpts)
const;
740 bool isObjCAccessSpecifier()
const {
741 return is(tok::at) &&
Next &&
742 Next->isOneOf(tok::objc_public, tok::objc_protected,
743 tok::objc_package, tok::objc_private);
746 bool isObjCLifetimeQualifier(
const FormatStyle &Style)
const {
747 if (Style.Language != FormatStyle::LK_ObjC ||
isNot(tok::identifier) ||
758 bool opensScope()
const {
759 if (
is(TT_TemplateString) &&
TokenText.ends_with(
"${"))
761 if (
is(TT_DictLiteral) &&
is(tok::less))
763 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
768 bool closesScope()
const {
769 if (
is(TT_TemplateString) &&
TokenText.starts_with(
"}"))
771 if (
is(TT_DictLiteral) &&
is(tok::greater))
773 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
778 bool isMemberAccess()
const {
779 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
780 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
781 TT_LambdaArrow, TT_LeadingJavaAnnotation);
784 bool isPointerOrReference()
const {
785 return isOneOf(tok::star, tok::amp, tok::ampamp);
788 bool isPlacementOperator()
const {
789 return isOneOf(tok::kw_new, tok::kw_delete);
792 bool isUnaryOperator()
const {
793 switch (
Tok.getKind()) {
797 case tok::minusminus:
801 case tok::kw_alignof:
808 bool isBinaryOperator()
const {
813 bool isTrailingComment()
const {
814 return is(tok::comment) &&
815 (
is(TT_LineComment) || !
Next ||
Next->NewlinesBefore > 0);
820 bool isFunctionLikeKeyword()
const {
824 return isOneOf(tok::kw_throw, tok::kw_typeid, tok::kw_return,
825 tok::kw_sizeof, tok::kw_alignof, tok::kw_alignas,
826 tok::kw_decltype, tok::kw_noexcept, tok::kw_static_assert,
829#include
"clang/Basic/TransformTypeTraits.def"
835 bool isLabelString()
const {
836 if (
isNot(tok::string_literal))
839 if (Content.starts_with(
"\"") || Content.starts_with(
"'"))
840 Content = Content.drop_front(1);
841 if (Content.ends_with(
"\"") || Content.ends_with(
"'"))
842 Content = Content.drop_back(1);
843 Content = Content.trim();
844 return Content.size() > 1 &&
845 (Content.back() ==
':' || Content.back() ==
'=');
859 bool hasWhitespaceBefore()
const {
872 while (
Tok &&
Tok->isNot(A1))
877 template <
typename... Ts>
880 while (
Tok && (
Tok->isNot(Ks) && ...))
888 while (
Tok &&
Tok->is(tok::comment))
917 if (Prev && Prev->is(tok::coloncolon))
919 if (!AllowFollowingColonColon) {
938 if (!IsCpp ||
isNot(tok::l_square))
942 T = T->getPreviousNonComment();
943 }
while (T && T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
945 return T && T->is(tok::kw_auto);
950 if (
is(TT_TemplateString) && closesScope())
959 if (
is(tok::comment))
960 NamespaceTok = NamespaceTok->getNextNonComment();
962 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
963 NamespaceTok = NamespaceTok->getNextNonComment();
964 return NamespaceTok &&
965 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
977 template <
typename A,
typename... Ts>
978 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
979 if (
is(tok::comment) &&
Next)
980 return Next->startsSequenceInternal(K1, Tokens...);
981 return is(K1) &&
Next &&
Next->startsSequenceInternal(Tokens...);
984 template <
typename A>
bool startsSequenceInternal(A K1)
const {
985 if (
is(tok::comment) &&
Next)
986 return Next->startsSequenceInternal(K1);
990 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
992 return Previous->endsSequenceInternal(K1);
996 template <
typename A,
typename... Ts>
997 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
999 return Previous->endsSequenceInternal(K1, Tokens...);
1004class ContinuationIndenter;
1014 virtual void precomputeFormattingInfos(
const FormatToken *Token);
1022 virtual unsigned formatFromToken(LineState &State,
1023 ContinuationIndenter *Indenter,
1031 ContinuationIndenter *Indenter,
1037 virtual void CommaFound(
const FormatToken *Token) {}
1039 virtual const FormatToken *lastComma() {
return nullptr; }
1042 const FormatStyle &Style;
1045class CommaSeparatedList :
public TokenRole {
1048 : TokenRole(Style), HasNestedBracedList(
false) {}
1052 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1053 bool DryRun)
override;
1055 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1056 bool DryRun)
override;
1060 Commas.push_back(Token);
1066 return Commas.back();
1072 struct ColumnFormat {
1077 unsigned TotalWidth;
1088 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
1100 bool HasNestedBracedList;
1105struct AdditionalKeywords {
1106 AdditionalKeywords(IdentifierTable &IdentTable) {
1107 kw_final = &IdentTable.get(
"final");
1108 kw_override = &IdentTable.get(
"override");
1109 kw_in = &IdentTable.get(
"in");
1110 kw_of = &IdentTable.get(
"of");
1111 kw_CF_CLOSED_ENUM = &IdentTable.get(
"CF_CLOSED_ENUM");
1112 kw_CF_ENUM = &IdentTable.get(
"CF_ENUM");
1113 kw_CF_OPTIONS = &IdentTable.get(
"CF_OPTIONS");
1114 kw_NS_CLOSED_ENUM = &IdentTable.get(
"NS_CLOSED_ENUM");
1115 kw_NS_ENUM = &IdentTable.get(
"NS_ENUM");
1116 kw_NS_ERROR_ENUM = &IdentTable.get(
"NS_ERROR_ENUM");
1117 kw_NS_OPTIONS = &IdentTable.get(
"NS_OPTIONS");
1119 kw_as = &IdentTable.get(
"as");
1120 kw_async = &IdentTable.get(
"async");
1121 kw_await = &IdentTable.get(
"await");
1122 kw_declare = &IdentTable.get(
"declare");
1123 kw_finally = &IdentTable.get(
"finally");
1124 kw_from = &IdentTable.get(
"from");
1125 kw_function = &IdentTable.get(
"function");
1126 kw_get = &IdentTable.get(
"get");
1127 kw_import = &IdentTable.get(
"import");
1128 kw_infer = &IdentTable.get(
"infer");
1129 kw_is = &IdentTable.get(
"is");
1130 kw_let = &IdentTable.get(
"let");
1131 kw_module = &IdentTable.get(
"module");
1132 kw_readonly = &IdentTable.get(
"readonly");
1133 kw_set = &IdentTable.get(
"set");
1134 kw_type = &IdentTable.get(
"type");
1135 kw_typeof = &IdentTable.get(
"typeof");
1136 kw_var = &IdentTable.get(
"var");
1137 kw_yield = &IdentTable.get(
"yield");
1139 kw_abstract = &IdentTable.get(
"abstract");
1140 kw_assert = &IdentTable.get(
"assert");
1141 kw_extends = &IdentTable.get(
"extends");
1142 kw_implements = &IdentTable.get(
"implements");
1143 kw_instanceof = &IdentTable.get(
"instanceof");
1144 kw_interface = &IdentTable.get(
"interface");
1145 kw_native = &IdentTable.get(
"native");
1146 kw_package = &IdentTable.get(
"package");
1147 kw_record = &IdentTable.get(
"record");
1148 kw_synchronized = &IdentTable.get(
"synchronized");
1149 kw_throws = &IdentTable.get(
"throws");
1150 kw___except = &IdentTable.get(
"__except");
1151 kw___has_include = &IdentTable.get(
"__has_include");
1152 kw___has_include_next = &IdentTable.get(
"__has_include_next");
1154 kw_mark = &IdentTable.get(
"mark");
1155 kw_region = &IdentTable.get(
"region");
1157 kw_extend = &IdentTable.get(
"extend");
1158 kw_option = &IdentTable.get(
"option");
1159 kw_optional = &IdentTable.get(
"optional");
1160 kw_repeated = &IdentTable.get(
"repeated");
1161 kw_required = &IdentTable.get(
"required");
1162 kw_returns = &IdentTable.get(
"returns");
1164 kw_signals = &IdentTable.get(
"signals");
1165 kw_qsignals = &IdentTable.get(
"Q_SIGNALS");
1166 kw_slots = &IdentTable.get(
"slots");
1167 kw_qslots = &IdentTable.get(
"Q_SLOTS");
1170 kw_internal_ident_after_define =
1171 &IdentTable.get(
"__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
1174 kw_dollar = &IdentTable.get(
"dollar");
1175 kw_base = &IdentTable.get(
"base");
1176 kw_byte = &IdentTable.get(
"byte");
1177 kw_checked = &IdentTable.get(
"checked");
1178 kw_decimal = &IdentTable.get(
"decimal");
1179 kw_delegate = &IdentTable.get(
"delegate");
1180 kw_event = &IdentTable.get(
"event");
1181 kw_fixed = &IdentTable.get(
"fixed");
1182 kw_foreach = &IdentTable.get(
"foreach");
1183 kw_init = &IdentTable.get(
"init");
1184 kw_implicit = &IdentTable.get(
"implicit");
1185 kw_internal = &IdentTable.get(
"internal");
1186 kw_lock = &IdentTable.get(
"lock");
1187 kw_null = &IdentTable.get(
"null");
1188 kw_object = &IdentTable.get(
"object");
1189 kw_out = &IdentTable.get(
"out");
1190 kw_params = &IdentTable.get(
"params");
1191 kw_ref = &IdentTable.get(
"ref");
1192 kw_string = &IdentTable.get(
"string");
1193 kw_stackalloc = &IdentTable.get(
"stackalloc");
1194 kw_sbyte = &IdentTable.get(
"sbyte");
1195 kw_sealed = &IdentTable.get(
"sealed");
1196 kw_uint = &IdentTable.get(
"uint");
1197 kw_ulong = &IdentTable.get(
"ulong");
1198 kw_unchecked = &IdentTable.get(
"unchecked");
1199 kw_unsafe = &IdentTable.get(
"unsafe");
1200 kw_ushort = &IdentTable.get(
"ushort");
1201 kw_when = &IdentTable.get(
"when");
1202 kw_where = &IdentTable.get(
"where");
1205 kw_always = &IdentTable.get(
"always");
1206 kw_always_comb = &IdentTable.get(
"always_comb");
1207 kw_always_ff = &IdentTable.get(
"always_ff");
1208 kw_always_latch = &IdentTable.get(
"always_latch");
1209 kw_assign = &IdentTable.get(
"assign");
1210 kw_assume = &IdentTable.get(
"assume");
1211 kw_automatic = &IdentTable.get(
"automatic");
1212 kw_before = &IdentTable.get(
"before");
1213 kw_begin = &IdentTable.get(
"begin");
1214 kw_begin_keywords = &IdentTable.get(
"begin_keywords");
1215 kw_bins = &IdentTable.get(
"bins");
1216 kw_binsof = &IdentTable.get(
"binsof");
1217 kw_casex = &IdentTable.get(
"casex");
1218 kw_casez = &IdentTable.get(
"casez");
1219 kw_celldefine = &IdentTable.get(
"celldefine");
1220 kw_checker = &IdentTable.get(
"checker");
1221 kw_clocking = &IdentTable.get(
"clocking");
1222 kw_constraint = &IdentTable.get(
"constraint");
1223 kw_context = &IdentTable.get(
"context");
1224 kw_cover = &IdentTable.get(
"cover");
1225 kw_covergroup = &IdentTable.get(
"covergroup");
1226 kw_coverpoint = &IdentTable.get(
"coverpoint");
1227 kw_data_block = &IdentTable.get(
"data_block");
1228 kw_data_decrypt_key = &IdentTable.get(
"data_decrypt_key");
1229 kw_data_public_key = &IdentTable.get(
"data_public_key");
1230 kw_default_decay_time = &IdentTable.get(
"default_decay_time");
1231 kw_default_nettype = &IdentTable.get(
"default_nettype");
1232 kw_default_trireg_strength = &IdentTable.get(
"default_trireg_strength");
1233 kw_delay_mode_distributed = &IdentTable.get(
"delay_mode_distributed");
1234 kw_delay_mode_path = &IdentTable.get(
"delay_mode_path");
1235 kw_delay_mode_unit = &IdentTable.get(
"delay_mode_unit");
1236 kw_delay_mode_zero = &IdentTable.get(
"delay_mode_zero");
1237 kw_digest_block = &IdentTable.get(
"digest_block");
1238 kw_digest_decrypt_key = &IdentTable.get(
"digest_decrypt_key");
1239 kw_digest_public_key = &IdentTable.get(
"digest_public_key");
1240 kw_disable = &IdentTable.get(
"disable");
1241 kw_dist = &IdentTable.get(
"dist");
1242 kw_edge = &IdentTable.get(
"edge");
1243 kw_elsif = &IdentTable.get(
"elsif");
1244 kw_end = &IdentTable.get(
"end");
1245 kw_end_keywords = &IdentTable.get(
"end_keywords");
1246 kw_endcase = &IdentTable.get(
"endcase");
1247 kw_endcelldefine = &IdentTable.get(
"endcelldefine");
1248 kw_endchecker = &IdentTable.get(
"endchecker");
1249 kw_endclass = &IdentTable.get(
"endclass");
1250 kw_endclocking = &IdentTable.get(
"endclocking");
1251 kw_endfunction = &IdentTable.get(
"endfunction");
1252 kw_endgenerate = &IdentTable.get(
"endgenerate");
1253 kw_endgroup = &IdentTable.get(
"endgroup");
1254 kw_endinterface = &IdentTable.get(
"endinterface");
1255 kw_endmodule = &IdentTable.get(
"endmodule");
1256 kw_endpackage = &IdentTable.get(
"endpackage");
1257 kw_endprimitive = &IdentTable.get(
"endprimitive");
1258 kw_endprogram = &IdentTable.get(
"endprogram");
1259 kw_endproperty = &IdentTable.get(
"endproperty");
1260 kw_endsequence = &IdentTable.get(
"endsequence");
1261 kw_endspecify = &IdentTable.get(
"endspecify");
1262 kw_endtable = &IdentTable.get(
"endtable");
1263 kw_endtask = &IdentTable.get(
"endtask");
1264 kw_forever = &IdentTable.get(
"forever");
1265 kw_fork = &IdentTable.get(
"fork");
1266 kw_generate = &IdentTable.get(
"generate");
1267 kw_highz0 = &IdentTable.get(
"highz0");
1268 kw_highz1 = &IdentTable.get(
"highz1");
1269 kw_iff = &IdentTable.get(
"iff");
1270 kw_ifnone = &IdentTable.get(
"ifnone");
1271 kw_ignore_bins = &IdentTable.get(
"ignore_bins");
1272 kw_illegal_bins = &IdentTable.get(
"illegal_bins");
1273 kw_initial = &IdentTable.get(
"initial");
1274 kw_inout = &IdentTable.get(
"inout");
1275 kw_input = &IdentTable.get(
"input");
1276 kw_inside = &IdentTable.get(
"inside");
1277 kw_interconnect = &IdentTable.get(
"interconnect");
1278 kw_intersect = &IdentTable.get(
"intersect");
1279 kw_join = &IdentTable.get(
"join");
1280 kw_join_any = &IdentTable.get(
"join_any");
1281 kw_join_none = &IdentTable.get(
"join_none");
1282 kw_key_block = &IdentTable.get(
"key_block");
1283 kw_key_public_key = &IdentTable.get(
"key_public_key");
1284 kw_large = &IdentTable.get(
"large");
1285 kw_local = &IdentTable.get(
"local");
1286 kw_localparam = &IdentTable.get(
"localparam");
1287 kw_macromodule = &IdentTable.get(
"macromodule");
1288 kw_matches = &IdentTable.get(
"matches");
1289 kw_medium = &IdentTable.get(
"medium");
1290 kw_negedge = &IdentTable.get(
"negedge");
1291 kw_nounconnected_drive = &IdentTable.get(
"nounconnected_drive");
1292 kw_output = &IdentTable.get(
"output");
1293 kw_packed = &IdentTable.get(
"packed");
1294 kw_parameter = &IdentTable.get(
"parameter");
1295 kw_posedge = &IdentTable.get(
"posedge");
1296 kw_primitive = &IdentTable.get(
"primitive");
1297 kw_priority = &IdentTable.get(
"priority");
1298 kw_program = &IdentTable.get(
"program");
1299 kw_property = &IdentTable.get(
"property");
1300 kw_protect = &IdentTable.get(
"protect");
1301 kw_pull0 = &IdentTable.get(
"pull0");
1302 kw_pull1 = &IdentTable.get(
"pull1");
1303 kw_pure = &IdentTable.get(
"pure");
1304 kw_rand = &IdentTable.get(
"rand");
1305 kw_randc = &IdentTable.get(
"randc");
1306 kw_randcase = &IdentTable.get(
"randcase");
1307 kw_randsequence = &IdentTable.get(
"randsequence");
1308 kw_repeat = &IdentTable.get(
"repeat");
1309 kw_resetall = &IdentTable.get(
"resetall");
1310 kw_sample = &IdentTable.get(
"sample");
1311 kw_scalared = &IdentTable.get(
"scalared");
1312 kw_sequence = &IdentTable.get(
"sequence");
1313 kw_small = &IdentTable.get(
"small");
1314 kw_soft = &IdentTable.get(
"soft");
1315 kw_solve = &IdentTable.get(
"solve");
1316 kw_specify = &IdentTable.get(
"specify");
1317 kw_specparam = &IdentTable.get(
"specparam");
1318 kw_strong0 = &IdentTable.get(
"strong0");
1319 kw_strong1 = &IdentTable.get(
"strong1");
1320 kw_supply0 = &IdentTable.get(
"supply0");
1321 kw_supply1 = &IdentTable.get(
"supply1");
1322 kw_table = &IdentTable.get(
"table");
1323 kw_tagged = &IdentTable.get(
"tagged");
1324 kw_task = &IdentTable.get(
"task");
1325 kw_timescale = &IdentTable.get(
"timescale");
1326 kw_tri = &IdentTable.get(
"tri");
1327 kw_tri0 = &IdentTable.get(
"tri0");
1328 kw_tri1 = &IdentTable.get(
"tri1");
1329 kw_triand = &IdentTable.get(
"triand");
1330 kw_trior = &IdentTable.get(
"trior");
1331 kw_trireg = &IdentTable.get(
"trireg");
1332 kw_unconnected_drive = &IdentTable.get(
"unconnected_drive");
1333 kw_undefineall = &IdentTable.get(
"undefineall");
1334 kw_unique = &IdentTable.get(
"unique");
1335 kw_unique0 = &IdentTable.get(
"unique0");
1336 kw_uwire = &IdentTable.get(
"uwire");
1337 kw_vectored = &IdentTable.get(
"vectored");
1338 kw_wait = &IdentTable.get(
"wait");
1339 kw_wand = &IdentTable.get(
"wand");
1340 kw_weak0 = &IdentTable.get(
"weak0");
1341 kw_weak1 = &IdentTable.get(
"weak1");
1342 kw_wildcard = &IdentTable.get(
"wildcard");
1343 kw_wire = &IdentTable.get(
"wire");
1344 kw_with = &IdentTable.get(
"with");
1345 kw_wor = &IdentTable.get(
"wor");
1348 kw_verilogHash = &IdentTable.get(
"#");
1349 kw_verilogHashHash = &IdentTable.get(
"##");
1350 kw_apostrophe = &IdentTable.get(
"\'");
1353 kw_bit = &IdentTable.get(
"bit");
1354 kw_bits = &IdentTable.get(
"bits");
1355 kw_code = &IdentTable.get(
"code");
1356 kw_dag = &IdentTable.get(
"dag");
1357 kw_def = &IdentTable.get(
"def");
1358 kw_defm = &IdentTable.get(
"defm");
1359 kw_defset = &IdentTable.get(
"defset");
1360 kw_defvar = &IdentTable.get(
"defvar");
1361 kw_dump = &IdentTable.get(
"dump");
1362 kw_include = &IdentTable.get(
"include");
1363 kw_list = &IdentTable.get(
"list");
1364 kw_multiclass = &IdentTable.get(
"multiclass");
1365 kw_then = &IdentTable.get(
"then");
1369 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
1370 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
1371 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_override,
1372 kw_readonly, kw_set, kw_type, kw_typeof, kw_var, kw_yield,
1374 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
1376 CSharpExtraKeywords = JsExtraKeywords;
1377 CSharpExtraKeywords.insert(
1378 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate,
1379 kw_event, kw_fixed, kw_foreach, kw_implicit, kw_in,
1380 kw_init, kw_internal, kw_lock, kw_null, kw_object,
1381 kw_out, kw_params, kw_ref, kw_string, kw_stackalloc,
1382 kw_sbyte, kw_sealed, kw_uint, kw_ulong, kw_unchecked,
1383 kw_unsafe, kw_ushort, kw_when, kw_where});
1388 VerilogExtraKeywords =
1389 std::unordered_set<IdentifierInfo *>{kw_always,
1521 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>{
1800 return Tok.Tok.getIdentifierInfo() &&
1810 bool AcceptIdentifierName =
true)
const {
1813 if (
Tok.isAccessSpecifierKeyword())
1815 switch (
Tok.Tok.getKind()) {
1820 case tok::kw_continue:
1822 case tok::kw_default:
1823 case tok::kw_delete:
1827 case tok::kw_export:
1831 case tok::kw_import:
1832 case tok::kw_module:
1834 case tok::kw_return:
1835 case tok::kw_static:
1836 case tok::kw_switch:
1841 case tok::kw_typeof:
1846 case tok::identifier: {
1849 bool IsPseudoKeyword =
1850 JsExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
1851 JsExtraKeywords.end();
1852 return AcceptIdentifierName || !IsPseudoKeyword;
1860 switch (
Tok.Tok.getKind()) {
1862#define KEYWORD(X, Y) case tok::kw_##X:
1863#include "clang/Basic/TokenKinds.def"
1876 if (
Tok.isAccessSpecifierKeyword())
1878 switch (
Tok.Tok.getKind()) {
1886 case tok::kw_continue:
1887 case tok::kw_default:
1889 case tok::kw_double:
1892 case tok::kw_explicit:
1893 case tok::kw_extern:
1901 case tok::kw_namespace:
1903 case tok::kw_operator:
1904 case tok::kw_return:
1906 case tok::kw_sizeof:
1907 case tok::kw_static:
1908 case tok::kw_struct:
1909 case tok::kw_switch:
1914 case tok::kw_typeof:
1916 case tok::kw_virtual:
1918 case tok::kw_volatile:
1922 return Tok.is(tok::identifier) &&
1923 CSharpExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1924 CSharpExtraKeywords.end();
1929 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1933 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1938 switch (
Tok.Tok.getKind()) {
1942 case tok::kw_continue:
1943 case tok::kw_default:
1947 case tok::kw_export:
1948 case tok::kw_extern:
1951 case tok::kw_import:
1952 case tok::kw_restrict:
1953 case tok::kw_signed:
1954 case tok::kw_static:
1955 case tok::kw_struct:
1956 case tok::kw_typedef:
1958 case tok::kw_unsigned:
1959 case tok::kw_virtual:
1962 case tok::identifier:
1964 VerilogExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1965 VerilogExtraKeywords.end();
1968 return Tok.Tok.getIdentifierInfo();
1976 auto Info =
Tok.Tok.getIdentifierInfo();
1979 switch (Info->getPPKeywordID()) {
1980 case tok::pp_define:
1984 case tok::pp_ifndef:
1985 case tok::pp_include:
1987 case tok::pp_pragma:
2008 const auto *Prev =
Tok.getPreviousNonComment();
2026 if (
Tok.endsSequence(kw_function, kw_with))
2033 return Tok.isOneOf(tok::kw_case, tok::kw_class, kw_function, kw_module,
2034 kw_interface, kw_package, kw_casex, kw_casez, kw_checker,
2035 kw_clocking, kw_covergroup, kw_macromodule, kw_primitive,
2036 kw_program, kw_property, kw_randcase, kw_randsequence,
2043 return Tok.is(TT_CaseLabelColon) ||
2044 (
Tok.is(tok::kw_default) &&
2051 bool isVerilogStructuredProcedure(
const FormatToken &
Tok)
const {
2052 return Tok.isOneOf(kw_always, kw_always_comb, kw_always_ff, kw_always_latch,
2053 kw_final, kw_forever, kw_initial);
2057 switch (
Tok.Tok.getKind()) {
2058 case tok::kw_extern:
2059 case tok::kw_signed:
2060 case tok::kw_static:
2061 case tok::kw_unsigned:
2062 case tok::kw_virtual:
2064 case tok::identifier:
2078 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2079 kw_let, tok::kw_class);
2083 switch (
Tok.Tok.getKind()) {
2092 return Tok.is(tok::identifier) &&
2093 TableGenExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
2094 TableGenExtraKeywords.end();
2100 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2103 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2106 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2109 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2113 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with(
"/*");
2124 unsigned MinContinueColumn =
2125 MinColumnToken->OriginalColumn + (
isLineComment(*MinColumnToken) ? 0 : 1);
2126 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2128 FormatTok.OriginalColumn >= MinContinueColumn;
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)
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