From 6338229cf6ca4e8228ea2cdb23899cc1caa543fe Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Mon, 18 May 2015 13:47:23 +0000 Subject: [PATCH] clang-format: Improve detection of macros annotating functions. Before: ASSERT("aaaaaaaaaaaaaaa") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; After: ASSERT("aaaaaaaaaaaaaaa") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; Also cleanup implementation a bit and only mark closing parenthesis of these annotations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237567 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/ContinuationIndenter.cpp | 14 +++++++------- lib/Format/FormatToken.h | 2 +- lib/Format/TokenAnnotator.cpp | 22 +++++++++------------- unittests/Format/FormatTest.cpp | 4 ++++ 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 20626a622f..623e086992 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -213,7 +213,7 @@ bool ContinuationIndenter::mustBreak(const LineState &State) { // different LineFormatter would be used otherwise. if (Previous.ClosesTemplateDeclaration) return true; - if (Previous.is(TT_FunctionAnnotation) && Previous.is(tok::r_paren)) + if (Previous.is(TT_FunctionAnnotationRParen)) return true; if (Previous.is(TT_LeadingJavaAnnotation) && Current.isNot(tok::l_paren) && Current.isNot(TT_LeadingJavaAnnotation)) @@ -492,9 +492,9 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, !PreviousNonComment->isOneOf(tok::comma, tok::semi) && (PreviousNonComment->isNot(TT_TemplateCloser) || Current.NestingLevel != 0) && - !PreviousNonComment->isOneOf(TT_BinaryOperator, TT_FunctionAnnotation, - TT_JavaAnnotation, - TT_LeadingJavaAnnotation) && + !PreviousNonComment->isOneOf( + TT_BinaryOperator, TT_FunctionAnnotationRParen, TT_JavaAnnotation, + TT_LeadingJavaAnnotation) && Current.isNot(TT_BinaryOperator) && !PreviousNonComment->opensScope()) State.Stack.back().BreakBeforeParameter = true; @@ -574,9 +574,9 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) { return State.Stack.back().VariablePos; if ((PreviousNonComment && (PreviousNonComment->ClosesTemplateDeclaration || - PreviousNonComment->isOneOf(TT_AttributeParen, TT_FunctionAnnotation, - TT_JavaAnnotation, - TT_LeadingJavaAnnotation))) || + PreviousNonComment->isOneOf( + TT_AttributeParen, TT_FunctionAnnotationRParen, TT_JavaAnnotation, + TT_LeadingJavaAnnotation))) || (!Style.IndentWrappedFunctionNames && NextNonComment->isOneOf(tok::kw_operator, TT_FunctionDeclarationName))) return std::max(State.Stack.back().LastSpace, State.Stack.back().Indent); diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index c934398b1a..9325d0d52e 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -42,7 +42,7 @@ enum TokenType { TT_DesignatedInitializerPeriod, TT_DictLiteral, TT_ForEachMacro, - TT_FunctionAnnotation, + TT_FunctionAnnotationRParen, TT_FunctionDeclarationName, TT_FunctionLBrace, TT_FunctionTypeLParen, diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index abd9be6d22..f4b2f00655 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -493,8 +493,7 @@ private: if (Line.MustBeDeclaration && Contexts.size() == 1 && !Contexts.back().IsExpression && Line.First->isNot(TT_ObjCProperty) && (!Tok->Previous || - !Tok->Previous->isOneOf(tok::kw_decltype, TT_LeadingJavaAnnotation, - TT_FunctionAnnotation))) + !Tok->Previous->isOneOf(tok::kw_decltype, TT_LeadingJavaAnnotation))) Line.MightBeFunctionDecl = true; break; case tok::l_square: @@ -916,16 +915,18 @@ private: } else { Current.Type = TT_LineComment; } - } else if (Current.is(tok::l_paren) && Current.Previous && - Current.Previous->is(TT_FunctionAnnotation)) { - Current.Type = TT_FunctionAnnotation; } else if (Current.is(tok::r_paren)) { if (rParenEndsCast(Current)) Current.Type = TT_CastRParen; - if (Current.MatchingParen && - Current.MatchingParen->is(TT_FunctionAnnotation) && Current.Next && + if (Current.MatchingParen && Current.Next && + !Current.Next->isBinaryOperator() && !Current.Next->isOneOf(tok::semi, tok::colon)) - Current.Type = TT_FunctionAnnotation; + if (FormatToken *BeforeParen = Current.MatchingParen->Previous) + if (BeforeParen->is(tok::identifier) && + BeforeParen->TokenText == BeforeParen->TokenText.upper() && + (!BeforeParen->Previous || + BeforeParen->Previous->ClosesTemplateDeclaration)) + Current.Type = TT_FunctionAnnotationRParen; } else if (Current.is(tok::at) && Current.Next) { if (Current.Next->isStringLiteral()) { Current.Type = TT_ObjCStringLiteral; @@ -976,11 +977,6 @@ private: TT_LeadingJavaAnnotation)) { Current.Type = Current.Previous->Type; } - } else if (Current.is(tok::identifier) && - Current.TokenText == Current.TokenText.upper() && - (!Current.Previous || - Current.Previous->ClosesTemplateDeclaration)) { - Current.Type = TT_FunctionAnnotation; } } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index f41928fe72..00c23b5bcc 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -4046,6 +4046,10 @@ TEST_F(FormatTest, FunctionAnnotations) { verifyFormat("template \n" "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n" "string OldFunction(const string ¶meter) {}"); + + // Not function annotations. + verifyFormat("ASSERT(\"aaaaa\") << aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " << bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); } TEST_F(FormatTest, BreaksDesireably) { -- 2.40.0