diff options
author | Daniel Jasper <djasper@google.com> | 2013-05-28 08:33:00 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2013-05-28 08:33:00 +0000 |
commit | 3719428c066cbb1e83d08c03431971af110bc1ee (patch) | |
tree | 7dfcad86e4c895702cf2c103724022005ae1a743 | |
parent | f3e663af3961dfbe0c647474aa92e8fb957fb2ac (diff) | |
download | bcm5719-llvm-3719428c066cbb1e83d08c03431971af110bc1ee.tar.gz bcm5719-llvm-3719428c066cbb1e83d08c03431971af110bc1ee.zip |
Clean up formatting of function types.
Before:
int (*func)(void*);
void f() { int(*func)(void*); }
After (consistent space after "int"):
int (*func)(void*);
void f() { int (*func)(void*); }
llvm-svn: 182756
-rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Format/TokenAnnotator.h | 9 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 11 |
3 files changed, 16 insertions, 18 deletions
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 0a89e9c6bc2..2cc4a9471e1 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -141,6 +141,7 @@ private: Left->Type = TT_ObjCMethodExpr; } + bool MightBeFunctionType = CurrentToken->is(tok::star); while (CurrentToken != NULL) { // LookForDecls is set when "if (" has been seen. Check for // 'identifier' '*' 'identifier' followed by not '=' -- this @@ -158,9 +159,9 @@ private: } if (CurrentToken->is(tok::r_paren)) { - if (CurrentToken->Children.empty() || - !CurrentToken->Children[0].isOneOf(tok::l_paren, tok::l_square)) - Left->DefinesFunctionType = false; + if (MightBeFunctionType && !CurrentToken->Children.empty() && + CurrentToken->Children[0].isOneOf(tok::l_paren, tok::l_square)) + Left->Type = TT_FunctionTypeLParen; Left->MatchingParen = CurrentToken; CurrentToken->MatchingParen = Left; @@ -179,7 +180,7 @@ private: return false; if (CurrentToken->Parent->Type == TT_PointerOrReference && CurrentToken->Parent->Parent->isOneOf(tok::l_paren, tok::coloncolon)) - Left->DefinesFunctionType = true; + MightBeFunctionType = true; updateParameterCount(Left, CurrentToken); if (!consumeToken()) return false; @@ -699,7 +700,8 @@ private: if (NextToken == NULL) return TT_Unknown; - if (PrevToken->is(tok::l_paren) && !IsExpression) + if (PrevToken->is(tok::coloncolon) || + (PrevToken->is(tok::l_paren) && !IsExpression)) return TT_PointerOrReference; if (PrevToken->isOneOf(tok::l_paren, tok::l_square, tok::l_brace, @@ -1068,7 +1070,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, return Left.FormatTok.Tok.isLiteral() || ((Left.Type != TT_PointerOrReference) && Left.isNot(tok::l_paren) && !Style.PointerBindsToType); - if (Right.DefinesFunctionType && + if (Right.Type == TT_FunctionTypeLParen && (Left.Type != TT_PointerOrReference || Style.PointerBindsToType)) return true; if (Left.Type == TT_PointerOrReference) diff --git a/clang/lib/Format/TokenAnnotator.h b/clang/lib/Format/TokenAnnotator.h index e0d6d047e12..81d660d9470 100644 --- a/clang/lib/Format/TokenAnnotator.h +++ b/clang/lib/Format/TokenAnnotator.h @@ -36,6 +36,7 @@ enum TokenType { TT_ImplicitStringLiteral, TT_InlineASMColon, TT_InheritanceColon, + TT_FunctionTypeLParen, TT_LineComment, TT_ObjCArrayLiteral, TT_ObjCBlockLParen, @@ -78,9 +79,8 @@ public: ClosesTemplateDeclaration(false), MatchingParen(NULL), ParameterCount(0), TotalLength(FormatTok.TokenLength), UnbreakableTailLength(0), BindingStrength(0), SplitPenalty(0), - LongestObjCSelectorName(0), DefinesFunctionType(false), Parent(NULL), - FakeRParens(0), LastInChainOfCalls(false), - PartOfMultiVariableDeclStmt(false) {} + LongestObjCSelectorName(0), Parent(NULL), FakeRParens(0), + LastInChainOfCalls(false), PartOfMultiVariableDeclStmt(false) {} bool is(tok::TokenKind Kind) const { return FormatTok.Tok.is(Kind); } @@ -171,9 +171,6 @@ public: /// definition or call, this contains the length of the longest name. unsigned LongestObjCSelectorName; - /// \brief \c true if this is a "(" that starts a function type definition. - bool DefinesFunctionType; - std::vector<AnnotatedToken> Children; AnnotatedToken *Parent; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d39a8a40934..beebeee5082 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -2820,6 +2820,7 @@ TEST_F(FormatTest, UnderstandsBinaryOperators) { TEST_F(FormatTest, UnderstandsPointersToMembers) { verifyFormat("int A::*x;"); verifyFormat("int (S::*func)(void *);"); + verifyFormat("void f() { int (S::*func)(void *); }"); verifyFormat("typedef bool *(Class::*Member)() const;"); verifyFormat("void f() {\n" " (a->*f)();\n" @@ -3124,13 +3125,11 @@ TEST_F(FormatTest, FormatsCasts) { TEST_F(FormatTest, FormatsFunctionTypes) { verifyFormat("A<bool()> a;"); verifyFormat("A<SomeType()> a;"); - verifyFormat("A<void(*)(int, std::string)> a;"); + verifyFormat("A<void (*)(int, std::string)> a;"); verifyFormat("A<void *(int)>;"); verifyFormat("void *(*a)(int *, SomeType *);"); - - // FIXME: Inconsistent. verifyFormat("int (*func)(void *);"); - verifyFormat("void f() { int(*func)(void *); }"); + verifyFormat("void f() { int (*func)(void *); }"); verifyGoogleFormat("A<void*(int*, SomeType*)>;"); verifyGoogleFormat("void* (*a)(int);"); @@ -3691,8 +3690,8 @@ TEST_F(FormatTest, FormatForObjectiveCMethodDecls) { // protocol lists (but not for template classes): //verifyFormat("- (void)setDelegate:(id <Protocol>)delegate;"); - verifyFormat("- (int(*)())foo:(int(*)())f;"); - verifyGoogleFormat("- (int(*)())foo:(int(*)())foo;"); + verifyFormat("- (int (*)())foo:(int (*)())f;"); + verifyGoogleFormat("- (int (*)())foo:(int (*)())foo;"); // If there's no return type (very rare in practice!), LLVM and Google style // agree. |