]> granicus.if.org Git - clang/commitdiff
Prefer splitting after "template <...>" and fix indentation.
authorDaniel Jasper <djasper@google.com>
Wed, 2 Jan 2013 15:08:56 +0000 (15:08 +0000)
committerDaniel Jasper <djasper@google.com>
Wed, 2 Jan 2013 15:08:56 +0000 (15:08 +0000)
This addresses llvm.org/PR14699

Before:
template <typename T>
    void looooooooooooooooooooooongFunction(int Param1, int Param2);
template <typename T> void looooooooooooooooooooongFunction(
    int Paaaaaaaaaaaaaaaaaaaaram1, int Paaaaaaaaaaaaaaaaaaaaram2);

After:
template <typename T>
void looooooooooooooooooooooongFunction(int Param1, int Param2);
template <typename T>
void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,
                                      int Paaaaaaaaaaaaaaaaaaaaram2);

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

lib/Format/Format.cpp
test/Index/comment-to-html-xml-conversion.cpp
unittests/Format/FormatTest.cpp

index 8f77c77a8ecbad5e3ecc1d9de8b9265c3f05b780..d354078231cb936ed183eadfaa96dd547c6ed10d 100644 (file)
@@ -50,6 +50,8 @@ struct TokenAnnotation {
   bool SpaceRequiredBefore;
   bool CanBreakBefore;
   bool MustBreakBefore;
+
+  bool ClosesTemplateDeclaration;
 };
 
 static prec::Level getPrecedence(const FormatToken &Tok) {
@@ -250,6 +252,8 @@ private:
       } else if (
           Line.Tokens[0].Tok.is(tok::kw_for) && Previous.Tok.is(tok::comma)) {
         State.Column = State.ForLoopVariablePos;
+      } else if (Annotations[Index - 1].ClosesTemplateDeclaration) {
+        State.Column = State.Indent[ParenLevel] - 4;
       } else {
         State.Column = State.Indent[ParenLevel];
       }
@@ -342,7 +346,8 @@ private:
         (Left.Tok.isNot(tok::comma) && Left.Tok.isNot(tok::semi)))
       return 20;
 
-    if (Left.Tok.is(tok::semi) || Left.Tok.is(tok::comma))
+    if (Left.Tok.is(tok::semi) || Left.Tok.is(tok::comma) ||
+        Annotations[Index].ClosesTemplateDeclaration)
       return 0;
     if (Left.Tok.is(tok::l_paren))
       return 20;
@@ -549,6 +554,19 @@ public:
       return false;
     }
 
+    bool parseTemplateDeclaration() {
+      if (Index < Tokens.size() && Tokens[Index].Tok.is(tok::less)) {
+        Annotations[Index].Type = TokenAnnotation::TT_TemplateOpener;
+        next();
+        if (!parseAngle())
+          return false;
+        Annotations[Index - 1].ClosesTemplateDeclaration = true;
+        parseLine();
+        return true;
+      }
+      return false;
+    }
+
     void consumeToken() {
       unsigned CurrentIndex = Index;
       next();
@@ -592,6 +610,9 @@ public:
       case tok::question:
         parseConditional();
         break;
+      case tok::kw_template:
+        parseTemplateDeclaration();
+        break;
       default:
         break;
       }
index cf620a7a2a4b466772975783647fe813dcebc9d5..0af0dd746d01d81bb0bbcd09c60ea4f9461044f9 100644 (file)
@@ -670,7 +670,7 @@ void comment_to_xml_conversion_10(int aaa, int bbb);
 template<typename T, typename U>
 class comment_to_xml_conversion_11 { };
 
-// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:7: ClassTemplate=comment_to_xml_conversion_11:{{.*}} FullCommentAsXML=[<Class templateKind="template" file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="7"><Name>comment_to_xml_conversion_11</Name><USR>c:@CT&gt;2#T#T@comment_to_xml_conversion_11</USR><Declaration>template &lt;typename T = int, typename U = int&gt;\n    class comment_to_xml_conversion_11 {\n}\ntemplate &lt;typename T, typename U&gt; class comment_to_xml_conversion_11 {\n}</Declaration><Abstract><Para> Aaa.</Para></Abstract></Class>]
+// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:7: ClassTemplate=comment_to_xml_conversion_11:{{.*}} FullCommentAsXML=[<Class templateKind="template" file="{{[^"]+}}comment-to-html-xml-conversion.cpp" line="[[@LINE-2]]" column="7"><Name>comment_to_xml_conversion_11</Name><USR>c:@CT&gt;2#T#T@comment_to_xml_conversion_11</USR><Declaration>template &lt;typename T = int, typename U = int&gt;\nclass comment_to_xml_conversion_11 {\n}\ntemplate &lt;typename T, typename U&gt; class comment_to_xml_conversion_11 {\n}</Declaration><Abstract><Para> Aaa.</Para></Abstract></Class>]
 
 /// Aaa.
 template<typename T>
index bf35ce1cd816f8221eb9993cb69cba32f312d68f..58712ef38fbd4358b9ff77240204fa2a251e59b5 100644 (file)
@@ -594,6 +594,19 @@ TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) {
                "}");
 }
 
+TEST_F(FormatTest, WrapsTemplateDeclarations) {
+  verifyFormat("template <typename T>\n"
+               "virtual void loooooooooooongFunction(int Param1, int Param2);");
+  verifyFormat(
+      "template <typename T> void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n"
+      "                             int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);");
+  verifyFormat(
+      "template <typename T>\n"
+      "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n"
+      "                                      int Paaaaaaaaaaaaaaaaaaaaram2);");
+
+}
+
 TEST_F(FormatTest, UnderstandsTemplateParameters) {
   verifyFormat("A<int> a;");
   verifyFormat("A<A<A<int> > > a;");