Author: Owen Pan Date: 2024-05-13T21:54:23-07:00 New Revision: 364f988d3feb46ead8fdb657c9eab78d93425a28
URL: https://github.com/llvm/llvm-project/commit/364f988d3feb46ead8fdb657c9eab78d93425a28 DIFF: https://github.com/llvm/llvm-project/commit/364f988d3feb46ead8fdb657c9eab78d93425a28.diff LOG: Reland "[clang-format] Fix FormatToken::isSimpleTypeSpecifier() (#91712)" Remove FormatToken::isSimpleTypeSpecifier() and call Token::isSimpleTypeSpecifier(LangOpts) instead. Added: Modified: clang/lib/Format/Format.cpp clang/lib/Format/FormatToken.cpp clang/lib/Format/FormatToken.h clang/lib/Format/FormatTokenLexer.cpp clang/lib/Format/QualifierAlignmentFixer.cpp clang/lib/Format/QualifierAlignmentFixer.h clang/lib/Format/TokenAnalyzer.cpp clang/lib/Format/TokenAnalyzer.h clang/lib/Format/TokenAnnotator.cpp clang/lib/Format/TokenAnnotator.h clang/lib/Format/UnwrappedLineParser.cpp clang/lib/Format/UnwrappedLineParser.h clang/unittests/Format/QualifierFixerTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 8f027ffa20cca..52005a6c881f3 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -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. diff --git a/clang/lib/Format/FormatToken.cpp b/clang/lib/Format/FormatToken.cpp index 4fb70ffac706d..85bec71ffbbc8 100644 --- a/clang/lib/Format/FormatToken.cpp +++ b/clang/lib/Format/FormatToken.cpp @@ -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 { diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 95f16fde5005f..8792f4c750748 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -684,12 +684,8 @@ struct FormatToken { 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 && diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index f430d3764babe..e21b5a882b777 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -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); diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp b/clang/lib/Format/QualifierAlignmentFixer.cpp index 36d0639041c6c..593f8efff25aa 100644 --- a/clang/lib/Format/QualifierAlignmentFixer.cpp +++ b/clang/lib/Format/QualifierAlignmentFixer.cpp @@ -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)); } diff --git a/clang/lib/Format/QualifierAlignmentFixer.h b/clang/lib/Format/QualifierAlignmentFixer.h index e31d525da1640..a0a0d597ebf30 100644 --- a/clang/lib/Format/QualifierAlignmentFixer.h +++ b/clang/lib/Format/QualifierAlignmentFixer.h @@ -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); diff --git a/clang/lib/Format/TokenAnalyzer.cpp b/clang/lib/Format/TokenAnalyzer.cpp index bd648c430f9b0..804a2b0f5e8c1 100644 --- a/clang/lib/Format/TokenAnalyzer.cpp +++ b/clang/lib/Format/TokenAnalyzer.cpp @@ -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); diff --git a/clang/lib/Format/TokenAnalyzer.h b/clang/lib/Format/TokenAnalyzer.h index b7494c395c8a2..ef559099d325d 100644 --- a/clang/lib/Format/TokenAnalyzer.h +++ b/clang/lib/Format/TokenAnalyzer.h @@ -92,6 +92,7 @@ class TokenAnalyzer : public UnwrappedLineConsumer { void finishRun() override; FormatStyle Style; + LangOptions LangOpts; // Stores Style, FileID and SourceManager etc. const Environment &Env; // AffectedRangeMgr stores ranges to be fixed. diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index e935d3e2709cc..478cae23d3c8c 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -126,7 +126,9 @@ class AnnotatingParser { 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 @@ class AnnotatingParser { (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 @@ class AnnotatingParser { return true; // MyClass a; - if (PreviousNotConst->isTypeName(IsCpp)) + if (PreviousNotConst->isTypeName(LangOpts)) return true; // type[] a in Java @@ -2728,7 +2730,7 @@ class AnnotatingParser { } 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 @@ class AnnotatingParser { } // 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 @@ class AnnotatingParser { 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 @@ class AnnotatingParser { 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; diff --git a/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h index 25a24dccb1b83..d19d3d061e40c 100644 --- a/clang/lib/Format/TokenAnnotator.h +++ b/clang/lib/Format/TokenAnnotator.h @@ -211,7 +211,10 @@ class AnnotatedLine { 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 @@ class TokenAnnotator { const FormatStyle &Style; bool IsCpp; + LangOptions LangOpts; const AdditionalKeywords &Keywords; diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 310b75485e089..4f1c2c5114e93 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -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()) diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h index 2a0fe19d09572..d7963a4211bb9 100644 --- a/clang/lib/Format/UnwrappedLineParser.h +++ b/clang/lib/Format/UnwrappedLineParser.h @@ -316,6 +316,7 @@ class UnwrappedLineParser { const FormatStyle &Style; bool IsCpp; + LangOptions LangOpts; const AdditionalKeywords &Keywords; llvm::Regex CommentPragmasRegex; diff --git a/clang/unittests/Format/QualifierFixerTest.cpp b/clang/unittests/Format/QualifierFixerTest.cpp index 4ddeef50f5f78..1f21fc0e0b42f 100644 --- a/clang/unittests/Format/QualifierFixerTest.cpp +++ b/clang/unittests/Format/QualifierFixerTest.cpp @@ -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(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( + 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], 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(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( + 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], 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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits