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(JsPrivateIdentifier) \ 65 TYPE(JsTypeOperator) \ 66 TYPE(JsTypeOptionalQuestion) \ 70 TYPE(LeadingJavaAnnotation) \ 72 TYPE(MacroBlockBegin) \ 74 TYPE(NamespaceMacro) \ 75 TYPE(ObjCBlockLBrace) \ 76 TYPE(ObjCBlockLParen) \ 79 TYPE(ObjCMethodExpr) \ 80 TYPE(ObjCMethodSpecifier) \ 82 TYPE(ObjCStringLiteral) \ 83 TYPE(OverloadedOperator) \ 84 TYPE(OverloadedOperatorLParen) \ 85 TYPE(PointerOrReference) \ 86 TYPE(PureVirtualSpecifier) \ 87 TYPE(RangeBasedForLoopColon) \ 91 TYPE(StatementMacro) \ 92 TYPE(StructuredBindingLSquare) \ 93 TYPE(TemplateCloser) \ 94 TYPE(TemplateOpener) \ 95 TYPE(TemplateString) \ 96 TYPE(ProtoExtensionLSquare) \ 97 TYPE(TrailingAnnotation) \ 98 TYPE(TrailingReturnArrow) \ 99 TYPE(TrailingUnaryOperator) \ 100 TYPE(TypenameMacro) \ 101 TYPE(UnaryOperator) \ 102 TYPE(CSharpStringLiteral) \ 103 TYPE(CSharpNullCoalescing) \ 107 #define TYPE(X) TT_##X, 209 std::unique_ptr<TokenRole>
Role;
321 template <
typename A,
typename B>
bool isOneOf(A K1, B K2)
const {
322 return is(K1) ||
is(K2);
324 template <
typename A,
typename B,
typename... Ts>
328 template <
typename T>
bool isNot(T
Kind)
const {
return !
is(Kind); }
340 template <
typename A,
typename... Ts>
342 return startsSequenceInternal(K1, Tokens...);
347 template <
typename A,
typename... Ts>
349 return endsSequenceInternal(K1, Tokens...);
359 return isOneOf(tok::kw_public, tok::kw_protected, tok::kw_private) &&
360 (!ColonRequired || (Next && Next->
is(tok::colon)));
367 return is(tok::at) && Next &&
377 if (
is(TT_TemplateString) && TokenText.endswith(
"${"))
379 if (
is(TT_DictLiteral) &&
is(tok::less))
381 return isOneOf(tok::l_paren, tok::l_brace, tok::l_square,
387 if (
is(TT_TemplateString) && TokenText.startswith(
"}"))
389 if (
is(TT_DictLiteral) &&
is(tok::greater))
391 return isOneOf(tok::r_paren, tok::r_brace, tok::r_square,
397 return isOneOf(tok::arrow, tok::period, tok::arrowstar) &&
398 !
isOneOf(TT_DesignatedInitializerPeriod, TT_TrailingReturnArrow,
407 case tok::minusminus:
411 case tok::kw_alignof:
424 return is(tok::comment) &&
436 case tok::kw_alignof:
437 case tok::kw_alignas:
438 case tok::kw_decltype:
439 case tok::kw_noexcept:
440 case tok::kw_static_assert:
441 case tok::kw___attribute:
451 if (!
is(tok::string_literal))
454 if (Content.startswith(
"\"") || Content.startswith(
"'"))
455 Content = Content.drop_front(1);
456 if (Content.endswith(
"\"") || Content.endswith(
"'"))
457 Content = Content.drop_back(1);
458 Content = Content.trim();
459 return Content.size() > 1 &&
460 (Content.back() ==
':' || Content.back() ==
'=');
469 return WhitespaceRange.
getEnd();
480 while (Tok && Tok->
is(tok::comment))
488 while (Tok && Tok->
is(tok::comment))
498 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
500 (BlockKind ==
BK_Block ||
is(TT_DictLiteral) ||
501 (!Style.Cpp11BracedListStyle && NestingLevel == 0))) ||
502 (
is(tok::less) && (Style.Language == FormatStyle::LK_Proto ||
503 Style.Language == FormatStyle::LK_TextProto));
509 if (!Style.isCpp() ||
isNot(tok::l_square))
514 }
while (T && T->
isOneOf(tok::kw_const, tok::kw_volatile, tok::amp,
516 return T && T->
is(tok::kw_auto);
530 if (
is(tok::comment))
533 if (NamespaceTok && NamespaceTok->
isOneOf(tok::kw_inline, tok::kw_export))
535 return NamespaceTok &&
536 NamespaceTok->
isOneOf(tok::kw_namespace, TT_NamespaceMacro)
546 template <
typename A,
typename... Ts>
547 bool startsSequenceInternal(A K1, Ts... Tokens)
const {
548 if (
is(tok::comment) && Next)
549 return Next->startsSequenceInternal(K1, Tokens...);
550 return is(K1) && Next && Next->startsSequenceInternal(Tokens...);
553 template <
typename A>
bool startsSequenceInternal(A K1)
const {
554 if (
is(tok::comment) && Next)
555 return Next->startsSequenceInternal(K1);
559 template <
typename A,
typename... Ts>
bool endsSequenceInternal(A K1)
const {
560 if (
is(tok::comment) && Previous)
561 return Previous->endsSequenceInternal(K1);
565 template <
typename A,
typename... Ts>
566 bool endsSequenceInternal(A K1, Ts... Tokens)
const {
567 if (
is(tok::comment) && Previous)
568 return Previous->endsSequenceInternal(K1, Tokens...);
569 return is(K1) && Previous && Previous->endsSequenceInternal(Tokens...);
622 bool DryRun)
override;
625 bool DryRun)
override;
629 Commas.push_back(Token);
635 return Commas.back();
641 struct ColumnFormat {
657 const ColumnFormat *getColumnFormat(
unsigned RemainingCharacters)
const;
669 bool HasNestedBracedList;
676 kw_final = &IdentTable.
get(
"final");
677 kw_override = &IdentTable.
get(
"override");
678 kw_in = &IdentTable.
get(
"in");
679 kw_of = &IdentTable.
get(
"of");
680 kw_CF_ENUM = &IdentTable.
get(
"CF_ENUM");
681 kw_CF_OPTIONS = &IdentTable.
get(
"CF_OPTIONS");
682 kw_NS_ENUM = &IdentTable.
get(
"NS_ENUM");
683 kw_NS_OPTIONS = &IdentTable.
get(
"NS_OPTIONS");
685 kw_as = &IdentTable.
get(
"as");
686 kw_async = &IdentTable.
get(
"async");
687 kw_await = &IdentTable.
get(
"await");
688 kw_declare = &IdentTable.
get(
"declare");
689 kw_finally = &IdentTable.
get(
"finally");
690 kw_from = &IdentTable.
get(
"from");
691 kw_function = &IdentTable.
get(
"function");
692 kw_get = &IdentTable.
get(
"get");
693 kw_import = &IdentTable.
get(
"import");
694 kw_infer = &IdentTable.
get(
"infer");
695 kw_is = &IdentTable.
get(
"is");
696 kw_let = &IdentTable.
get(
"let");
697 kw_module = &IdentTable.
get(
"module");
698 kw_readonly = &IdentTable.
get(
"readonly");
699 kw_set = &IdentTable.
get(
"set");
700 kw_type = &IdentTable.
get(
"type");
701 kw_typeof = &IdentTable.
get(
"typeof");
702 kw_var = &IdentTable.
get(
"var");
703 kw_yield = &IdentTable.
get(
"yield");
705 kw_abstract = &IdentTable.
get(
"abstract");
706 kw_assert = &IdentTable.
get(
"assert");
707 kw_extends = &IdentTable.
get(
"extends");
708 kw_implements = &IdentTable.
get(
"implements");
709 kw_instanceof = &IdentTable.
get(
"instanceof");
710 kw_interface = &IdentTable.
get(
"interface");
711 kw_native = &IdentTable.
get(
"native");
712 kw_package = &IdentTable.
get(
"package");
713 kw_synchronized = &IdentTable.
get(
"synchronized");
714 kw_throws = &IdentTable.
get(
"throws");
715 kw___except = &IdentTable.
get(
"__except");
716 kw___has_include = &IdentTable.
get(
"__has_include");
717 kw___has_include_next = &IdentTable.
get(
"__has_include_next");
719 kw_mark = &IdentTable.
get(
"mark");
721 kw_extend = &IdentTable.
get(
"extend");
722 kw_option = &IdentTable.
get(
"option");
723 kw_optional = &IdentTable.
get(
"optional");
724 kw_repeated = &IdentTable.
get(
"repeated");
725 kw_required = &IdentTable.
get(
"required");
726 kw_returns = &IdentTable.
get(
"returns");
728 kw_signals = &IdentTable.
get(
"signals");
729 kw_qsignals = &IdentTable.
get(
"Q_SIGNALS");
730 kw_slots = &IdentTable.
get(
"slots");
731 kw_qslots = &IdentTable.
get(
"Q_SLOTS");
734 kw_dollar = &IdentTable.
get(
"dollar");
735 kw_base = &IdentTable.
get(
"base");
736 kw_byte = &IdentTable.
get(
"byte");
737 kw_checked = &IdentTable.
get(
"checked");
738 kw_decimal = &IdentTable.
get(
"decimal");
739 kw_delegate = &IdentTable.
get(
"delegate");
740 kw_event = &IdentTable.
get(
"event");
741 kw_fixed = &IdentTable.
get(
"fixed");
742 kw_foreach = &IdentTable.
get(
"foreach");
743 kw_implicit = &IdentTable.
get(
"implicit");
744 kw_internal = &IdentTable.
get(
"internal");
745 kw_lock = &IdentTable.
get(
"lock");
746 kw_null = &IdentTable.
get(
"null");
747 kw_object = &IdentTable.
get(
"object");
748 kw_out = &IdentTable.
get(
"out");
749 kw_params = &IdentTable.
get(
"params");
750 kw_ref = &IdentTable.
get(
"ref");
751 kw_string = &IdentTable.
get(
"string");
752 kw_stackalloc = &IdentTable.
get(
"stackalloc");
753 kw_sbyte = &IdentTable.
get(
"sbyte");
754 kw_sealed = &IdentTable.
get(
"sealed");
755 kw_uint = &IdentTable.
get(
"uint");
756 kw_ulong = &IdentTable.
get(
"ulong");
757 kw_unchecked = &IdentTable.
get(
"unchecked");
758 kw_unsafe = &IdentTable.
get(
"unsafe");
759 kw_ushort = &IdentTable.
get(
"ushort");
764 JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
765 {kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
766 kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_readonly,
767 kw_set, kw_type, kw_typeof, kw_var, kw_yield,
769 kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});
771 CSharpExtraKeywords = std::unordered_set<IdentifierInfo *>(
772 {kw_base, kw_byte, kw_checked, kw_decimal, kw_delegate, kw_event,
773 kw_fixed, kw_foreach, kw_implicit, kw_in, kw_interface, kw_internal,
774 kw_is, kw_lock, kw_null, kw_object, kw_out, kw_override, kw_params,
775 kw_readonly, kw_ref, kw_string, kw_stackalloc, kw_sbyte, kw_sealed,
776 kw_uint, kw_ulong, kw_unchecked, kw_unsafe, kw_ushort,
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});
882 return Tok.
is(tok::identifier) &&
884 JsExtraKeywords.end();
898 case tok::kw_continue:
899 case tok::kw_default:
904 case tok::kw_explicit:
913 case tok::kw_namespace:
915 case tok::kw_operator:
916 case tok::kw_private:
917 case tok::kw_protected:
931 case tok::kw_virtual:
933 case tok::kw_volatile:
937 return Tok.
is(tok::identifier) &&
939 CSharpExtraKeywords.end();
945 std::unordered_set<IdentifierInfo *> JsExtraKeywords;
948 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.