From 9a64fb5690ba2b53c761def068e20ec64c584d96 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Wed, 2 Jan 2013 15:08:56 +0000 Subject: [PATCH] Prefer splitting after "template <...>" and fix indentation. This addresses llvm.org/PR14699 Before: template void looooooooooooooooooooooongFunction(int Param1, int Param2); template void looooooooooooooooooooongFunction( int Paaaaaaaaaaaaaaaaaaaaram1, int Paaaaaaaaaaaaaaaaaaaaram2); After: template void looooooooooooooooooooooongFunction(int Param1, int Param2); template 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 | 23 ++++++++++++++++++- test/Index/comment-to-html-xml-conversion.cpp | 2 +- unittests/Format/FormatTest.cpp | 13 +++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 8f77c77a8e..d354078231 100644 --- a/lib/Format/Format.cpp +++ b/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/test/Index/comment-to-html-xml-conversion.cpp b/test/Index/comment-to-html-xml-conversion.cpp index cf620a7a2a..0af0dd746d 100644 --- a/test/Index/comment-to-html-xml-conversion.cpp +++ b/test/Index/comment-to-html-xml-conversion.cpp @@ -670,7 +670,7 @@ void comment_to_xml_conversion_10(int aaa, int bbb); template class comment_to_xml_conversion_11 { }; -// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:7: ClassTemplate=comment_to_xml_conversion_11:{{.*}} FullCommentAsXML=[comment_to_xml_conversion_11c:@CT>2#T#T@comment_to_xml_conversion_11template <typename T = int, typename U = int>\n class comment_to_xml_conversion_11 {\n}\ntemplate <typename T, typename U> class comment_to_xml_conversion_11 {\n} Aaa.] +// CHECK: comment-to-html-xml-conversion.cpp:[[@LINE-2]]:7: ClassTemplate=comment_to_xml_conversion_11:{{.*}} FullCommentAsXML=[comment_to_xml_conversion_11c:@CT>2#T#T@comment_to_xml_conversion_11template <typename T = int, typename U = int>\nclass comment_to_xml_conversion_11 {\n}\ntemplate <typename T, typename U> class comment_to_xml_conversion_11 {\n} Aaa.] /// Aaa. template diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index bf35ce1cd8..58712ef38f 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -594,6 +594,19 @@ TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { "}"); } +TEST_F(FormatTest, WrapsTemplateDeclarations) { + verifyFormat("template \n" + "virtual void loooooooooooongFunction(int Param1, int Param2);"); + verifyFormat( + "template void f(int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram1,\n" + " int Paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaram2);"); + verifyFormat( + "template \n" + "void looooooooooooooooooooongFunction(int Paaaaaaaaaaaaaaaaaaaaram1,\n" + " int Paaaaaaaaaaaaaaaaaaaaram2);"); + +} + TEST_F(FormatTest, UnderstandsTemplateParameters) { verifyFormat("A a;"); verifyFormat("A > > a;"); -- 2.40.0