]> granicus.if.org Git - clang/commitdiff
Fix formatting of long declarations with const type.
authorDaniel Jasper <djasper@google.com>
Tue, 2 Jul 2013 09:47:29 +0000 (09:47 +0000)
committerDaniel Jasper <djasper@google.com>
Tue, 2 Jul 2013 09:47:29 +0000 (09:47 +0000)
Before (exceeding the column limit):
LoooooooooooooooooooooooooooooooooooooooongType const LoooooooooooooooooooooooooooooooooooooooongVariable;

After:
LoooooooooooooooooooooooooooooooooooooooongType const
LoooooooooooooooooooooooooooooooooooooooongVariable;

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

lib/Format/TokenAnnotator.cpp
unittests/Format/FormatTest.cpp

index f7cea124a812b23c34a7dce6f44b93fe88e88e26..04f1c7f8a39e0fb29c82ee36dd9594635305b594 100644 (file)
@@ -585,13 +585,7 @@ private:
     }
 
     if (Current.Type == TT_Unknown) {
-      if (Current.Previous && Current.is(tok::identifier) &&
-          ((Current.Previous->is(tok::identifier) &&
-            Current.Previous->Tok.getIdentifierInfo()->getPPKeywordID() ==
-                tok::pp_not_keyword) ||
-           isSimpleTypeSpecifier(*Current.Previous) ||
-           Current.Previous->Type == TT_PointerOrReference ||
-           Current.Previous->Type == TT_TemplateCloser)) {
+      if (isStartOfName(Current)) {
         Contexts.back().FirstStartOfName = &Current;
         Current.Type = TT_StartOfName;
         NameFound = true;
@@ -666,6 +660,33 @@ private:
     }
   }
 
+  /// \brief Take a guess at whether \p Tok starts a name of a function or
+  /// variable declaration.
+  ///
+  /// This is a heuristic based on whether \p Tok is an identifier following
+  /// something that is likely a type.
+  bool isStartOfName(const FormatToken &Tok) {
+    if (Tok.isNot(tok::identifier) || Tok.Previous == NULL)
+      return false;
+
+    // Skip "const" as it does not have an influence on whether this is a name.
+    FormatToken *PreviousNotConst = Tok.Previous;
+    while (PreviousNotConst != NULL && PreviousNotConst->is(tok::kw_const))
+      PreviousNotConst = PreviousNotConst->Previous;
+
+    if (PreviousNotConst == NULL)
+      return false;
+
+    bool IsPPKeyword =
+        PreviousNotConst->is(tok::identifier) && PreviousNotConst->Previous &&
+        PreviousNotConst->Previous->is(tok::hash);
+
+    return (!IsPPKeyword && PreviousNotConst->is(tok::identifier)) ||
+           PreviousNotConst->Type == TT_PointerOrReference ||
+           PreviousNotConst->Type == TT_TemplateCloser ||
+           isSimpleTypeSpecifier(*PreviousNotConst);
+  }
+
   /// \brief Return the type of the given token assuming it is * or &.
   TokenType determineStarAmpUsage(const FormatToken &Tok, bool IsExpression) {
     const FormatToken *PrevToken = Tok.getPreviousNoneComment();
index 6df7e9b0e935df1b131924e35e5d8d1a58e5aaf1..c5a02b614d349d93d0f8a4de2a02b1bf0a45e42c 100644 (file)
@@ -3451,11 +3451,16 @@ TEST_F(FormatTest, BreaksLongDeclarations) {
   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType\n"
                "    LoooooooooooooooooooooooooooooooooooooooongVariable;",
                getGoogleStyle());
+  verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType const\n"
+               "    LoooooooooooooooooooooooooooooooooooooooongVariable;",
+               getGoogleStyle());
   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
                "    LoooooooooooooooooooooooooooooooongFunctionDeclaration();",
                getGoogleStyle());
   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n"
                "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
+  verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n"
+               "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}");
 
   // FIXME: Without the comment, this breaks after "(".
   verifyFormat("LoooooooooooooooooooooooooooooooooooooooongType  // break\n"