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) \
83 TYPE(FunctionAnnotationRParen) \
84 TYPE(FunctionDeclarationName) \
85 TYPE(FunctionDeclarationLParen) \
86 TYPE(FunctionLBrace) \
87 TYPE(FunctionLikeMacro) \
88 TYPE(FunctionLikeOrFreestandingMacro) \
89 TYPE(FunctionTypeLParen) \
91 TYPE(GenericSelectionColon) \
93 TYPE(GotoLabelColon) \
95 TYPE(ImplicitStringLiteral) \
96 TYPE(InheritanceColon) \
97 TYPE(InheritanceComma) \
98 TYPE(InlineASMBrace) \
99 TYPE(InlineASMColon) \
100 TYPE(InlineASMSymbolicNameLSquare) \
101 TYPE(JavaAnnotation) \
102 TYPE(JsAndAndEqual) \
103 TYPE(JsComputedPropertyName) \
104 TYPE(JsExponentiation) \
105 TYPE(JsExponentiationEqual) \
106 TYPE(JsPipePipeEqual) \
107 TYPE(JsPrivateIdentifier) \
109 TYPE(JsTypeOperator) \
110 TYPE(JsTypeOptionalQuestion) \
112 TYPE(LambdaDefinitionLParen) \
114 TYPE(LambdaLSquare) \
115 TYPE(LeadingJavaAnnotation) \
117 TYPE(MacroBlockBegin) \
118 TYPE(MacroBlockEnd) \
119 TYPE(ModulePartitionColon) \
120 TYPE(NamespaceLBrace) \
121 TYPE(NamespaceMacro) \
122 TYPE(NamespaceRBrace) \
123 TYPE(NonNullAssertion) \
124 TYPE(NullCoalescingEqual) \
125 TYPE(NullCoalescingOperator) \
126 TYPE(NullPropagatingOperator) \
127 TYPE(ObjCBlockLBrace) \
128 TYPE(ObjCBlockLParen) \
135 TYPE(ObjCMethodExpr) \
137 TYPE(ObjCMethodSpecifier) \
142 TYPE(ObjCStringLiteral) \
143 TYPE(OverloadedOperator) \
144 TYPE(OverloadedOperatorLParen) \
145 TYPE(PointerOrReference) \
146 TYPE(ProtoExtensionLSquare) \
147 TYPE(PureVirtualSpecifier) \
149 TYPE(RangeBasedForLoopColon) \
153 TYPE(RequiresClause) \
154 TYPE(RequiresClauseInARequiresExpression) \
155 TYPE(RequiresExpression) \
156 TYPE(RequiresExpressionLBrace) \
157 TYPE(RequiresExpressionLParen) \
163 TYPE(StatementAttributeLikeMacro) \
164 TYPE(StatementMacro) \
169 TYPE(StringInConcatenation) \
172 TYPE(StructuredBindingLSquare) \
173 TYPE(SwitchExpressionLabel) \
174 TYPE(SwitchExpressionLBrace) \
175 TYPE(TableGenBangOperator) \
176 TYPE(TableGenCondOperator) \
177 TYPE(TableGenCondOperatorColon) \
178 TYPE(TableGenCondOperatorComma) \
179 TYPE(TableGenDAGArgCloser) \
180 TYPE(TableGenDAGArgListColon) \
181 TYPE(TableGenDAGArgListColonToAlign) \
182 TYPE(TableGenDAGArgListComma) \
183 TYPE(TableGenDAGArgListCommaToBreak) \
184 TYPE(TableGenDAGArgOpener) \
185 TYPE(TableGenDAGArgOpenerToBreak) \
186 TYPE(TableGenDAGArgOperatorID) \
187 TYPE(TableGenDAGArgOperatorToBreak) \
188 TYPE(TableGenListCloser) \
189 TYPE(TableGenListOpener) \
190 TYPE(TableGenMultiLineString) \
191 TYPE(TableGenTrailingPasteOperator) \
192 TYPE(TableGenValueSuffix) \
193 TYPE(TemplateCloser) \
194 TYPE(TemplateOpener) \
195 TYPE(TemplateString) \
196 TYPE(TrailingAnnotation) \
197 TYPE(TrailingReturnArrow) \
198 TYPE(TrailingUnaryOperator) \
199 TYPE(TypeDeclarationParen) \
202 TYPE(TypenameMacro) \
203 TYPE(UnaryOperator) \
206 TYPE(UntouchableMacroFunc) \
207 TYPE(VariableTemplate) \
209 TYPE(VerilogAssignComma) \
211 TYPE(VerilogBlockLabelColon) \
215 TYPE(VerilogDimensionedTypeName) \
217 TYPE(VerilogInstancePortComma) \
218 TYPE(VerilogInstancePortLParen) \
221 TYPE(VerilogMultiLineListLParen) \
223 TYPE(VerilogNumberBase) \
225 TYPE(VerilogStrength) \
227 TYPE(VerilogTableItem) \
229 TYPE(VerilogTypeComma) \
235#define TYPE(X) TT_##X,
345 std::shared_ptr<TokenRole>
Role;
408 unsigned BlockKind : 2;
416 assert(
getBlockKind() == BBK &&
"BraceBlockKind overflow!");
421 unsigned Decision : 2;
429 assert(
getDecision() == D &&
"FormatDecision overflow!");
434 unsigned PackingKind : 2;
442 assert(
getPackingKind() == K &&
"ParameterPackingKind overflow!");
446 unsigned TypeIsFinalized : 1;
459 assert((!TypeIsFinalized ||
T == Type) &&
460 "Please use overwriteFixedType to change a fixed type.");
471 TypeIsFinalized =
true;
476 TypeIsFinalized =
false;
639 return Tok.getObjCKeywordID() == Kind;
643 return II && II ==
Tok.getIdentifierInfo();
646 return Tok.getIdentifierInfo() &&
647 Tok.getIdentifierInfo()->getPPKeywordID() == Kind;
652 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
653 return is(K1) ||
is(K2);
655 template <
typename A,
typename B,
typename... Ts>
656 bool isOneOf(A K1, B K2, Ts... Ks)
const {
659 template <
typename T>
bool isNot(
T Kind)
const {
return !
is(Kind); }
660 template <
typename... Ts>
bool isNoneOf(Ts... Ks)
const {
664 bool isIf(
bool AllowConstexprMacro =
true)
const {
665 return is(tok::kw_if) || endsSequence(tok::kw_constexpr, tok::kw_if) ||
666 (endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
669 bool isLoop(
const FormatStyle &Style)
const {
670 return isOneOf(tok::kw_for, tok::kw_while) ||
679 return Previous->closesScopeAfterBlock();
685 template <
typename A,
typename... Ts>
686 bool startsSequence(A K1, Ts... Tokens)
const {
687 return startsSequenceInternal(K1, Tokens...);
696 template <
typename A,
typename... Ts>
697 bool endsSequence(A K1, Ts... Tokens)
const {
698 return endsSequenceInternal(K1, Tokens...);
703 bool isAttribute()
const {
704 return isOneOf(tok::kw___attribute, tok::kw___declspec, TT_AttributeMacro);
707 bool isAccessSpecifierKeyword()
const {
708 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private);
711 bool isAccessSpecifier(
bool ColonRequired =
true)
const {
712 if (!isAccessSpecifierKeyword())
717 return NextNonComment && NextNonComment->is(tok::colon);
720 bool canBePointerOrReferenceQualifier()
const {
721 return isOneOf(tok::kw_const, tok::kw_restrict, tok::kw_volatile,
722 tok::kw__Nonnull, tok::kw__Nullable,
723 tok::kw__Null_unspecified, tok::kw___ptr32, tok::kw___ptr64,
724 tok::kw___funcref) ||
728 [[nodiscard]]
bool isQtProperty()
const;
729 [[nodiscard]]
bool isTypeName(
const LangOptions &LangOpts)
const;
730 [[nodiscard]]
bool isTypeOrIdentifier(
const LangOptions &LangOpts)
const;
732 bool isObjCAccessSpecifier()
const {
733 return is(tok::at) &&
Next &&
734 Next->isOneOf(tok::objc_public, tok::objc_protected,
735 tok::objc_package, tok::objc_private);
738 bool isObjCLifetimeQualifier(
const FormatStyle &Style)
const {
739 if (Style.Language != FormatStyle::LK_ObjC ||
isNot(tok::identifier) ||
750 bool opensScope()
const {
751 if (
is(TT_TemplateString) &&
TokenText.ends_with(
"${"))
753 if (
is(TT_DictLiteral) &&
is(tok::less))
755 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
760 bool closesScope()
const {
761 if (
is(TT_TemplateString) &&
TokenText.starts_with(
"}"))
763 if (
is(TT_DictLiteral) &&
is(tok::greater))
765 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
770 bool isMemberAccess()
const {
771 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
772 isNoneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
773 TT_LambdaArrow, TT_LeadingJavaAnnotation);
776 bool isPointerOrReference()
const {
777 return isOneOf(tok::star, tok::amp, tok::ampamp);
780 bool isPlacementOperator()
const {
781 return isOneOf(tok::kw_new, tok::kw_delete);
784 bool isUnaryOperator()
const {
785 switch (
Tok.getKind()) {
789 case tok::minusminus:
793 case tok::kw_alignof:
800 bool isBinaryOperator()
const {
805 bool isTrailingComment()
const {
806 return is(tok::comment) &&
807 (
is(TT_LineComment) || !
Next ||
Next->NewlinesBefore > 0);
812 bool isFunctionLikeKeyword()
const {
816 return isOneOf(tok::kw_throw, tok::kw_typeid, tok::kw_return,
817 tok::kw_sizeof, tok::kw_alignof, tok::kw_alignas,
818 tok::kw_decltype, tok::kw_noexcept, tok::kw_static_assert,
821#include
"clang/Basic/TransformTypeTraits.def"
827 bool isLabelString()
const {
828 if (
isNot(tok::string_literal))
831 if (Content.starts_with(
"\"") || Content.starts_with(
"'"))
832 Content = Content.drop_front(1);
833 if (Content.ends_with(
"\"") || Content.ends_with(
"'"))
834 Content = Content.drop_back(1);
835 Content = Content.trim();
836 return Content.size() > 1 &&
837 (Content.back() ==
':' || Content.back() ==
'=');
845 SourceLocation getStartOfNonWhitespace()
const {
851 bool hasWhitespaceBefore()
const {
873 while (
Tok &&
Tok->is(tok::comment))
888 if (!IsCpp ||
isNot(tok::l_square))
892 T = T->getPreviousNonComment();
893 }
while (
T &&
T->isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
895 return T &&
T->is(tok::kw_auto);
900 if (
is(TT_TemplateString) && closesScope())
909 if (
is(tok::comment))
910 NamespaceTok = NamespaceTok->getNextNonComment();
912 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
913 NamespaceTok = NamespaceTok->getNextNonComment();
914 return NamespaceTok &&
915 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
927 template <
typename A,
typename... Ts>
928 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
929 if (
is(tok::comment) &&
Next)
930 return Next->startsSequenceInternal(K1, Tokens...);
931 return is(K1) &&
Next &&
Next->startsSequenceInternal(Tokens...);
934 template <
typename A>
bool startsSequenceInternal(A K1)
const {
935 if (
is(tok::comment) &&
Next)
936 return Next->startsSequenceInternal(K1);
940 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
942 return Previous->endsSequenceInternal(K1);
946 template <
typename A,
typename... Ts>
947 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
949 return Previous->endsSequenceInternal(K1, Tokens...);
954class ContinuationIndenter;
959 TokenRole(
const FormatStyle &Style) : Style(Style) {}
972 virtual unsigned formatFromToken(LineState &State,
973 ContinuationIndenter *Indenter,
981 ContinuationIndenter *Indenter,
989 virtual const FormatToken *lastComma() {
return nullptr; }
992 const FormatStyle &Style;
995class CommaSeparatedList :
public TokenRole {
1000 void precomputeFormattingInfos(
const FormatToken *Token)
override;
1002 unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter,
1003 bool DryRun)
override;
1005 unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter,
1006 bool DryRun)
override;
1009 void CommaFound(
const FormatToken *Token)
override {
1010 Commas.push_back(Token);
1016 return Commas.back();
1022 struct ColumnFormat {
1027 unsigned TotalWidth;
1038 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
1050 bool HasNestedBracedList;
1055struct AdditionalKeywords {
1056 AdditionalKeywords(IdentifierTable &IdentTable) {
1057 kw_final = &IdentTable.get(
"final");
1058 kw_override = &IdentTable.get(
"override");
1059 kw_in = &IdentTable.get(
"in");
1060 kw_of = &IdentTable.get(
"of");
1061 kw_CF_CLOSED_ENUM = &IdentTable.get(
"CF_CLOSED_ENUM");
1062 kw_CF_ENUM = &IdentTable.get(
"CF_ENUM");
1063 kw_CF_OPTIONS = &IdentTable.get(
"CF_OPTIONS");
1064 kw_NS_CLOSED_ENUM = &IdentTable.get(
"NS_CLOSED_ENUM");
1065 kw_NS_ENUM = &IdentTable.get(
"NS_ENUM");
1066 kw_NS_ERROR_ENUM = &IdentTable.get(
"NS_ERROR_ENUM");
1067 kw_NS_OPTIONS = &IdentTable.get(
"NS_OPTIONS");
1069 kw_as = &IdentTable.get(
"as");
1070 kw_async = &IdentTable.get(
"async");
1071 kw_await = &IdentTable.get(
"await");
1072 kw_declare = &IdentTable.get(
"declare");
1073 kw_finally = &IdentTable.get(
"finally");
1074 kw_from = &IdentTable.get(
"from");
1075 kw_function = &IdentTable.get(
"function");
1076 kw_get = &IdentTable.get(
"get");
1077 kw_import = &IdentTable.get(
"import");
1078 kw_infer = &IdentTable.get(
"infer");
1079 kw_is = &IdentTable.get(
"is");
1080 kw_let = &IdentTable.get(
"let");
1081 kw_module = &IdentTable.get(
"module");
1082 kw_readonly = &IdentTable.get(
"readonly");
1083 kw_set = &IdentTable.get(
"set");
1084 kw_type = &IdentTable.get(
"type");
1085 kw_typeof = &IdentTable.get(
"typeof");
1086 kw_var = &IdentTable.get(
"var");
1087 kw_yield = &IdentTable.get(
"yield");
1089 kw_abstract = &IdentTable.get(
"abstract");
1090 kw_assert = &IdentTable.get(
"assert");
1091 kw_extends = &IdentTable.get(
"extends");
1092 kw_implements = &IdentTable.get(
"implements");
1093 kw_instanceof = &IdentTable.get(
"instanceof");
1094 kw_interface = &IdentTable.get(
"interface");
1095 kw_native = &IdentTable.get(
"native");
1096 kw_package = &IdentTable.get(
"package");
1097 kw_record = &IdentTable.get(
"record");
1098 kw_synchronized = &IdentTable.get(
"synchronized");
1099 kw_throws = &IdentTable.get(
"throws");
1100 kw___except = &IdentTable.get(
"__except");
1101 kw___has_include = &IdentTable.get(
"__has_include");
1102 kw___has_include_next = &IdentTable.get(
"__has_include_next");
1104 kw_mark = &IdentTable.get(
"mark");
1105 kw_region = &IdentTable.get(
"region");
1107 kw_extend = &IdentTable.get(
"extend");
1108 kw_option = &IdentTable.get(
"option");
1109 kw_optional = &IdentTable.get(
"optional");
1110 kw_repeated = &IdentTable.get(
"repeated");
1111 kw_required = &IdentTable.get(
"required");
1112 kw_returns = &IdentTable.get(
"returns");
1114 kw_signals = &IdentTable.get(
"signals");
1115 kw_qsignals = &IdentTable.get(
"Q_SIGNALS");
1116 kw_slots = &IdentTable.get(
"slots");
1117 kw_qslots = &IdentTable.get(
"Q_SLOTS");
1120 kw_internal_ident_after_define =
1121 &IdentTable.get(
"__CLANG_FORMAT_INTERNAL_IDENT_AFTER_DEFINE__");
1124 kw_dollar = &IdentTable.get(
"dollar");
1125 kw_base = &IdentTable.get(
"base");
1126 kw_byte = &IdentTable.get(
"byte");
1127 kw_checked = &IdentTable.get(
"checked");
1128 kw_decimal = &IdentTable.get(
"decimal");
1129 kw_delegate = &IdentTable.get(
"delegate");
1130 kw_event = &IdentTable.get(
"event");
1131 kw_fixed = &IdentTable.get(
"fixed");
1132 kw_foreach = &IdentTable.get(
"foreach");
1133 kw_init = &IdentTable.get(
"init");
1134 kw_implicit = &IdentTable.get(
"implicit");
1135 kw_internal = &IdentTable.get(
"internal");
1136 kw_lock = &IdentTable.get(
"lock");
1137 kw_null = &IdentTable.get(
"null");
1138 kw_object = &IdentTable.get(
"object");
1139 kw_out = &IdentTable.get(
"out");
1140 kw_params = &IdentTable.get(
"params");
1141 kw_ref = &IdentTable.get(
"ref");
1142 kw_string = &IdentTable.get(
"string");
1143 kw_stackalloc = &IdentTable.get(
"stackalloc");
1144 kw_sbyte = &IdentTable.get(
"sbyte");
1145 kw_sealed = &IdentTable.get(
"sealed");
1146 kw_uint = &IdentTable.get(
"uint");
1147 kw_ulong = &IdentTable.get(
"ulong");
1148 kw_unchecked = &IdentTable.get(
"unchecked");
1149 kw_unsafe = &IdentTable.get(
"unsafe");
1150 kw_ushort = &IdentTable.get(
"ushort");
1151 kw_when = &IdentTable.get(
"when");
1152 kw_where = &IdentTable.get(
"where");
1155 kw_always = &IdentTable.get(
"always");
1156 kw_always_comb = &IdentTable.get(
"always_comb");
1157 kw_always_ff = &IdentTable.get(
"always_ff");
1158 kw_always_latch = &IdentTable.get(
"always_latch");
1159 kw_assign = &IdentTable.get(
"assign");
1160 kw_assume = &IdentTable.get(
"assume");
1161 kw_automatic = &IdentTable.get(
"automatic");
1162 kw_before = &IdentTable.get(
"before");
1163 kw_begin = &IdentTable.get(
"begin");
1164 kw_begin_keywords = &IdentTable.get(
"begin_keywords");
1165 kw_bins = &IdentTable.get(
"bins");
1166 kw_binsof = &IdentTable.get(
"binsof");
1167 kw_casex = &IdentTable.get(
"casex");
1168 kw_casez = &IdentTable.get(
"casez");
1169 kw_celldefine = &IdentTable.get(
"celldefine");
1170 kw_checker = &IdentTable.get(
"checker");
1171 kw_clocking = &IdentTable.get(
"clocking");
1172 kw_constraint = &IdentTable.get(
"constraint");
1173 kw_context = &IdentTable.get(
"context");
1174 kw_cover = &IdentTable.get(
"cover");
1175 kw_covergroup = &IdentTable.get(
"covergroup");
1176 kw_coverpoint = &IdentTable.get(
"coverpoint");
1177 kw_default_decay_time = &IdentTable.get(
"default_decay_time");
1178 kw_default_nettype = &IdentTable.get(
"default_nettype");
1179 kw_default_trireg_strength = &IdentTable.get(
"default_trireg_strength");
1180 kw_delay_mode_distributed = &IdentTable.get(
"delay_mode_distributed");
1181 kw_delay_mode_path = &IdentTable.get(
"delay_mode_path");
1182 kw_delay_mode_unit = &IdentTable.get(
"delay_mode_unit");
1183 kw_delay_mode_zero = &IdentTable.get(
"delay_mode_zero");
1184 kw_disable = &IdentTable.get(
"disable");
1185 kw_dist = &IdentTable.get(
"dist");
1186 kw_edge = &IdentTable.get(
"edge");
1187 kw_elsif = &IdentTable.get(
"elsif");
1188 kw_end = &IdentTable.get(
"end");
1189 kw_end_keywords = &IdentTable.get(
"end_keywords");
1190 kw_endcase = &IdentTable.get(
"endcase");
1191 kw_endcelldefine = &IdentTable.get(
"endcelldefine");
1192 kw_endchecker = &IdentTable.get(
"endchecker");
1193 kw_endclass = &IdentTable.get(
"endclass");
1194 kw_endclocking = &IdentTable.get(
"endclocking");
1195 kw_endfunction = &IdentTable.get(
"endfunction");
1196 kw_endgenerate = &IdentTable.get(
"endgenerate");
1197 kw_endgroup = &IdentTable.get(
"endgroup");
1198 kw_endinterface = &IdentTable.get(
"endinterface");
1199 kw_endmodule = &IdentTable.get(
"endmodule");
1200 kw_endpackage = &IdentTable.get(
"endpackage");
1201 kw_endprimitive = &IdentTable.get(
"endprimitive");
1202 kw_endprogram = &IdentTable.get(
"endprogram");
1203 kw_endproperty = &IdentTable.get(
"endproperty");
1204 kw_endsequence = &IdentTable.get(
"endsequence");
1205 kw_endspecify = &IdentTable.get(
"endspecify");
1206 kw_endtable = &IdentTable.get(
"endtable");
1207 kw_endtask = &IdentTable.get(
"endtask");
1208 kw_forever = &IdentTable.get(
"forever");
1209 kw_fork = &IdentTable.get(
"fork");
1210 kw_generate = &IdentTable.get(
"generate");
1211 kw_highz0 = &IdentTable.get(
"highz0");
1212 kw_highz1 = &IdentTable.get(
"highz1");
1213 kw_iff = &IdentTable.get(
"iff");
1214 kw_ifnone = &IdentTable.get(
"ifnone");
1215 kw_ignore_bins = &IdentTable.get(
"ignore_bins");
1216 kw_illegal_bins = &IdentTable.get(
"illegal_bins");
1217 kw_initial = &IdentTable.get(
"initial");
1218 kw_inout = &IdentTable.get(
"inout");
1219 kw_input = &IdentTable.get(
"input");
1220 kw_inside = &IdentTable.get(
"inside");
1221 kw_interconnect = &IdentTable.get(
"interconnect");
1222 kw_intersect = &IdentTable.get(
"intersect");
1223 kw_join = &IdentTable.get(
"join");
1224 kw_join_any = &IdentTable.get(
"join_any");
1225 kw_join_none = &IdentTable.get(
"join_none");
1226 kw_large = &IdentTable.get(
"large");
1227 kw_local = &IdentTable.get(
"local");
1228 kw_localparam = &IdentTable.get(
"localparam");
1229 kw_macromodule = &IdentTable.get(
"macromodule");
1230 kw_matches = &IdentTable.get(
"matches");
1231 kw_medium = &IdentTable.get(
"medium");
1232 kw_negedge = &IdentTable.get(
"negedge");
1233 kw_nounconnected_drive = &IdentTable.get(
"nounconnected_drive");
1234 kw_output = &IdentTable.get(
"output");
1235 kw_packed = &IdentTable.get(
"packed");
1236 kw_parameter = &IdentTable.get(
"parameter");
1237 kw_posedge = &IdentTable.get(
"posedge");
1238 kw_primitive = &IdentTable.get(
"primitive");
1239 kw_priority = &IdentTable.get(
"priority");
1240 kw_program = &IdentTable.get(
"program");
1241 kw_property = &IdentTable.get(
"property");
1242 kw_pull0 = &IdentTable.get(
"pull0");
1243 kw_pull1 = &IdentTable.get(
"pull1");
1244 kw_pure = &IdentTable.get(
"pure");
1245 kw_rand = &IdentTable.get(
"rand");
1246 kw_randc = &IdentTable.get(
"randc");
1247 kw_randcase = &IdentTable.get(
"randcase");
1248 kw_randsequence = &IdentTable.get(
"randsequence");
1249 kw_repeat = &IdentTable.get(
"repeat");
1250 kw_resetall = &IdentTable.get(
"resetall");
1251 kw_sample = &IdentTable.get(
"sample");
1252 kw_scalared = &IdentTable.get(
"scalared");
1253 kw_sequence = &IdentTable.get(
"sequence");
1254 kw_small = &IdentTable.get(
"small");
1255 kw_soft = &IdentTable.get(
"soft");
1256 kw_solve = &IdentTable.get(
"solve");
1257 kw_specify = &IdentTable.get(
"specify");
1258 kw_specparam = &IdentTable.get(
"specparam");
1259 kw_strong0 = &IdentTable.get(
"strong0");
1260 kw_strong1 = &IdentTable.get(
"strong1");
1261 kw_supply0 = &IdentTable.get(
"supply0");
1262 kw_supply1 = &IdentTable.get(
"supply1");
1263 kw_table = &IdentTable.get(
"table");
1264 kw_tagged = &IdentTable.get(
"tagged");
1265 kw_task = &IdentTable.get(
"task");
1266 kw_timescale = &IdentTable.get(
"timescale");
1267 kw_tri = &IdentTable.get(
"tri");
1268 kw_tri0 = &IdentTable.get(
"tri0");
1269 kw_tri1 = &IdentTable.get(
"tri1");
1270 kw_triand = &IdentTable.get(
"triand");
1271 kw_trior = &IdentTable.get(
"trior");
1272 kw_trireg = &IdentTable.get(
"trireg");
1273 kw_unconnected_drive = &IdentTable.get(
"unconnected_drive");
1274 kw_undefineall = &IdentTable.get(
"undefineall");
1275 kw_unique = &IdentTable.get(
"unique");
1276 kw_unique0 = &IdentTable.get(
"unique0");
1277 kw_uwire = &IdentTable.get(
"uwire");
1278 kw_vectored = &IdentTable.get(
"vectored");
1279 kw_wait = &IdentTable.get(
"wait");
1280 kw_wand = &IdentTable.get(
"wand");
1281 kw_weak0 = &IdentTable.get(
"weak0");
1282 kw_weak1 = &IdentTable.get(
"weak1");
1283 kw_wildcard = &IdentTable.get(
"wildcard");
1284 kw_wire = &IdentTable.get(
"wire");
1285 kw_with = &IdentTable.get(
"with");
1286 kw_wor = &IdentTable.get(
"wor");
1289 kw_verilogHash = &IdentTable.get(
"#");
1290 kw_verilogHashHash = &IdentTable.get(
"##");
1291 kw_apostrophe = &IdentTable.get(
"\'");
1294 kw_bit = &IdentTable.get(
"bit");
1295 kw_bits = &IdentTable.get(
"bits");
1296 kw_code = &IdentTable.get(
"code");
1297 kw_dag = &IdentTable.get(
"dag");
1298 kw_def = &IdentTable.get(
"def");
1299 kw_defm = &IdentTable.get(
"defm");
1300 kw_defset = &IdentTable.get(
"defset");
1301 kw_defvar = &IdentTable.get(
"defvar");
1302 kw_dump = &IdentTable.get(
"dump");
1303 kw_include = &IdentTable.get(
"include");
1304 kw_list = &IdentTable.get(
"list");
1305 kw_multiclass = &IdentTable.get(
"multiclass");
1306 kw_then = &IdentTable.get(
"then");
1310 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
1311 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
1312 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_override,
1313 kw_readonly, kw_set, kw_type, kw_typeof, kw_var, kw_yield,
1315 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
1317 CSharpExtraKeywords = JsExtraKeywords;
1318 CSharpExtraKeywords.insert(
1319 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate,
1320 kw_event, kw_fixed, kw_foreach, kw_implicit, kw_in,
1321 kw_init, kw_internal, kw_lock, kw_null, kw_object,
1322 kw_out, kw_params, kw_ref, kw_string, kw_stackalloc,
1323 kw_sbyte, kw_sealed, kw_uint, kw_ulong, kw_unchecked,
1324 kw_unsafe, kw_ushort, kw_when, kw_where});
1329 VerilogExtraKeywords =
1330 std::unordered_set<IdentifierInfo *>({kw_always,
1460 kw_verilogHashHash});
1462 TableGenExtraKeywords = std::unordered_set<IdentifierInfo *>({
1748 return Tok.Tok.getIdentifierInfo() &&
1758 bool AcceptIdentifierName =
true)
const {
1761 if (
Tok.isAccessSpecifierKeyword())
1763 switch (
Tok.Tok.getKind()) {
1768 case tok::kw_continue:
1770 case tok::kw_default:
1771 case tok::kw_delete:
1775 case tok::kw_export:
1779 case tok::kw_import:
1780 case tok::kw_module:
1782 case tok::kw_return:
1783 case tok::kw_static:
1784 case tok::kw_switch:
1789 case tok::kw_typeof:
1794 case tok::identifier: {
1797 bool IsPseudoKeyword =
1798 JsExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
1799 JsExtraKeywords.end();
1800 return AcceptIdentifierName || !IsPseudoKeyword;
1808 switch (
Tok.Tok.getKind()) {
1810#define KEYWORD(X, Y) case tok::kw_##X:
1811#include "clang/Basic/TokenKinds.def"
1824 if (
Tok.isAccessSpecifierKeyword())
1826 switch (
Tok.Tok.getKind()) {
1834 case tok::kw_continue:
1835 case tok::kw_default:
1837 case tok::kw_double:
1840 case tok::kw_explicit:
1841 case tok::kw_extern:
1849 case tok::kw_namespace:
1851 case tok::kw_operator:
1852 case tok::kw_return:
1854 case tok::kw_sizeof:
1855 case tok::kw_static:
1856 case tok::kw_struct:
1857 case tok::kw_switch:
1862 case tok::kw_typeof:
1864 case tok::kw_virtual:
1866 case tok::kw_volatile:
1870 return Tok.is(tok::identifier) &&
1871 CSharpExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1872 CSharpExtraKeywords.end();
1877 return Tok.isOneOf(kw_verilogHash, kw_verilogHashHash, kw_apostrophe);
1881 return Tok.isOneOf(kw_before, kw_intersect, kw_dist, kw_iff, kw_inside,
1886 switch (
Tok.Tok.getKind()) {
1890 case tok::kw_continue:
1891 case tok::kw_default:
1895 case tok::kw_export:
1896 case tok::kw_extern:
1899 case tok::kw_import:
1900 case tok::kw_restrict:
1901 case tok::kw_signed:
1902 case tok::kw_static:
1903 case tok::kw_struct:
1904 case tok::kw_typedef:
1906 case tok::kw_unsigned:
1907 case tok::kw_virtual:
1910 case tok::identifier:
1912 VerilogExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) ==
1913 VerilogExtraKeywords.end();
1916 return Tok.Tok.getIdentifierInfo();
1924 auto Info =
Tok.Tok.getIdentifierInfo();
1927 switch (Info->getPPKeywordID()) {
1928 case tok::pp_define:
1932 case tok::pp_ifndef:
1933 case tok::pp_include:
1935 case tok::pp_pragma:
1956 const auto *Prev =
Tok.getPreviousNonComment();
1974 if (
Tok.endsSequence(kw_function, kw_with))
1981 return Tok.isOneOf(tok::kw_case, tok::kw_class, kw_function, kw_module,
1982 kw_interface, kw_package, kw_casex, kw_casez, kw_checker,
1983 kw_clocking, kw_covergroup, kw_macromodule, kw_primitive,
1984 kw_program, kw_property, kw_randcase, kw_randsequence,
1991 return Tok.is(TT_CaseLabelColon) ||
1999 bool isVerilogStructuredProcedure(
const FormatToken &
Tok)
const {
2000 return Tok.isOneOf(kw_always, kw_always_comb, kw_always_ff, kw_always_latch,
2001 kw_final, kw_forever, kw_initial);
2005 switch (
Tok.Tok.getKind()) {
2006 case tok::kw_extern:
2007 case tok::kw_signed:
2008 case tok::kw_static:
2009 case tok::kw_unsigned:
2010 case tok::kw_virtual:
2012 case tok::identifier:
2026 return Tok.isOneOf(kw_def, kw_defm, kw_defset, kw_defvar, kw_multiclass,
2027 kw_let, tok::kw_class);
2031 switch (
Tok.Tok.getKind()) {
2040 return Tok.is(tok::identifier) &&
2041 TableGenExtraKeywords.find(
Tok.Tok.getIdentifierInfo()) !=
2042 TableGenExtraKeywords.end();
2048 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
2051 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
2054 std::unordered_set<IdentifierInfo *> VerilogExtraKeywords;
2057 std::unordered_set<IdentifierInfo *> TableGenExtraKeywords;
2061 return FormatTok.is(tok::comment) && !FormatTok.TokenText.starts_with(
"/*");
2072 unsigned MinContinueColumn =
2073 MinColumnToken->OriginalColumn + (
isLineComment(*MinColumnToken) ? 0 : 1);
2074 return isLineComment(FormatTok) && FormatTok.NewlinesBefore == 1 &&
2076 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, _)
void CommaFound(const FormatToken *Token) override
Adds Token as the next comma to the CommaSeparated list.
CommaSeparatedList(const FormatStyle &Style)
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...
One of these records is kept for each identifier that is lexed.
A trivial tuple used to represent a source range.
virtual void precomputeFormattingInfos(const FormatToken *Token)
After the TokenAnnotator has finished annotating all the tokens, this function precomputes required i...
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)
const FunctionProtoType * T
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_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_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
bool isVerilogEndOfLabel(const FormatToken &Tok) const
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_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_internal_ident_after_define
IdentifierInfo * kw_randsequence
IdentifierInfo * kw_checked
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_CF_CLOSED_ENUM
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