From 1cae5578fee00f3ae40056ca65bf443200af3441 Mon Sep 17 00:00:00 2001 From: Daniel Jasper <djasper@google.com> Date: Wed, 17 Jun 2015 09:43:56 +0000 Subject: [PATCH] clang-format: NFC. Add a function to test whether an annotated line starts with a given sequence of tokens. Only the one-token version is used yet, but other usages are coming up momentarily. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239892 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/TokenAnnotator.cpp | 29 +++++++++++++-------------- lib/Format/TokenAnnotator.h | 20 +++++++++++++++++- lib/Format/UnwrappedLineFormatter.cpp | 13 ++++++------ 3 files changed, 39 insertions(+), 23 deletions(-) diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 8ffd67f0d11..a332b62ce8a 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -87,7 +87,7 @@ private: if (CurrentToken->Previous->isOneOf(tok::pipepipe, tok::ampamp) && CurrentToken->Previous->is(TT_BinaryOperator) && Contexts[Contexts.size() - 2].IsExpression && - Line.First->isNot(tok::kw_template)) + !Line.startsWith(tok::kw_template)) return false; updateParameterCount(Left, CurrentToken); if (!consumeToken()) @@ -457,7 +457,7 @@ private: if (Contexts.back().ColonIsDictLiteral) { Tok->Type = TT_DictLiteral; } else if (Contexts.back().ColonIsObjCMethodExpr || - Line.First->is(TT_ObjCMethodSpecifier)) { + Line.startsWith(TT_ObjCMethodSpecifier)) { Tok->Type = TT_ObjCMethodExpr; Tok->Previous->Type = TT_SelectorName; if (Tok->Previous->ColumnWidth > @@ -503,7 +503,7 @@ private: if (!parseParens()) return false; if (Line.MustBeDeclaration && Contexts.size() == 1 && - !Contexts.back().IsExpression && Line.First->isNot(TT_ObjCProperty) && + !Contexts.back().IsExpression && !Line.startsWith(TT_ObjCProperty) && (!Tok->Previous || !Tok->Previous->isOneOf(tok::kw_decltype, TT_LeadingJavaAnnotation))) Line.MightBeFunctionDecl = true; @@ -581,7 +581,7 @@ private: if (Contexts.back().InCtorInitializer) Tok->Type = TT_CtorInitializerComma; else if (Contexts.back().FirstStartOfName && - (Contexts.size() == 1 || Line.First->is(tok::kw_for))) { + (Contexts.size() == 1 || Line.startsWith(tok::kw_for))) { Contexts.back().FirstStartOfName->PartOfMultiVariableDeclStmt = true; Line.IsMultiVariableDeclStmt = true; } @@ -724,7 +724,7 @@ public: if (ImportStatement) return LT_ImportStatement; - if (Line.First->is(TT_ObjCMethodSpecifier)) { + if (Line.startsWith(TT_ObjCMethodSpecifier)) { if (Contexts.back().FirstObjCSelectorName) Contexts.back().FirstObjCSelectorName->LongestObjCSelectorName = Contexts.back().LongestObjCSelectorName; @@ -820,7 +820,7 @@ private: !Line.First->isOneOf(tok::kw_template, tok::kw_using) && (!Current.Previous || Current.Previous->isNot(tok::kw_operator))) { Contexts.back().IsExpression = true; - if (!Line.First->is(TT_UnaryOperator)) { + if (!Line.startsWith(TT_UnaryOperator)) { for (FormatToken *Previous = Current.Previous; Previous && !Previous->isOneOf(tok::comma, tok::semi); Previous = Previous->Previous) { @@ -1441,11 +1441,11 @@ void TokenAnnotator::annotate(AnnotatedLine &Line) { ExpressionParser ExprParser(Style, Keywords, Line); ExprParser.parse(); - if (Line.First->is(TT_ObjCMethodSpecifier)) + if (Line.startsWith(TT_ObjCMethodSpecifier)) Line.Type = LT_ObjCMethodDecl; - else if (Line.First->is(TT_ObjCDecl)) + else if (Line.startsWith(TT_ObjCDecl)) Line.Type = LT_ObjCDecl; - else if (Line.First->is(TT_ObjCProperty)) + else if (Line.startsWith(TT_ObjCProperty)) Line.Type = LT_ObjCProperty; Line.First->SpacesRequiredBefore = 1; @@ -1638,7 +1638,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, if (Right.isOneOf(TT_StartOfName, TT_FunctionDeclarationName) || Right.is(tok::kw_operator)) { - if (Line.First->is(tok::kw_for) && Right.PartOfMultiVariableDeclStmt) + if (Line.startsWith(tok::kw_for) && Right.PartOfMultiVariableDeclStmt) return 3; if (Left.is(TT_StartOfName)) return 110; @@ -1674,8 +1674,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, (!Right.Next || Right.Next->isNot(tok::l_paren))) { // Moving trailing annotations to the next line is fine for ObjC method // declarations. - if (Line.First->is(TT_ObjCMethodSpecifier)) - + if (Line.startsWith(TT_ObjCMethodSpecifier)) return 10; // Generally, breaking before a trailing annotation is bad unless it is // function-like. It seems to be especially preferable to keep standard @@ -1687,7 +1686,7 @@ unsigned TokenAnnotator::splitPenalty(const AnnotatedLine &Line, } // In for-loops, prefer breaking at ',' and ';'. - if (Line.First->is(tok::kw_for) && Left.is(tok::equal)) + if (Line.startsWith(tok::kw_for) && Left.is(tok::equal)) return 4; // In Objective-C method expressions, prefer breaking before "param:" over @@ -1990,7 +1989,7 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, Left.MatchingParen && Left.MatchingParen->is(TT_OverloadedOperatorLParen)) return false; if (Right.is(tok::less) && Left.isNot(tok::l_paren) && - Line.First->is(tok::hash)) + Line.startsWith(tok::hash)) return true; if (Right.is(TT_TrailingUnaryOperator)) return false; @@ -2094,7 +2093,7 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, Line.First->isOneOf(tok::identifier, Keywords.kw_import, tok::kw_export, tok::kw_const) && // kw_var is a pseudo-token that's a tok::identifier, so matches above. - !Line.First->is(Keywords.kw_var)) + !Line.startsWith(Keywords.kw_var)) // Object literals on the top level of a file are treated as "enum-style". // Each key/value pair is put on a separate line, instead of bin-packing. return true; diff --git a/lib/Format/TokenAnnotator.h b/lib/Format/TokenAnnotator.h index a948cdb1c41..b8a6be057a6 100644 --- a/lib/Format/TokenAnnotator.h +++ b/lib/Format/TokenAnnotator.h @@ -59,7 +59,7 @@ public: I->Tok->Previous = Current; Current = Current->Next; Current->Children.clear(); - for (const auto& Child : Node.Children) { + for (const auto &Child : Node.Children) { Children.push_back(new AnnotatedLine(Child)); Current->Children.push_back(Children.back()); } @@ -80,6 +80,12 @@ public: } } + /// \c true if this line starts with the given tokens in order, ignoring + /// comments. + template <typename... Ts> bool startsWith(Ts... Tokens) const { + return startsWith(First, Tokens...); + } + FormatToken *First; FormatToken *Last; @@ -107,6 +113,18 @@ private: // Disallow copying. AnnotatedLine(const AnnotatedLine &) = delete; void operator=(const AnnotatedLine &) = delete; + + template <typename A, typename... Ts> + bool startsWith(FormatToken *Tok, A K1) const { + while (Tok && Tok->is(tok::comment)) + Tok = Tok->Next; + return Tok && Tok->is(K1); + } + + template <typename A, typename... Ts> + bool startsWith(FormatToken *Tok, A K1, Ts... Tokens) const { + return startsWith(Tok, K1) && startsWith(Tok->Next, Tokens...); + } }; /// \brief Determines extra information about the tokens comprising an diff --git a/lib/Format/UnwrappedLineFormatter.cpp b/lib/Format/UnwrappedLineFormatter.cpp index 191b78d061a..e902b06d539 100644 --- a/lib/Format/UnwrappedLineFormatter.cpp +++ b/lib/Format/UnwrappedLineFormatter.cpp @@ -21,7 +21,7 @@ namespace { bool startsExternCBlock(const AnnotatedLine &Line) { const FormatToken *Next = Line.First->getNextNonComment(); const FormatToken *NextNext = Next ? Next->getNextNonComment() : nullptr; - return Line.First->is(tok::kw_extern) && Next && Next->isStringLiteral() && + return Line.startsWith(tok::kw_extern) && Next && Next->isStringLiteral() && NextNext && NextNext->is(tok::l_brace); } @@ -74,7 +74,7 @@ public: unsigned LevelIndent = Line.First->OriginalColumn; if (static_cast<int>(LevelIndent) - Offset >= 0) LevelIndent -= Offset; - if ((Line.First->isNot(tok::comment) || IndentForLevel[Line.Level] == -1) && + if ((!Line.First->is(tok::comment) || IndentForLevel[Line.Level] == -1) && !Line.InPPDirective) IndentForLevel[Line.Level] = LevelIndent; } @@ -280,7 +280,7 @@ private: TT_LineComment)) return 0; // Only inline simple if's (no nested if or else). - if (I + 2 != E && Line.First->is(tok::kw_if) && + if (I + 2 != E && Line.startsWith(tok::kw_if) && I[2]->First->is(tok::kw_else)) return 0; return 1; @@ -334,12 +334,11 @@ private: return 0; if (Line.First->isOneOf(tok::kw_if, tok::kw_while, tok::kw_do, tok::kw_try, tok::kw___try, tok::kw_catch, tok::kw___finally, - tok::kw_for, tok::r_brace) || - Line.First->is(Keywords.kw___except)) { + tok::kw_for, tok::r_brace, Keywords.kw___except)) { if (!Style.AllowShortBlocksOnASingleLine) return 0; if (!Style.AllowShortIfStatementsOnASingleLine && - Line.First->is(tok::kw_if)) + Line.startsWith(tok::kw_if)) return 0; if (!Style.AllowShortLoopsOnASingleLine && Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for)) @@ -362,7 +361,7 @@ private: Tok->SpacesRequiredBefore = 0; Tok->CanBreakBefore = true; return 1; - } else if (Limit != 0 && Line.First->isNot(tok::kw_namespace) && + } else if (Limit != 0 && !Line.startsWith(tok::kw_namespace) && !startsExternCBlock(Line)) { // We don't merge short records. if (Line.First->isOneOf(tok::kw_class, tok::kw_union, tok::kw_struct, -- GitLab