aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-01-02 15:08:56 +0000
committerDaniel Jasper <djasper@google.com>2013-01-02 15:08:56 +0000
commitac5c1c286cbc0b00b977544dc69ddde299f8db0e (patch)
treef4018c2d23c0888808429a0a9d2a84d56658c9c5
parent3d0c75cc967eca76839f11c1857a9d20bf6f7750 (diff)
downloadllvm-ac5c1c286cbc0b00b977544dc69ddde299f8db0e.zip
llvm-ac5c1c286cbc0b00b977544dc69ddde299f8db0e.tar.gz
llvm-ac5c1c286cbc0b00b977544dc69ddde299f8db0e.tar.bz2
Prefer splitting after "template <...>" and fix indentation.
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); llvm-svn: 171388
-rw-r--r--clang/lib/Format/Format.cpp23
-rw-r--r--clang/test/Index/comment-to-html-xml-conversion.cpp2
-rw-r--r--clang/unittests/Format/FormatTest.cpp13
3 files changed, 36 insertions, 2 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 8f77c77..d354078 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -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;
}
diff --git a/clang/test/Index/comment-to-html-xml-conversion.cpp b/clang/test/Index/comment-to-html-xml-conversion.cpp
index cf620a7..0af0dd7 100644
--- a/clang/test/Index/comment-to-html-xml-conversion.cpp
+++ b/clang/test/Index/comment-to-html-xml-conversion.cpp
@@ -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>
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index bf35ce1c..58712ef 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -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;");