15 #ifndef LLVM_CLANG_LIB_FORMAT_FORMATTOKEN_H 16 #define LLVM_CLANG_LIB_FORMAT_FORMATTOKEN_H 23 #include <unordered_set> 28 #define LIST_TOKEN_TYPES \ 29 TYPE(ArrayInitializerLSquare) \ 30 TYPE(ArraySubscriptLSquare) \ 31 TYPE(AttributeColon) \ 32 TYPE(AttributeParen) \ 33 TYPE(AttributeSquare) \ 34 TYPE(BinaryOperator) \ 38 TYPE(ConditionalExpr) \ 39 TYPE(ConflictAlternative) \ 42 TYPE(CtorInitializerColon) \ 43 TYPE(CtorInitializerComma) \ 44 TYPE(DesignatedInitializerLSquare) \ 45 TYPE(DesignatedInitializerPeriod) \ 48 TYPE(FunctionAnnotationRParen) \ 49 TYPE(FunctionDeclarationName) \ 50 TYPE(FunctionLBrace) \ 51 TYPE(FunctionTypeLParen) \ 52 TYPE(ImplicitStringLiteral) \ 53 TYPE(InheritanceColon) \ 54 TYPE(InheritanceComma) \ 55 TYPE(InlineASMBrace) \ 56 TYPE(InlineASMColon) \ 57 TYPE(JavaAnnotation) \ 58 TYPE(JsComputedPropertyName) \ 59 TYPE(JsExponentiation) \ 60 TYPE(JsExponentiationEqual) \ 62 TYPE(JsNonNullAssertion) \ 63 TYPE(JsNullishCoalescingOperator) \ 64 TYPE(JsNullPropagatingOperator) \ 65 TYPE(JsPrivateIdentifier) \ 67 TYPE(JsTypeOperator) \ 68 TYPE(JsTypeOptionalQuestion) \ 72 TYPE(LeadingJavaAnnotation) \ 74 TYPE(MacroBlockBegin) \ 76 TYPE(NamespaceMacro) \ 77 TYPE(ObjCBlockLBrace) \ 78 TYPE(ObjCBlockLParen) \ 81 TYPE(ObjCMethodExpr) \ 82 TYPE(ObjCMethodSpecifier) \ 84 TYPE(ObjCStringLiteral) \ 85 TYPE(OverloadedOperator) \ 86 TYPE(OverloadedOperatorLParen) \ 87 TYPE(PointerOrReference) \ 88 TYPE(PureVirtualSpecifier) \ 89 TYPE(RangeBasedForLoopColon) \ 93 TYPE(StatementMacro) \ 94 TYPE(StructuredBindingLSquare) \ 95 TYPE(TemplateCloser) \ 96 TYPE(TemplateOpener) \ 97 TYPE(TemplateString) \ 98 TYPE(ProtoExtensionLSquare) \ 99 TYPE(TrailingAnnotation) \ 100 TYPE(TrailingReturnArrow) \ 101 TYPE(TrailingUnaryOperator) \ 102 TYPE(TypenameMacro) \ 103 TYPE(UnaryOperator) \ 104 TYPE(CSharpStringLiteral) \ 105 TYPE(CSharpNullCoalescing) \ 109 #define TYPE(X) TT_##X, 211 std::unique_ptr<TokenRole>
Role;
323 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
324 return is(K1) ||
is(K2);
326 template <
typename A,
typename B,
typename... Ts>
330 template <
typename T>
bool isNot(T
Kind)
const {
return !
is(Kind); }
332 bool isIf(
bool AllowConstexprMacro =
true)
const {
333 return is(tok::kw_if) ||
endsSequence(tok::kw_constexpr, tok::kw_if) ||
334 (
endsSequence(tok::identifier, tok::kw_if) && AllowConstexprMacro);
347 template <
typename A,
typename... Ts>
349 return startsSequenceInternal(K1, Tokens...);
358 template <
typename A,
typename... Ts>
360 return endsSequenceInternal(K1, Tokens...);
370 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private) &&
371 (!ColonRequired || (Next && Next->
is(tok::colon)));
378 return is(tok::at) && Next &&
388 if (
is(TT_TemplateString) && TokenText.endswith(
"${"))
390 if (
is(TT_DictLiteral) &&
is(tok::less))
392 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
398 if (
is(TT_TemplateString) && TokenText.startswith(
"}"))
400 if (
is(TT_DictLiteral) &&
is(tok::greater))
402 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
408 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
409 !
isOneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
410 TT_LambdaArrow, TT_LeadingJavaAnnotation);
418 case tok::minusminus:
422 case tok::kw_alignof:
435 return is(tok::comment) &&
447 case tok::kw_alignof:
448 case tok::kw_alignas:
449 case tok::kw_decltype:
450 case tok::kw_noexcept:
451 case tok::kw_static_assert:
452 case tok::kw___attribute:
462 if (!
is(tok::string_literal))
465 if (Content.startswith(
"\"") || Content.startswith(
"'"))
466 Content = Content.drop_front(1);
467 if (Content.endswith(
"\"") || Content.endswith(
"'"))
468 Content = Content.drop_back(1);
469 Content = Content.trim();
470 return Content.size() > 1 &&
471 (Content.back() ==
':' || Content.back() ==
'=');
480 return WhitespaceRange.
getEnd();
491 while (Tok && Tok->
is(tok::comment))
499 while (Tok && Tok->
is(tok::comment))
509 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
511 (BlockKind ==
BK_Block ||
is(TT_DictLiteral) ||
512 (!Style.Cpp11BracedListStyle && NestingLevel == 0))) ||
513 (
is(tok::less) && (Style.Language == FormatStyle::LK_Proto ||
514 Style.Language == FormatStyle::LK_TextProto));
520 if (!Style.isCpp() ||
isNot(tok::l_square))
525 }
while (T && T->
isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
527 return T && T->
is(tok::kw_auto);
541 if (
is(tok::comment))
544 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
546 return NamespaceTok &&
547 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
557 template <
typename A,
typename... Ts>
558 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
559 if (
is(tok::comment) && Next)
560 return Next->startsSequenceInternal(K1, Tokens...);
561 return is(K1) && Next && Next->startsSequenceInternal(Tokens...);
564 template <
typename A>
bool startsSequenceInternal(A K1)
const {
565 if (
is(tok::comment) && Next)
566 return Next->startsSequenceInternal(K1);
570 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
571 if (
is(tok::comment) && Previous)
572 return Previous->endsSequenceInternal(K1);
576 template <
typename A,
typename... Ts>
577 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
578 if (
is(tok::comment) && Previous)
579 return Previous->endsSequenceInternal(K1, Tokens...);
580 return is(K1) && Previous && Previous->endsSequenceInternal(Tokens...);
633 bool DryRun)
override;
636 bool DryRun)
override;
640 Commas.push_back(Token);
646 return Commas.back();
652 struct ColumnFormat {
668 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
680 bool HasNestedBracedList;
687 kw_final = &IdentTable.
get(
"final");
688 kw_override = &IdentTable.
get(
"override");
689 kw_in = &IdentTable.
get(
"in");
690 kw_of = &IdentTable.
get(
"of");
691 kw_CF_CLOSED_ENUM = &IdentTable.
get(
"CF_CLOSED_ENUM");
692 kw_CF_ENUM = &IdentTable.
get(
"CF_ENUM");
693 kw_CF_OPTIONS = &IdentTable.
get(
"CF_OPTIONS");
694 kw_NS_CLOSED_ENUM = &IdentTable.
get(
"NS_CLOSED_ENUM");
695 kw_NS_ENUM = &IdentTable.
get(
"NS_ENUM");
696 kw_NS_OPTIONS = &IdentTable.
get(
"NS_OPTIONS");
698 kw_as = &IdentTable.
get(
"as");
699 kw_async = &IdentTable.
get(
"async");
700 kw_await = &IdentTable.
get(
"await");
701 kw_declare = &IdentTable.
get(
"declare");
702 kw_finally = &IdentTable.
get(
"finally");
703 kw_from = &IdentTable.
get(
"from");
704 kw_function = &IdentTable.
get(
"function");
705 kw_get = &IdentTable.
get(
"get");
706 kw_import = &IdentTable.
get(
"import");
707 kw_infer = &IdentTable.
get(
"infer");
708 kw_is = &IdentTable.
get(
"is");
709 kw_let = &IdentTable.
get(
"let");
710 kw_module = &IdentTable.
get(
"module");
711 kw_readonly = &IdentTable.
get(
"readonly");
712 kw_set = &IdentTable.
get(
"set");
713 kw_type = &IdentTable.
get(
"type");
714 kw_typeof = &IdentTable.
get(
"typeof");
715 kw_var = &IdentTable.
get(
"var");
716 kw_yield = &IdentTable.
get(
"yield");
718 kw_abstract = &IdentTable.
get(
"abstract");
719 kw_assert = &IdentTable.
get(
"assert");
720 kw_extends = &IdentTable.
get(
"extends");
721 kw_implements = &IdentTable.
get(
"implements");
722 kw_instanceof = &IdentTable.
get(
"instanceof");
723 kw_interface = &IdentTable.
get(
"interface");
724 kw_native = &IdentTable.
get(
"native");
725 kw_package = &IdentTable.
get(
"package");
726 kw_synchronized = &IdentTable.
get(
"synchronized");
727 kw_throws = &IdentTable.
get(
"throws");
728 kw___except = &IdentTable.
get(
"__except");
729 kw___has_include = &IdentTable.
get(
"__has_include");
730 kw___has_include_next = &IdentTable.
get(
"__has_include_next");
732 kw_mark = &IdentTable.
get(
"mark");
734 kw_extend = &IdentTable.
get(
"extend");
735 kw_option = &IdentTable.
get(
"option");
736 kw_optional = &IdentTable.
get(
"optional");
737 kw_repeated = &IdentTable.
get(
"repeated");
738 kw_required = &IdentTable.
get(
"required");
739 kw_returns = &IdentTable.
get(
"returns");
741 kw_signals = &IdentTable.
get(
"signals");
742 kw_qsignals = &IdentTable.
get(
"Q_SIGNALS");
743 kw_slots = &IdentTable.
get(
"slots");
744 kw_qslots = &IdentTable.
get(
"Q_SLOTS");
747 kw_dollar = &IdentTable.
get(
"dollar");
748 kw_base = &IdentTable.
get(
"base");
749 kw_byte = &IdentTable.
get(
"byte");
750 kw_checked = &IdentTable.
get(
"checked");
751 kw_decimal = &IdentTable.
get(
"decimal");
752 kw_delegate = &IdentTable.
get(
"delegate");
753 kw_event = &IdentTable.
get(
"event");
754 kw_fixed = &IdentTable.
get(
"fixed");
755 kw_foreach = &IdentTable.
get(
"foreach");
756 kw_implicit = &IdentTable.
get(
"implicit");
757 kw_internal = &IdentTable.
get(
"internal");
758 kw_lock = &IdentTable.
get(
"lock");
759 kw_null = &IdentTable.
get(
"null");
760 kw_object = &IdentTable.
get(
"object");
761 kw_out = &IdentTable.
get(
"out");
762 kw_params = &IdentTable.
get(
"params");
763 kw_ref = &IdentTable.
get(
"ref");
764 kw_string = &IdentTable.
get(
"string");
765 kw_stackalloc = &IdentTable.
get(
"stackalloc");
766 kw_sbyte = &IdentTable.
get(
"sbyte");
767 kw_sealed = &IdentTable.
get(
"sealed");
768 kw_uint = &IdentTable.
get(
"uint");
769 kw_ulong = &IdentTable.
get(
"ulong");
770 kw_unchecked = &IdentTable.
get(
"unchecked");
771 kw_unsafe = &IdentTable.
get(
"unsafe");
772 kw_ushort = &IdentTable.
get(
"ushort");
777 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
778 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
779 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_readonly,
780 kw_set, kw_type, kw_typeof, kw_var, kw_yield,
782 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
784 CSharpExtraKeywords = std::unordered_set<IdentifierInfo *>(
785 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate, kw_event,
786 kw_fixed, kw_foreach, kw_implicit, kw_in, kw_interface, kw_internal,
787 kw_is, kw_lock, kw_null, kw_object, kw_out, kw_override, kw_params,
788 kw_readonly, kw_ref, kw_string, kw_stackalloc, kw_sbyte, kw_sealed,
789 kw_uint, kw_ulong, kw_unchecked, kw_unsafe, kw_ushort,
791 kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
792 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_readonly,
793 kw_set, kw_type, kw_typeof, kw_var, kw_yield,
795 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
897 return Tok.
is(tok::identifier) &&
899 JsExtraKeywords.end();
913 case tok::kw_continue:
914 case tok::kw_default:
919 case tok::kw_explicit:
928 case tok::kw_namespace:
930 case tok::kw_operator:
931 case tok::kw_private:
932 case tok::kw_protected:
946 case tok::kw_virtual:
948 case tok::kw_volatile:
952 return Tok.
is(tok::identifier) &&
954 CSharpExtraKeywords.end();
960 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
963 std::unordered_set<IdentifierInfo *> CSharpExtraKeywords;
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {...
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...
tok::TokenKind getKind() const
One of these records is kept for each identifier that is lexed.
Token - This structure provides full information about a lexed token.
bool isObjCAtKeyword(tok::ObjCKeywordKind objcKey) const
Return true if we have an ObjC keyword identifier.
Implements an efficient mapping from strings to IdentifierInfo nodes.
PPKeywordKind
Provides a namespace for preprocessor keywords which start with a '#' at the beginning of the line...
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Defines and computes precedence levels for binary/ternary operators.
SourceLocation getEnd() const
ObjCKeywordKind
Provides a namespace for Objective-C keywords which start with an '@'.
Encodes a location in the source.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IdentifierInfo * getIdentifierInfo() const
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Dataflow Directional Tag Classes.
tok::PPKeywordKind getPPKeywordID() const
Return the preprocessor keyword ID for this identifier.
prec::Level getBinOpPrecedence(tok::TokenKind Kind, bool GreaterThanIsOperator, bool CPlusPlus11)
Return the precedence of the specified binary operator token.
A trivial tuple used to represent a source range.