mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 00:36:34 +00:00
Reland "[clang-format] Fix FormatToken::isSimpleTypeSpecifier() (#91712)"
Remove FormatToken::isSimpleTypeSpecifier() and call Token::isSimpleTypeSpecifier(LangOpts) instead.
This commit is contained in:
parent
96c23af8b3
commit
364f988d3f
@ -3858,8 +3858,7 @@ LangOptions getFormattingLangOpts(const FormatStyle &Style) {
|
||||
LangOpts.Digraphs = LexingStd >= FormatStyle::LS_Cpp11;
|
||||
|
||||
LangOpts.LineComment = 1;
|
||||
bool AlternativeOperators = Style.isCpp();
|
||||
LangOpts.CXXOperatorNames = AlternativeOperators ? 1 : 0;
|
||||
LangOpts.CXXOperatorNames = Style.isCpp();
|
||||
LangOpts.Bool = 1;
|
||||
LangOpts.ObjC = 1;
|
||||
LangOpts.MicrosoftExt = 1; // To get kw___try, kw___finally.
|
||||
|
@ -34,43 +34,6 @@ const char *getTokenTypeName(TokenType Type) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// FIXME: This is copy&pasted from Sema. Put it in a common place and remove
|
||||
// duplication.
|
||||
bool FormatToken::isSimpleTypeSpecifier() const {
|
||||
switch (Tok.getKind()) {
|
||||
case tok::kw_short:
|
||||
case tok::kw_long:
|
||||
case tok::kw___int64:
|
||||
case tok::kw___int128:
|
||||
case tok::kw_signed:
|
||||
case tok::kw_unsigned:
|
||||
case tok::kw_void:
|
||||
case tok::kw_char:
|
||||
case tok::kw_int:
|
||||
case tok::kw_half:
|
||||
case tok::kw_float:
|
||||
case tok::kw_double:
|
||||
case tok::kw___bf16:
|
||||
case tok::kw__Float16:
|
||||
case tok::kw___float128:
|
||||
case tok::kw___ibm128:
|
||||
case tok::kw_wchar_t:
|
||||
case tok::kw_bool:
|
||||
#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
|
||||
#include "clang/Basic/TransformTypeTraits.def"
|
||||
case tok::annot_typename:
|
||||
case tok::kw_char8_t:
|
||||
case tok::kw_char16_t:
|
||||
case tok::kw_char32_t:
|
||||
case tok::kw_typeof:
|
||||
case tok::kw_decltype:
|
||||
case tok::kw__Atomic:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Sorted common C++ non-keyword types.
|
||||
static SmallVector<StringRef> CppNonKeywordTypes = {
|
||||
"clock_t", "int16_t", "int32_t", "int64_t", "int8_t",
|
||||
@ -78,15 +41,16 @@ static SmallVector<StringRef> CppNonKeywordTypes = {
|
||||
"uint32_t", "uint64_t", "uint8_t", "uintptr_t",
|
||||
};
|
||||
|
||||
bool FormatToken::isTypeName(bool IsCpp) const {
|
||||
return is(TT_TypeName) || isSimpleTypeSpecifier() ||
|
||||
bool FormatToken::isTypeName(const LangOptions &LangOpts) const {
|
||||
const bool IsCpp = LangOpts.CXXOperatorNames;
|
||||
return is(TT_TypeName) || Tok.isSimpleTypeSpecifier(LangOpts) ||
|
||||
(IsCpp && is(tok::identifier) &&
|
||||
std::binary_search(CppNonKeywordTypes.begin(),
|
||||
CppNonKeywordTypes.end(), TokenText));
|
||||
}
|
||||
|
||||
bool FormatToken::isTypeOrIdentifier(bool IsCpp) const {
|
||||
return isTypeName(IsCpp) || isOneOf(tok::kw_auto, tok::identifier);
|
||||
bool FormatToken::isTypeOrIdentifier(const LangOptions &LangOpts) const {
|
||||
return isTypeName(LangOpts) || isOneOf(tok::kw_auto, tok::identifier);
|
||||
}
|
||||
|
||||
bool FormatToken::isBlockIndentedInitRBrace(const FormatStyle &Style) const {
|
||||
|
@ -684,12 +684,8 @@ public:
|
||||
isAttribute();
|
||||
}
|
||||
|
||||
/// Determine whether the token is a simple-type-specifier.
|
||||
[[nodiscard]] bool isSimpleTypeSpecifier() const;
|
||||
|
||||
[[nodiscard]] bool isTypeName(bool IsCpp) const;
|
||||
|
||||
[[nodiscard]] bool isTypeOrIdentifier(bool IsCpp) const;
|
||||
[[nodiscard]] bool isTypeName(const LangOptions &LangOpts) const;
|
||||
[[nodiscard]] bool isTypeOrIdentifier(const LangOptions &LangOpts) const;
|
||||
|
||||
bool isObjCAccessSpecifier() const {
|
||||
return is(tok::at) && Next &&
|
||||
|
@ -1442,7 +1442,6 @@ void FormatTokenLexer::readRawToken(FormatToken &Tok) {
|
||||
|
||||
void FormatTokenLexer::resetLexer(unsigned Offset) {
|
||||
StringRef Buffer = SourceMgr.getBufferData(ID);
|
||||
LangOpts = getFormattingLangOpts(Style);
|
||||
Lex.reset(new Lexer(SourceMgr.getLocForStartOfFile(ID), LangOpts,
|
||||
Buffer.begin(), Buffer.begin() + Offset, Buffer.end()));
|
||||
Lex->SetKeepWhitespaceMode(true);
|
||||
|
@ -268,13 +268,11 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
|
||||
if (isPossibleMacro(TypeToken))
|
||||
return Tok;
|
||||
|
||||
const bool IsCpp = Style.isCpp();
|
||||
|
||||
// The case `const long long int volatile` -> `long long int const volatile`
|
||||
// The case `long const long int volatile` -> `long long int const volatile`
|
||||
// The case `long long volatile int const` -> `long long int const volatile`
|
||||
// The case `const long long volatile int` -> `long long int const volatile`
|
||||
if (TypeToken->isTypeName(IsCpp)) {
|
||||
if (TypeToken->isTypeName(LangOpts)) {
|
||||
// The case `const decltype(foo)` -> `const decltype(foo)`
|
||||
// The case `const typeof(foo)` -> `const typeof(foo)`
|
||||
// The case `const _Atomic(foo)` -> `const _Atomic(foo)`
|
||||
@ -283,7 +281,7 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
|
||||
|
||||
const FormatToken *LastSimpleTypeSpecifier = TypeToken;
|
||||
while (isQualifierOrType(LastSimpleTypeSpecifier->getNextNonComment(),
|
||||
IsCpp)) {
|
||||
LangOpts)) {
|
||||
LastSimpleTypeSpecifier = LastSimpleTypeSpecifier->getNextNonComment();
|
||||
}
|
||||
|
||||
@ -295,7 +293,7 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
|
||||
// The case `unsigned short const` -> `unsigned short const`
|
||||
// The case:
|
||||
// `unsigned short volatile const` -> `unsigned short const volatile`
|
||||
if (PreviousCheck && PreviousCheck->isTypeName(IsCpp)) {
|
||||
if (PreviousCheck && PreviousCheck->isTypeName(LangOpts)) {
|
||||
if (LastQual != Tok)
|
||||
rotateTokens(SourceMgr, Fixes, Tok, LastQual, /*Left=*/false);
|
||||
return Tok;
|
||||
@ -412,11 +410,11 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
|
||||
// The case `volatile long long const int` -> `const volatile long long int`
|
||||
// The case `const long long volatile int` -> `const volatile long long int`
|
||||
// The case `long volatile long int const` -> `const volatile long long int`
|
||||
if (const bool IsCpp = Style.isCpp(); TypeToken->isTypeName(IsCpp)) {
|
||||
if (TypeToken->isTypeName(LangOpts)) {
|
||||
const FormatToken *LastSimpleTypeSpecifier = TypeToken;
|
||||
while (isConfiguredQualifierOrType(
|
||||
LastSimpleTypeSpecifier->getPreviousNonComment(),
|
||||
ConfiguredQualifierTokens, IsCpp)) {
|
||||
ConfiguredQualifierTokens, LangOpts)) {
|
||||
LastSimpleTypeSpecifier =
|
||||
LastSimpleTypeSpecifier->getPreviousNonComment();
|
||||
}
|
||||
@ -614,15 +612,15 @@ void prepareLeftRightOrderingForQualifierAlignmentFixer(
|
||||
}
|
||||
}
|
||||
|
||||
bool isQualifierOrType(const FormatToken *Tok, bool IsCpp) {
|
||||
return Tok &&
|
||||
(Tok->isTypeName(IsCpp) || Tok->is(tok::kw_auto) || isQualifier(Tok));
|
||||
bool isQualifierOrType(const FormatToken *Tok, const LangOptions &LangOpts) {
|
||||
return Tok && (Tok->isTypeName(LangOpts) || Tok->is(tok::kw_auto) ||
|
||||
isQualifier(Tok));
|
||||
}
|
||||
|
||||
bool isConfiguredQualifierOrType(const FormatToken *Tok,
|
||||
const std::vector<tok::TokenKind> &Qualifiers,
|
||||
bool IsCpp) {
|
||||
return Tok && (Tok->isTypeName(IsCpp) || Tok->is(tok::kw_auto) ||
|
||||
const LangOptions &LangOpts) {
|
||||
return Tok && (Tok->isTypeName(LangOpts) || Tok->is(tok::kw_auto) ||
|
||||
isConfiguredQualifier(Tok, Qualifiers));
|
||||
}
|
||||
|
||||
|
@ -33,10 +33,10 @@ void prepareLeftRightOrderingForQualifierAlignmentFixer(
|
||||
std::vector<tok::TokenKind> &Qualifiers);
|
||||
|
||||
// Is the Token a simple or qualifier type
|
||||
bool isQualifierOrType(const FormatToken *Tok, bool IsCpp = true);
|
||||
bool isQualifierOrType(const FormatToken *Tok, const LangOptions &LangOpts);
|
||||
bool isConfiguredQualifierOrType(const FormatToken *Tok,
|
||||
const std::vector<tok::TokenKind> &Qualifiers,
|
||||
bool IsCpp = true);
|
||||
const LangOptions &LangOpts);
|
||||
|
||||
// Is the Token likely a Macro
|
||||
bool isPossibleMacro(const FormatToken *Tok);
|
||||
|
@ -84,7 +84,7 @@ Environment::Environment(StringRef Code, StringRef FileName,
|
||||
NextStartColumn(NextStartColumn), LastStartColumn(LastStartColumn) {}
|
||||
|
||||
TokenAnalyzer::TokenAnalyzer(const Environment &Env, const FormatStyle &Style)
|
||||
: Style(Style), Env(Env),
|
||||
: Style(Style), LangOpts(getFormattingLangOpts(Style)), Env(Env),
|
||||
AffectedRangeMgr(Env.getSourceManager(), Env.getCharRanges()),
|
||||
UnwrappedLines(1),
|
||||
Encoding(encoding::detectEncoding(
|
||||
@ -101,7 +101,7 @@ std::pair<tooling::Replacements, unsigned>
|
||||
TokenAnalyzer::process(bool SkipAnnotation) {
|
||||
tooling::Replacements Result;
|
||||
llvm::SpecificBumpPtrAllocator<FormatToken> Allocator;
|
||||
IdentifierTable IdentTable(getFormattingLangOpts(Style));
|
||||
IdentifierTable IdentTable(LangOpts);
|
||||
FormatTokenLexer Lex(Env.getSourceManager(), Env.getFileID(),
|
||||
Env.getFirstStartColumn(), Style, Encoding, Allocator,
|
||||
IdentTable);
|
||||
|
@ -92,6 +92,7 @@ protected:
|
||||
void finishRun() override;
|
||||
|
||||
FormatStyle Style;
|
||||
LangOptions LangOpts;
|
||||
// Stores Style, FileID and SourceManager etc.
|
||||
const Environment &Env;
|
||||
// AffectedRangeMgr stores ranges to be fixed.
|
||||
|
@ -126,7 +126,9 @@ public:
|
||||
const AdditionalKeywords &Keywords,
|
||||
SmallVector<ScopeType> &Scopes)
|
||||
: Style(Style), Line(Line), CurrentToken(Line.First), AutoFound(false),
|
||||
IsCpp(Style.isCpp()), Keywords(Keywords), Scopes(Scopes) {
|
||||
IsCpp(Style.isCpp()), LangOpts(getFormattingLangOpts(Style)),
|
||||
Keywords(Keywords), Scopes(Scopes) {
|
||||
assert(IsCpp == LangOpts.CXXOperatorNames);
|
||||
Contexts.push_back(Context(tok::unknown, 1, /*IsExpression=*/false));
|
||||
resetTokenMetadata();
|
||||
}
|
||||
@ -562,7 +564,7 @@ private:
|
||||
(CurrentToken->is(tok::l_paren) && CurrentToken->Next &&
|
||||
CurrentToken->Next->isOneOf(tok::star, tok::amp, tok::caret));
|
||||
if ((CurrentToken->Previous->isOneOf(tok::kw_const, tok::kw_auto) ||
|
||||
CurrentToken->Previous->isTypeName(IsCpp)) &&
|
||||
CurrentToken->Previous->isTypeName(LangOpts)) &&
|
||||
!(CurrentToken->is(tok::l_brace) ||
|
||||
(CurrentToken->is(tok::l_paren) && !ProbablyFunctionTypeLParen))) {
|
||||
Contexts.back().IsExpression = false;
|
||||
@ -2624,7 +2626,7 @@ private:
|
||||
return true;
|
||||
|
||||
// MyClass a;
|
||||
if (PreviousNotConst->isTypeName(IsCpp))
|
||||
if (PreviousNotConst->isTypeName(LangOpts))
|
||||
return true;
|
||||
|
||||
// type[] a in Java
|
||||
@ -2728,7 +2730,7 @@ private:
|
||||
}
|
||||
|
||||
if (Tok.Next->is(tok::question) ||
|
||||
(Tok.Next->is(tok::ampamp) && !Tok.Previous->isTypeName(IsCpp))) {
|
||||
(Tok.Next->is(tok::ampamp) && !Tok.Previous->isTypeName(LangOpts))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2757,9 +2759,10 @@ private:
|
||||
}
|
||||
|
||||
// Heuristically try to determine whether the parentheses contain a type.
|
||||
auto IsQualifiedPointerOrReference = [](FormatToken *T, bool IsCpp) {
|
||||
auto IsQualifiedPointerOrReference = [](FormatToken *T,
|
||||
const LangOptions &LangOpts) {
|
||||
// This is used to handle cases such as x = (foo *const)&y;
|
||||
assert(!T->isTypeName(IsCpp) && "Should have already been checked");
|
||||
assert(!T->isTypeName(LangOpts) && "Should have already been checked");
|
||||
// Strip trailing qualifiers such as const or volatile when checking
|
||||
// whether the parens could be a cast to a pointer/reference type.
|
||||
while (T) {
|
||||
@ -2791,8 +2794,8 @@ private:
|
||||
bool ParensAreType =
|
||||
!Tok.Previous ||
|
||||
Tok.Previous->isOneOf(TT_TemplateCloser, TT_TypeDeclarationParen) ||
|
||||
Tok.Previous->isTypeName(IsCpp) ||
|
||||
IsQualifiedPointerOrReference(Tok.Previous, IsCpp);
|
||||
Tok.Previous->isTypeName(LangOpts) ||
|
||||
IsQualifiedPointerOrReference(Tok.Previous, LangOpts);
|
||||
bool ParensCouldEndDecl =
|
||||
Tok.Next->isOneOf(tok::equal, tok::semi, tok::l_brace, tok::greater);
|
||||
if (ParensAreType && !ParensCouldEndDecl)
|
||||
@ -3065,6 +3068,7 @@ private:
|
||||
FormatToken *CurrentToken;
|
||||
bool AutoFound;
|
||||
bool IsCpp;
|
||||
LangOptions LangOpts;
|
||||
const AdditionalKeywords &Keywords;
|
||||
|
||||
SmallVector<ScopeType> &Scopes;
|
||||
@ -3639,7 +3643,8 @@ void TokenAnnotator::annotate(AnnotatedLine &Line) {
|
||||
|
||||
// This function heuristically determines whether 'Current' starts the name of a
|
||||
// function declaration.
|
||||
static bool isFunctionDeclarationName(bool IsCpp, const FormatToken &Current,
|
||||
static bool isFunctionDeclarationName(const LangOptions &LangOpts,
|
||||
const FormatToken &Current,
|
||||
const AnnotatedLine &Line,
|
||||
FormatToken *&ClosingParen) {
|
||||
assert(Current.Previous);
|
||||
@ -3658,7 +3663,7 @@ static bool isFunctionDeclarationName(bool IsCpp, const FormatToken &Current,
|
||||
}
|
||||
|
||||
auto skipOperatorName =
|
||||
[IsCpp](const FormatToken *Next) -> const FormatToken * {
|
||||
[&LangOpts](const FormatToken *Next) -> const FormatToken * {
|
||||
for (; Next; Next = Next->Next) {
|
||||
if (Next->is(TT_OverloadedOperatorLParen))
|
||||
return Next;
|
||||
@ -3677,7 +3682,7 @@ static bool isFunctionDeclarationName(bool IsCpp, const FormatToken &Current,
|
||||
Next = Next->Next;
|
||||
continue;
|
||||
}
|
||||
if ((Next->isTypeName(IsCpp) || Next->is(tok::identifier)) &&
|
||||
if ((Next->isTypeName(LangOpts) || Next->is(tok::identifier)) &&
|
||||
Next->Next && Next->Next->isPointerOrReference()) {
|
||||
// For operator void*(), operator char*(), operator Foo*().
|
||||
Next = Next->Next;
|
||||
@ -3693,8 +3698,10 @@ static bool isFunctionDeclarationName(bool IsCpp, const FormatToken &Current,
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
const auto *Next = Current.Next;
|
||||
const bool IsCpp = LangOpts.CXXOperatorNames;
|
||||
|
||||
// Find parentheses of parameter list.
|
||||
const FormatToken *Next = Current.Next;
|
||||
if (Current.is(tok::kw_operator)) {
|
||||
if (Previous.Tok.getIdentifierInfo() &&
|
||||
!Previous.isOneOf(tok::kw_return, tok::kw_co_return)) {
|
||||
@ -3774,7 +3781,7 @@ static bool isFunctionDeclarationName(bool IsCpp, const FormatToken &Current,
|
||||
Tok = Tok->MatchingParen;
|
||||
continue;
|
||||
}
|
||||
if (Tok->is(tok::kw_const) || Tok->isTypeName(IsCpp) ||
|
||||
if (Tok->is(tok::kw_const) || Tok->isTypeName(LangOpts) ||
|
||||
Tok->isOneOf(TT_PointerOrReference, TT_StartOfName, tok::ellipsis)) {
|
||||
return true;
|
||||
}
|
||||
@ -3837,7 +3844,7 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) const {
|
||||
AfterLastAttribute = Tok;
|
||||
if (const bool IsCtorOrDtor = Tok->is(TT_CtorDtorDeclName);
|
||||
IsCtorOrDtor ||
|
||||
isFunctionDeclarationName(IsCpp, *Tok, Line, ClosingParen)) {
|
||||
isFunctionDeclarationName(LangOpts, *Tok, Line, ClosingParen)) {
|
||||
if (!IsCtorOrDtor)
|
||||
Tok->setFinalizedType(TT_FunctionDeclarationName);
|
||||
LineIsFunctionDeclaration = true;
|
||||
@ -4447,7 +4454,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
||||
if (Left.Tok.isLiteral())
|
||||
return true;
|
||||
// for (auto a = 0, b = 0; const auto & c : {1, 2, 3})
|
||||
if (Left.isTypeOrIdentifier(IsCpp) && Right.Next && Right.Next->Next &&
|
||||
if (Left.isTypeOrIdentifier(LangOpts) && Right.Next && Right.Next->Next &&
|
||||
Right.Next->Next->is(TT_RangeBasedForLoopColon)) {
|
||||
return getTokenPointerOrReferenceAlignment(Right) !=
|
||||
FormatStyle::PAS_Left;
|
||||
@ -4490,7 +4497,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
||||
if (Right.is(tok::l_brace) && Right.is(BK_Block))
|
||||
return true;
|
||||
// for (auto a = 0, b = 0; const auto& c : {1, 2, 3})
|
||||
if (BeforeLeft && BeforeLeft->isTypeOrIdentifier(IsCpp) && Right.Next &&
|
||||
if (BeforeLeft && BeforeLeft->isTypeOrIdentifier(LangOpts) && Right.Next &&
|
||||
Right.Next->is(TT_RangeBasedForLoopColon)) {
|
||||
return getTokenPointerOrReferenceAlignment(Left) !=
|
||||
FormatStyle::PAS_Right;
|
||||
@ -4534,7 +4541,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
||||
if (Right.isPointerOrReference()) {
|
||||
const FormatToken *Previous = &Left;
|
||||
while (Previous && Previous->isNot(tok::kw_operator)) {
|
||||
if (Previous->is(tok::identifier) || Previous->isTypeName(IsCpp)) {
|
||||
if (Previous->is(tok::identifier) || Previous->isTypeName(LangOpts)) {
|
||||
Previous = Previous->getPreviousNonComment();
|
||||
continue;
|
||||
}
|
||||
@ -4723,7 +4730,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
|
||||
if (!Style.isVerilog() &&
|
||||
(Left.isOneOf(tok::identifier, tok::greater, tok::r_square,
|
||||
tok::r_paren) ||
|
||||
Left.isTypeName(IsCpp)) &&
|
||||
Left.isTypeName(LangOpts)) &&
|
||||
Right.is(tok::l_brace) && Right.getNextNonComment() &&
|
||||
Right.isNot(BK_Block)) {
|
||||
return false;
|
||||
|
@ -211,7 +211,10 @@ private:
|
||||
class TokenAnnotator {
|
||||
public:
|
||||
TokenAnnotator(const FormatStyle &Style, const AdditionalKeywords &Keywords)
|
||||
: Style(Style), IsCpp(Style.isCpp()), Keywords(Keywords) {}
|
||||
: Style(Style), IsCpp(Style.isCpp()),
|
||||
LangOpts(getFormattingLangOpts(Style)), Keywords(Keywords) {
|
||||
assert(IsCpp == LangOpts.CXXOperatorNames);
|
||||
}
|
||||
|
||||
/// Adapts the indent levels of comment lines to the indent of the
|
||||
/// subsequent line.
|
||||
@ -260,6 +263,7 @@ private:
|
||||
const FormatStyle &Style;
|
||||
|
||||
bool IsCpp;
|
||||
LangOptions LangOpts;
|
||||
|
||||
const AdditionalKeywords &Keywords;
|
||||
|
||||
|
@ -160,13 +160,16 @@ UnwrappedLineParser::UnwrappedLineParser(
|
||||
IdentifierTable &IdentTable)
|
||||
: Line(new UnwrappedLine), MustBreakBeforeNextToken(false),
|
||||
CurrentLines(&Lines), Style(Style), IsCpp(Style.isCpp()),
|
||||
Keywords(Keywords), CommentPragmasRegex(Style.CommentPragmas),
|
||||
Tokens(nullptr), Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1),
|
||||
LangOpts(getFormattingLangOpts(Style)), Keywords(Keywords),
|
||||
CommentPragmasRegex(Style.CommentPragmas), Tokens(nullptr),
|
||||
Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1),
|
||||
IncludeGuard(Style.IndentPPDirectives == FormatStyle::PPDIS_None
|
||||
? IG_Rejected
|
||||
: IG_Inited),
|
||||
IncludeGuardToken(nullptr), FirstStartColumn(FirstStartColumn),
|
||||
Macros(Style.Macros, SourceMgr, Style, Allocator, IdentTable) {}
|
||||
Macros(Style.Macros, SourceMgr, Style, Allocator, IdentTable) {
|
||||
assert(IsCpp == LangOpts.CXXOperatorNames);
|
||||
}
|
||||
|
||||
void UnwrappedLineParser::reset() {
|
||||
PPBranchLevel = -1;
|
||||
@ -1870,7 +1873,7 @@ void UnwrappedLineParser::parseStructuralElement(
|
||||
case tok::caret:
|
||||
nextToken();
|
||||
// Block return type.
|
||||
if (FormatTok->Tok.isAnyIdentifier() || FormatTok->isTypeName(IsCpp)) {
|
||||
if (FormatTok->Tok.isAnyIdentifier() || FormatTok->isTypeName(LangOpts)) {
|
||||
nextToken();
|
||||
// Return types: pointers are ok too.
|
||||
while (FormatTok->is(tok::star))
|
||||
@ -2231,7 +2234,7 @@ bool UnwrappedLineParser::tryToParseLambda() {
|
||||
bool InTemplateParameterList = false;
|
||||
|
||||
while (FormatTok->isNot(tok::l_brace)) {
|
||||
if (FormatTok->isTypeName(IsCpp)) {
|
||||
if (FormatTok->isTypeName(LangOpts)) {
|
||||
nextToken();
|
||||
continue;
|
||||
}
|
||||
@ -3448,7 +3451,7 @@ bool UnwrappedLineParser::parseRequires() {
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if (PreviousNonComment->isTypeOrIdentifier(IsCpp)) {
|
||||
if (PreviousNonComment->isTypeOrIdentifier(LangOpts)) {
|
||||
// This is a requires clause.
|
||||
parseRequiresClause(RequiresToken);
|
||||
return true;
|
||||
@ -3511,7 +3514,7 @@ bool UnwrappedLineParser::parseRequires() {
|
||||
--OpenAngles;
|
||||
break;
|
||||
default:
|
||||
if (NextToken->isTypeName(IsCpp)) {
|
||||
if (NextToken->isTypeName(LangOpts)) {
|
||||
FormatTok = Tokens->setPosition(StoredPosition);
|
||||
parseRequiresExpression(RequiresToken);
|
||||
return false;
|
||||
@ -4027,7 +4030,7 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
|
||||
if (FormatTok->is(tok::l_square)) {
|
||||
FormatToken *Previous = FormatTok->Previous;
|
||||
if (!Previous || (Previous->isNot(tok::r_paren) &&
|
||||
!Previous->isTypeOrIdentifier(IsCpp))) {
|
||||
!Previous->isTypeOrIdentifier(LangOpts))) {
|
||||
// Don't try parsing a lambda if we had a closing parenthesis before,
|
||||
// it was probably a pointer to an array: int (*)[].
|
||||
if (!tryToParseLambda())
|
||||
|
@ -316,6 +316,7 @@ private:
|
||||
|
||||
const FormatStyle &Style;
|
||||
bool IsCpp;
|
||||
LangOptions LangOpts;
|
||||
const AdditionalKeywords &Keywords;
|
||||
|
||||
llvm::Regex CommentPragmasRegex;
|
||||
|
@ -1056,49 +1056,66 @@ TEST_F(QualifierFixerTest, IsQualifierType) {
|
||||
ConfiguredTokens.push_back(tok::kw_friend);
|
||||
|
||||
TestLexer lexer{Allocator, Buffers};
|
||||
const auto LangOpts = getFormattingLangOpts();
|
||||
|
||||
auto Tokens = lexer.lex(
|
||||
"const static inline auto restrict int double long constexpr friend");
|
||||
ASSERT_EQ(Tokens.size(), 11u) << Tokens;
|
||||
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[0], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[1], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[2], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[3], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[4], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[5], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[6], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[7], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[8], ConfiguredTokens));
|
||||
EXPECT_TRUE(isConfiguredQualifierOrType(Tokens[9], ConfiguredTokens));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[0], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[1], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[2], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[3], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[4], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[5], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[6], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[7], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[8], ConfiguredTokens, LangOpts));
|
||||
EXPECT_TRUE(
|
||||
isConfiguredQualifierOrType(Tokens[9], ConfiguredTokens, LangOpts));
|
||||
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[0]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[1]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[2]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[3]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[4]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[5]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[6]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[7]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[8]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[9]));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[0], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[1], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[2], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[3], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[4], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[5], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[6], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[7], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[8], LangOpts));
|
||||
EXPECT_TRUE(isQualifierOrType(Tokens[9], LangOpts));
|
||||
|
||||
auto NotTokens = lexer.lex("for while do Foo Bar ");
|
||||
ASSERT_EQ(NotTokens.size(), 6u) << Tokens;
|
||||
|
||||
EXPECT_FALSE(isConfiguredQualifierOrType(NotTokens[0], ConfiguredTokens));
|
||||
EXPECT_FALSE(isConfiguredQualifierOrType(NotTokens[1], ConfiguredTokens));
|
||||
EXPECT_FALSE(isConfiguredQualifierOrType(NotTokens[2], ConfiguredTokens));
|
||||
EXPECT_FALSE(isConfiguredQualifierOrType(NotTokens[3], ConfiguredTokens));
|
||||
EXPECT_FALSE(isConfiguredQualifierOrType(NotTokens[4], ConfiguredTokens));
|
||||
EXPECT_FALSE(isConfiguredQualifierOrType(NotTokens[5], ConfiguredTokens));
|
||||
EXPECT_FALSE(
|
||||
isConfiguredQualifierOrType(NotTokens[0], ConfiguredTokens, LangOpts));
|
||||
EXPECT_FALSE(
|
||||
isConfiguredQualifierOrType(NotTokens[1], ConfiguredTokens, LangOpts));
|
||||
EXPECT_FALSE(
|
||||
isConfiguredQualifierOrType(NotTokens[2], ConfiguredTokens, LangOpts));
|
||||
EXPECT_FALSE(
|
||||
isConfiguredQualifierOrType(NotTokens[3], ConfiguredTokens, LangOpts));
|
||||
EXPECT_FALSE(
|
||||
isConfiguredQualifierOrType(NotTokens[4], ConfiguredTokens, LangOpts));
|
||||
EXPECT_FALSE(
|
||||
isConfiguredQualifierOrType(NotTokens[5], ConfiguredTokens, LangOpts));
|
||||
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[0]));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[1]));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[2]));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[3]));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[4]));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[5]));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[0], LangOpts));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[1], LangOpts));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[2], LangOpts));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[3], LangOpts));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[4], LangOpts));
|
||||
EXPECT_FALSE(isQualifierOrType(NotTokens[5], LangOpts));
|
||||
}
|
||||
|
||||
TEST_F(QualifierFixerTest, IsMacro) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user