diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 0c1dce7a29408..3124549504196 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -821,8 +821,8 @@ struct FormatToken { /// Returns whether the token is the left square bracket of a C++ /// structured binding declaration. - bool isCppStructuredBinding(const FormatStyle &Style) const { - if (!Style.isCpp() || isNot(tok::l_square)) + bool isCppStructuredBinding(bool IsCpp) const { + if (!IsCpp || isNot(tok::l_square)) return false; const FormatToken *T = this; do { diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index a60d6ae197a24..04f0374b674e5 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -126,7 +126,7 @@ class AnnotatingParser { const AdditionalKeywords &Keywords, SmallVector &Scopes) : Style(Style), Line(Line), CurrentToken(Line.First), AutoFound(false), - Keywords(Keywords), Scopes(Scopes) { + IsCpp(Style.isCpp()), Keywords(Keywords), Scopes(Scopes) { Contexts.push_back(Context(tok::unknown, 1, /*IsExpression=*/false)); resetTokenMetadata(); } @@ -676,13 +676,13 @@ class AnnotatingParser { // In C++, this can happen either in array of templates (foo[10]) // or when array is a nested template type (unique_ptr[]>). bool CppArrayTemplates = - Style.isCpp() && Parent && Parent->is(TT_TemplateCloser) && + IsCpp && Parent && Parent->is(TT_TemplateCloser) && (Contexts.back().CanBeExpression || Contexts.back().IsExpression || Contexts.back().ContextType == Context::TemplateArgument); const bool IsInnerSquare = Contexts.back().InCpp11AttributeSpecifier; const bool IsCpp11AttributeSpecifier = - isCppAttribute(Style.isCpp(), *Left) || IsInnerSquare; + isCppAttribute(IsCpp, *Left) || IsInnerSquare; // Treat C# Attributes [STAThread] much like C++ attributes [[...]]. bool IsCSharpAttributeSpecifier = @@ -690,12 +690,11 @@ class AnnotatingParser { Contexts.back().InCSharpAttributeSpecifier; bool InsideInlineASM = Line.startsWith(tok::kw_asm); - bool IsCppStructuredBinding = Left->isCppStructuredBinding(Style); + bool IsCppStructuredBinding = Left->isCppStructuredBinding(IsCpp); bool StartsObjCMethodExpr = !IsCppStructuredBinding && !InsideInlineASM && !CppArrayTemplates && - Style.isCpp() && !IsCpp11AttributeSpecifier && - !IsCSharpAttributeSpecifier && Contexts.back().CanBeExpression && - Left->isNot(TT_LambdaLSquare) && + IsCpp && !IsCpp11AttributeSpecifier && !IsCSharpAttributeSpecifier && + Contexts.back().CanBeExpression && Left->isNot(TT_LambdaLSquare) && !CurrentToken->isOneOf(tok::l_brace, tok::r_square) && (!Parent || Parent->isOneOf(tok::colon, tok::l_square, tok::l_paren, @@ -723,7 +722,7 @@ class AnnotatingParser { Contexts.back().ContextKind == tok::l_brace && Parent->isOneOf(tok::l_brace, tok::comma)) { Left->setType(TT_JsComputedPropertyName); - } else if (Style.isCpp() && Contexts.back().ContextKind == tok::l_brace && + } else if (IsCpp && Contexts.back().ContextKind == tok::l_brace && Parent && Parent->isOneOf(tok::l_brace, tok::comma)) { Left->setType(TT_DesignatedInitializerLSquare); } else if (IsCSharpAttributeSpecifier) { @@ -1161,7 +1160,7 @@ class AnnotatingParser { if (Previous->is(TT_JsTypeOptionalQuestion)) Previous = Previous->getPreviousNonComment(); if ((CurrentToken->is(tok::colon) && !Style.isTableGen() && - (!Contexts.back().ColonIsDictLiteral || !Style.isCpp())) || + (!Contexts.back().ColonIsDictLiteral || !IsCpp)) || Style.isProto()) { OpeningBrace.setType(TT_DictLiteral); if (Previous->Tok.getIdentifierInfo() || @@ -1230,7 +1229,7 @@ class AnnotatingParser { } bool consumeToken() { - if (Style.isCpp()) { + if (IsCpp) { const auto *Prev = CurrentToken->getPreviousNonComment(); if (Prev && Prev->is(tok::r_square) && Prev->is(TT_AttributeSquare) && CurrentToken->isOneOf(tok::kw_if, tok::kw_switch, tok::kw_case, @@ -1424,7 +1423,7 @@ class AnnotatingParser { if (CurrentToken && CurrentToken->is(Keywords.kw_await)) next(); } - if (Style.isCpp() && CurrentToken && CurrentToken->is(tok::kw_co_await)) + if (IsCpp && CurrentToken && CurrentToken->is(tok::kw_co_await)) next(); Contexts.back().ColonIsForRangeExpr = true; if (!CurrentToken || CurrentToken->isNot(tok::l_paren)) @@ -2590,7 +2589,7 @@ class AnnotatingParser { /// Determine whether '(' is starting a C++ cast. bool lParenStartsCppCast(const FormatToken &Tok) { // C-style casts are only used in C++. - if (!Style.isCpp()) + if (!IsCpp) return false; FormatToken *LeftOfParens = Tok.getPreviousNonComment(); @@ -2611,10 +2610,8 @@ class AnnotatingParser { /// Determine whether ')' is ending a cast. bool rParenEndsCast(const FormatToken &Tok) { // C-style casts are only used in C++, C# and Java. - if (!Style.isCSharp() && !Style.isCpp() && - Style.Language != FormatStyle::LK_Java) { + if (!Style.isCSharp() && !IsCpp && Style.Language != FormatStyle::LK_Java) return false; - } // Empty parens aren't casts and there are no casts at the end of the line. if (Tok.Previous == Tok.MatchingParen || !Tok.Next || !Tok.MatchingParen) @@ -2691,7 +2688,7 @@ class AnnotatingParser { if (Tok.Next->isOneOf(tok::kw_noexcept, tok::kw_volatile, tok::kw_const, tok::kw_requires, tok::kw_throw, tok::arrow, Keywords.kw_override, Keywords.kw_final) || - isCppAttribute(Style.isCpp(), *Tok.Next)) { + isCppAttribute(IsCpp, *Tok.Next)) { return false; } @@ -3012,6 +3009,7 @@ class AnnotatingParser { AnnotatedLine &Line; FormatToken *CurrentToken; bool AutoFound; + bool IsCpp; const AdditionalKeywords &Keywords; SmallVector &Scopes; @@ -3559,7 +3557,7 @@ void TokenAnnotator::annotate(AnnotatedLine &Line) { ExpressionParser ExprParser(Style, Keywords, Line); ExprParser.parse(); - if (Style.isCpp()) { + if (IsCpp) { auto *Tok = getFunctionName(Line); if (Tok && ((!Scopes.empty() && Scopes.back() == ST_Class) || Line.endsWith(TT_FunctionLBrace) || isCtorOrDtorName(Tok))) { @@ -3766,7 +3764,6 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) const { if (AlignArrayOfStructures) calculateArrayInitializerColumnList(Line); - const bool IsCpp = Style.isCpp(); bool SeenName = false; bool LineIsFunctionDeclaration = false; FormatToken *ClosingParen = nullptr; @@ -3779,7 +3776,7 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) const { AfterLastAttribute = Tok; if (const bool IsCtorOrDtor = Tok->is(TT_CtorDtorDeclName); IsCtorOrDtor || - isFunctionDeclarationName(Style.isCpp(), *Tok, Line, ClosingParen)) { + isFunctionDeclarationName(IsCpp, *Tok, Line, ClosingParen)) { if (!IsCtorOrDtor) Tok->setFinalizedType(TT_FunctionDeclarationName); LineIsFunctionDeclaration = true; @@ -4717,7 +4714,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, if (Left.is(tok::star) && Right.is(tok::comment)) return true; - if (Style.isCpp()) { + if (IsCpp) { if (Left.is(TT_OverloadedOperator) && Right.isOneOf(TT_TemplateOpener, TT_TemplateCloser)) { return true; @@ -5425,7 +5422,7 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, if (!Keywords.isVerilogBegin(Right) && Keywords.isVerilogEndOfLabel(Left)) return true; } else if (Style.BreakAdjacentStringLiterals && - (Style.isCpp() || Style.isProto() || + (IsCpp || Style.isProto() || Style.Language == FormatStyle::LK_TableGen)) { if (Left.isStringLiteral() && Right.isStringLiteral()) return true; diff --git a/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h index 05a6daa87d803..a631e5f52bc60 100644 --- a/clang/lib/Format/TokenAnnotator.h +++ b/clang/lib/Format/TokenAnnotator.h @@ -212,7 +212,7 @@ class AnnotatedLine { class TokenAnnotator { public: TokenAnnotator(const FormatStyle &Style, const AdditionalKeywords &Keywords) - : Style(Style), Keywords(Keywords) {} + : Style(Style), IsCpp(Style.isCpp()), Keywords(Keywords) {} /// Adapts the indent levels of comment lines to the indent of the /// subsequent line. @@ -260,6 +260,8 @@ class TokenAnnotator { const FormatStyle &Style; + bool IsCpp; + const AdditionalKeywords &Keywords; SmallVector Scopes; diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 3a424bdcde793..2ce291da11b86 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -159,9 +159,9 @@ UnwrappedLineParser::UnwrappedLineParser( llvm::SpecificBumpPtrAllocator &Allocator, IdentifierTable &IdentTable) : Line(new UnwrappedLine), MustBreakBeforeNextToken(false), - CurrentLines(&Lines), Style(Style), Keywords(Keywords), - CommentPragmasRegex(Style.CommentPragmas), Tokens(nullptr), - Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1), + CurrentLines(&Lines), Style(Style), IsCpp(Style.isCpp()), + Keywords(Keywords), CommentPragmasRegex(Style.CommentPragmas), + Tokens(nullptr), Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1), IncludeGuard(Style.IndentPPDirectives == FormatStyle::PPDIS_None ? IG_Rejected : IG_Inited), @@ -572,8 +572,8 @@ void UnwrappedLineParser::calculateBraceTypes(bool ExpectClassBody) { (Style.isJavaScript() && NextTok->isOneOf(Keywords.kw_of, Keywords.kw_in, Keywords.kw_as)); - ProbablyBracedList = ProbablyBracedList || - (Style.isCpp() && NextTok->is(tok::l_paren)); + ProbablyBracedList = + ProbablyBracedList || (IsCpp && NextTok->is(tok::l_paren)); // If there is a comma, semicolon or right paren after the closing // brace, we assume this is a braced initializer list. @@ -1428,7 +1428,7 @@ void UnwrappedLineParser::parseStructuralElement( return; } - if (Style.isCpp()) { + if (IsCpp) { while (FormatTok->is(tok::l_square) && handleCppAttributes()) { } } else if (Style.isVerilog()) { @@ -1602,7 +1602,7 @@ void UnwrappedLineParser::parseStructuralElement( parseJavaScriptEs6ImportExport(); return; } - if (Style.isCpp()) { + if (IsCpp) { nextToken(); if (FormatTok->is(tok::kw_namespace)) { parseNamespace(); @@ -1646,12 +1646,11 @@ void UnwrappedLineParser::parseStructuralElement( addUnwrappedLine(); return; } - if (Style.isCpp() && parseModuleImport()) + if (IsCpp && parseModuleImport()) return; } - if (Style.isCpp() && - FormatTok->isOneOf(Keywords.kw_signals, Keywords.kw_qsignals, - Keywords.kw_slots, Keywords.kw_qslots)) { + if (IsCpp && FormatTok->isOneOf(Keywords.kw_signals, Keywords.kw_qsignals, + Keywords.kw_slots, Keywords.kw_qslots)) { nextToken(); if (FormatTok->is(tok::colon)) { nextToken(); @@ -1659,11 +1658,11 @@ void UnwrappedLineParser::parseStructuralElement( return; } } - if (Style.isCpp() && FormatTok->is(TT_StatementMacro)) { + if (IsCpp && FormatTok->is(TT_StatementMacro)) { parseStatementMacro(); return; } - if (Style.isCpp() && FormatTok->is(TT_NamespaceMacro)) { + if (IsCpp && FormatTok->is(TT_NamespaceMacro)) { parseNamespace(); return; } @@ -1759,7 +1758,7 @@ void UnwrappedLineParser::parseStructuralElement( } break; case tok::kw_requires: { - if (Style.isCpp()) { + if (IsCpp) { bool ParsedClause = parseRequires(); if (ParsedClause) return; @@ -1780,7 +1779,7 @@ void UnwrappedLineParser::parseStructuralElement( if (!parseEnum()) break; // This only applies to C++ and Verilog. - if (!Style.isCpp() && !Style.isVerilog()) { + if (!IsCpp && !Style.isVerilog()) { addUnwrappedLine(); return; } @@ -1848,7 +1847,7 @@ void UnwrappedLineParser::parseStructuralElement( parseParens(); // Break the unwrapped line if a K&R C function definition has a parameter // declaration. - if (OpeningBrace || !Style.isCpp() || !Previous || eof()) + if (OpeningBrace || !IsCpp || !Previous || eof()) break; if (isC78ParameterDecl(FormatTok, Tokens->peekNextToken(/*SkipComment=*/true), @@ -1977,13 +1976,13 @@ void UnwrappedLineParser::parseStructuralElement( } } - if (!Style.isCpp() && FormatTok->is(Keywords.kw_interface)) { + if (!IsCpp && FormatTok->is(Keywords.kw_interface)) { if (parseStructLike()) return; break; } - if (Style.isCpp() && FormatTok->is(TT_StatementMacro)) { + if (IsCpp && FormatTok->is(TT_StatementMacro)) { parseStatementMacro(); return; } @@ -2211,7 +2210,7 @@ bool UnwrappedLineParser::tryToParsePropertyAccessor() { bool UnwrappedLineParser::tryToParseLambda() { assert(FormatTok->is(tok::l_square)); - if (!Style.isCpp()) { + if (!IsCpp) { nextToken(); return false; } @@ -2340,7 +2339,7 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() { !Previous->isOneOf(tok::kw_return, tok::kw_co_await, tok::kw_co_yield, tok::kw_co_return)) || Previous->closesScope())) || - LeftSquare->isCppStructuredBinding(Style)) { + LeftSquare->isCppStructuredBinding(IsCpp)) { return false; } if (FormatTok->is(tok::l_square) || tok::isLiteral(FormatTok->Tok.getKind())) @@ -3153,7 +3152,7 @@ void UnwrappedLineParser::parseForOrWhileLoop(bool HasParens) { // JS' for await ( ... if (Style.isJavaScript() && FormatTok->is(Keywords.kw_await)) nextToken(); - if (Style.isCpp() && FormatTok->is(tok::kw_co_await)) + if (IsCpp && FormatTok->is(tok::kw_co_await)) nextToken(); if (HasParens && FormatTok->is(tok::l_paren)) { // The type is only set for Verilog basically because we were afraid to @@ -3737,7 +3736,7 @@ bool UnwrappedLineParser::parseEnum() { nextToken(); // If there are two identifiers in a row, this is likely an elaborate // return type. In Java, this can be "implements", etc. - if (Style.isCpp() && FormatTok->is(tok::identifier)) + if (IsCpp && FormatTok->is(tok::identifier)) return false; } } diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h index 1403533a2d0ef..619fbb217882b 100644 --- a/clang/lib/Format/UnwrappedLineParser.h +++ b/clang/lib/Format/UnwrappedLineParser.h @@ -324,6 +324,7 @@ class UnwrappedLineParser { llvm::BitVector DeclarationScopeStack; const FormatStyle &Style; + bool IsCpp; const AdditionalKeywords &Keywords; llvm::Regex CommentPragmasRegex;