From a5eec9bb0084be8b1faaaba458c2d71741366ff6 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Tue, 28 Jan 2014 20:13:43 +0000 Subject: [PATCH] clang-format: Understand __attribute__s preceding parameter lists. Before: ReturnType __attribute__((unused)) function(int i); After: ReturnType __attribute__((unused)) function(int i); This fixes llvm.org/PR18632. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200337 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/ContinuationIndenter.cpp | 3 ++- lib/Format/FormatToken.h | 1 + lib/Format/TokenAnnotator.cpp | 25 +++++++++++++------------ unittests/Format/FormatTest.cpp | 2 ++ 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 30c066fede..6db3ca9824 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -384,7 +384,8 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, } else if (Previous.is(tok::comma) && State.Stack.back().VariablePos != 0) { State.Column = State.Stack.back().VariablePos; } else if ((PreviousNonComment && - PreviousNonComment->ClosesTemplateDeclaration) || + (PreviousNonComment->ClosesTemplateDeclaration || + PreviousNonComment->Type == TT_AttributeParen)) || ((Current.Type == TT_StartOfName || Current.is(tok::kw_operator)) && State.ParenLevel == 0 && diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index 29fafb8250..a4947dd805 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -27,6 +27,7 @@ namespace format { enum TokenType { TT_ArrayInitializerLSquare, TT_ArraySubscriptLSquare, + TT_AttributeParen, TT_BinaryOperator, TT_BitFieldColon, TT_BlockComment, diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index e0f3e57cd7..6e82b19148 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -109,6 +109,8 @@ private: } else if (AfterCaret) { // This is the parameter list of an ObjC block. Contexts.back().IsExpression = false; + } else if (Left->Previous && Left->Previous->is(tok::kw___attribute)) { + Left->Type = TT_AttributeParen; } if (StartsObjCMethodExpr) { @@ -159,6 +161,9 @@ private: } } + if (Left->Type == TT_AttributeParen) + CurrentToken->Type = TT_AttributeParen; + if (!HasMultipleLines) Left->PackingKind = PPK_Inconclusive; else if (HasMultipleParametersOnALine) @@ -1332,9 +1337,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, if (Left.is(tok::colon)) return Left.Type != TT_ObjCMethodExpr; if (Right.is(tok::l_paren)) { - if (Left.is(tok::r_paren) && Left.MatchingParen && - Left.MatchingParen->Previous && - Left.MatchingParen->Previous->is(tok::kw___attribute)) + if (Left.is(tok::r_paren) && Left.Type == TT_AttributeParen) return true; return Line.Type == LT_ObjCDecl || Left.isOneOf(tok::kw_return, tok::kw_new, tok::kw_delete, @@ -1519,14 +1522,12 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, return false; if (Left.is(tok::equal) && Line.Type == LT_VirtualFunctionDecl) return false; - if (Left.Previous) { - if (Left.is(tok::l_paren) && Right.is(tok::l_paren) && - Left.Previous->is(tok::kw___attribute)) - return false; - if (Left.is(tok::l_paren) && (Left.Previous->Type == TT_BinaryOperator || - Left.Previous->Type == TT_CastRParen)) - return false; - } + if (Left.is(tok::l_paren) && Left.Type == TT_AttributeParen) + return false; + if (Left.is(tok::l_paren) && Left.Previous && + (Left.Previous->Type == TT_BinaryOperator || + Left.Previous->Type == TT_CastRParen)) + return false; if (Right.Type == TT_ImplicitStringLiteral) return false; @@ -1570,7 +1571,7 @@ bool TokenAnnotator::canBreakBefore(const AnnotatedLine &Line, Right.isOneOf(tok::lessless, tok::arrow, tok::period, tok::colon, tok::l_square, tok::at) || (Left.is(tok::r_paren) && - Right.isOneOf(tok::identifier, tok::kw_const, tok::kw___attribute)) || + Right.isOneOf(tok::identifier, tok::kw_const)) || (Left.is(tok::l_paren) && !Right.is(tok::r_paren)); } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 1a19754575..efc563b4f2 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -4394,6 +4394,8 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { TEST_F(FormatTest, UnderstandsAttributes) { verifyFormat("SomeType s __attribute__((unused)) (InitValue);"); + verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa __attribute__((unused))\n" + "aaaaaaaaaaaaaaaaaaaaaaa(int i);"); } TEST_F(FormatTest, UnderstandsEllipsis) { -- 2.40.0