summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2013-05-28 08:33:00 +0000
committerDaniel Jasper <djasper@google.com>2013-05-28 08:33:00 +0000
commit3719428c066cbb1e83d08c03431971af110bc1ee (patch)
tree7dfcad86e4c895702cf2c103724022005ae1a743
parentf3e663af3961dfbe0c647474aa92e8fb957fb2ac (diff)
downloadbcm5719-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.cpp14
-rw-r--r--clang/lib/Format/TokenAnnotator.h9
-rw-r--r--clang/unittests/Format/FormatTest.cpp11
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.
OpenPOWER on IntegriCloud