]> granicus.if.org Git - clang/commitdiff
clang-format: Support function annotations in macros.
authorDaniel Jasper <djasper@google.com>
Mon, 18 May 2015 09:47:22 +0000 (09:47 +0000)
committerDaniel Jasper <djasper@google.com>
Mon, 18 May 2015 09:47:22 +0000 (09:47 +0000)
Before:
  DEPRECATED("Use NewClass::NewFunction instead.") string
      OldFunction(const string &parameter) {}

After:
  DEPRECATED("Use NewClass::NewFunction instead.")
  string OldFunction(const string &parameter) {}

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237562 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/ContinuationIndenter.cpp
lib/Format/FormatToken.h
lib/Format/TokenAnnotator.cpp
unittests/Format/FormatTest.cpp

index 3baebed56792304b9d38d84562799a7ed3a5467b..20626a622f84f63135a23896634af96af31d7197 100644 (file)
@@ -208,8 +208,13 @@ bool ContinuationIndenter::mustBreak(const LineState &State) {
     return true;
 
   if (Current.NestingLevel == 0 && !Current.isTrailingComment()) {
+    // Always break after "template <...>" and leading annotations. This is only
+    // for cases where the entire line does not fit on a single line as a
+    // different LineFormatter would be used otherwise.
     if (Previous.ClosesTemplateDeclaration)
       return true;
+    if (Previous.is(TT_FunctionAnnotation) && Previous.is(tok::r_paren))
+      return true;
     if (Previous.is(TT_LeadingJavaAnnotation) && Current.isNot(tok::l_paren) &&
         Current.isNot(TT_LeadingJavaAnnotation))
       return true;
@@ -487,7 +492,8 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
       !PreviousNonComment->isOneOf(tok::comma, tok::semi) &&
       (PreviousNonComment->isNot(TT_TemplateCloser) ||
        Current.NestingLevel != 0) &&
-      !PreviousNonComment->isOneOf(TT_BinaryOperator, TT_JavaAnnotation,
+      !PreviousNonComment->isOneOf(TT_BinaryOperator, TT_FunctionAnnotation,
+                                   TT_JavaAnnotation,
                                    TT_LeadingJavaAnnotation) &&
       Current.isNot(TT_BinaryOperator) && !PreviousNonComment->opensScope())
     State.Stack.back().BreakBeforeParameter = true;
@@ -568,7 +574,8 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) {
     return State.Stack.back().VariablePos;
   if ((PreviousNonComment &&
        (PreviousNonComment->ClosesTemplateDeclaration ||
-        PreviousNonComment->isOneOf(TT_AttributeParen, TT_JavaAnnotation,
+        PreviousNonComment->isOneOf(TT_AttributeParen, TT_FunctionAnnotation,
+                                    TT_JavaAnnotation,
                                     TT_LeadingJavaAnnotation))) ||
       (!Style.IndentWrappedFunctionNames &&
        NextNonComment->isOneOf(tok::kw_operator, TT_FunctionDeclarationName)))
index 0fc20de3c8d6f8c3b8d9828b693001462a95d1ef..c934398b1a92b32cdef5e19e3c8a0021bd370193 100644 (file)
@@ -42,6 +42,7 @@ enum TokenType {
   TT_DesignatedInitializerPeriod,
   TT_DictLiteral,
   TT_ForEachMacro,
+  TT_FunctionAnnotation,
   TT_FunctionDeclarationName,
   TT_FunctionLBrace,
   TT_FunctionTypeLParen,
index 94de217eb8efa4cf2be1cd74b10002520901bfe6..abd9be6d223b6687304402d003114322f47cb30e 100644 (file)
@@ -493,7 +493,8 @@ 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)))
+           !Tok->Previous->isOneOf(tok::kw_decltype, TT_LeadingJavaAnnotation,
+                                   TT_FunctionAnnotation)))
         Line.MightBeFunctionDecl = true;
       break;
     case tok::l_square:
@@ -915,9 +916,16 @@ 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 &&
+          !Current.Next->isOneOf(tok::semi, tok::colon))
+        Current.Type = TT_FunctionAnnotation;
     } else if (Current.is(tok::at) && Current.Next) {
       if (Current.Next->isStringLiteral()) {
         Current.Type = TT_ObjCStringLiteral;
@@ -968,6 +976,11 @@ 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;
     }
   }
 
index f7510c86189cfbd8f96d1a4dd6b15efd6beecff9..5e69e05d4a455fe1a2c4df73cb384377854dd831 100644 (file)
@@ -4040,6 +4040,14 @@ TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) {
       "    aaaaaaaaaaaaaaaaaaaaaaaaa;");
 }
 
+TEST_F(FormatTest, FunctionAnnotations) {
+  verifyFormat("DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
+               "string OldFunction(const string &parameter) {}");
+  verifyFormat("template <typename T>\n"
+               "DEPRECATED(\"Use NewClass::NewFunction instead.\")\n"
+               "string OldFunction(const string &parameter) {}");
+}
+
 TEST_F(FormatTest, BreaksDesireably) {
   verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
                "    aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"