From 8eb371b3ccfaf219adad95671392b03bf5d30c73 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Fri, 1 Mar 2013 17:13:29 +0000 Subject: [PATCH] Correctly format arrays of pointers and function types. Before: void f(Type(*parameter)[10]) {} int(*func)(void *); After: void f(Type (*parameter)[10]) {} int (*func)(void *); llvm-svn: 176356 --- clang/lib/Format/TokenAnnotator.cpp | 8 ++++++++ clang/unittests/Format/FormatTest.cpp | 12 ++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 125619c..f642a70 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -645,6 +645,9 @@ private: if (NextToken == NULL) return TT_Unknown; + if (PrevToken->is(tok::l_paren) && !IsExpression) + return TT_PointerOrReference; + if (PrevToken->is(tok::l_paren) || PrevToken->is(tok::l_square) || PrevToken->is(tok::l_brace) || PrevToken->is(tok::comma) || PrevToken->is(tok::kw_return) || PrevToken->is(tok::colon) || @@ -1041,6 +1044,11 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, if (Tok.is(tok::colon)) return Line.First.isNot(tok::kw_case) && !Tok.Children.empty() && Tok.Type != TT_ObjCMethodExpr; + if (Tok.is(tok::l_paren) && !Tok.Children.empty() && + Tok.Children[0].Type == TT_PointerOrReference && + !Tok.Children[0].Children.empty() && + Tok.Children[0].Children[0].isNot(tok::r_paren)) + return true; if (Tok.Parent->Type == TT_UnaryOperator || Tok.Parent->Type == TT_CastRParen) return false; if (Tok.Type == TT_UnaryOperator) diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 9b640cb..64de86a 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1812,7 +1812,7 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyFormat("int main(int argc, char **argv) {}"); verifyFormat("Test::Test(int b) : a(b * b) {}"); verifyIndependentOfContext("f(a, *a);"); - verifyIndependentOfContext("f(*a);"); + verifyFormat("void g() { f(*a); }"); verifyIndependentOfContext("int a = b * 10;"); verifyIndependentOfContext("int a = 10 * b;"); verifyIndependentOfContext("int a = b * c;"); @@ -1845,6 +1845,7 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyIndependentOfContext("return sizeof(int **);"); verifyIndependentOfContext("return sizeof(int ******);"); verifyIndependentOfContext("return (int **&)a;"); + verifyFormat("void f(Type (*parameter)[10]) {}"); verifyGoogleFormat("return sizeof(int**);"); verifyIndependentOfContext("Type **A = static_cast(P);"); verifyGoogleFormat("Type** A = static_cast(P);"); @@ -1884,7 +1885,7 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyIndependentOfContext("a = &(x + y);"); verifyIndependentOfContext("*(x + y).call();"); verifyIndependentOfContext("&(x + y)->call();"); - verifyIndependentOfContext("&(*I).first"); + verifyFormat("void f() { &(*I).first; }"); verifyIndependentOfContext("f(b * /* confusing comment */ ++c);"); verifyFormat( @@ -1909,7 +1910,9 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyIndependentOfContext("A = new SomeType *[Length]();"); verifyGoogleFormat("A = new SomeType* [Length]();"); +} +TEST_F(FormatTest, AdaptivelyFormatsPointersAndReferences) { EXPECT_EQ("int *a;\n" "int *a;\n" "int *a;", @@ -1977,12 +1980,13 @@ TEST_F(FormatTest, FormatsCasts) { } TEST_F(FormatTest, FormatsFunctionTypes) { - // FIXME: Determine the cases that need a space after the return type and fix. verifyFormat("A a;"); verifyFormat("A a;"); verifyFormat("A a;"); - verifyFormat("int(*func)(void *);"); + // FIXME: Inconsistent. + verifyFormat("int (*func)(void *);"); + verifyFormat("void f() { int(*func)(void *); }"); } TEST_F(FormatTest, BreaksLongDeclarations) { -- 2.7.4