aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2013-02-06 06:20:11 +0000
committerNico Weber <nicolasweber@gmx.de>2013-02-06 06:20:11 +0000
commite8a97985f72b4e11435ff2107c0f11e925fb6d96 (patch)
tree4f3ebff0126960f8c599a1b7d755268c332fdae9
parentce6a10eaadd152f05103dfffe22ac20ef2c04615 (diff)
Formatter: No space after & and * in front of ObjC message expressions.
1. let determineStarAmp() check of unary operators before checking for "is next '['". That check was added in r173150, and the test from that revision passes either way. 2. change determineStarAmp() to categorize '*' and '&' after '=' as unary operator. 3. don't let parseSquare() overwrite the type of a '*' or '&' before the start of an objc message expression if has the role of unary operator. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174489 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Format/TokenAnnotator.cpp16
-rw-r--r--unittests/Format/FormatTest.cpp5
2 files changed, 12 insertions, 9 deletions
diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp
index a90134115f..e1f6de3903 100644
--- a/lib/Format/TokenAnnotator.cpp
+++ b/lib/Format/TokenAnnotator.cpp
@@ -224,15 +224,19 @@ public:
if (CurrentToken->is(tok::r_square)) {
if (!CurrentToken->Children.empty() &&
CurrentToken->Children[0].is(tok::l_paren)) {
- // An ObjC method call can't be followed by an open parenthesis.
+ // An ObjC method call is rarely followed by an open parenthesis.
// FIXME: Do we incorrectly label ":" with this?
StartsObjCMethodExpr = false;
Left->Type = TT_Unknown;
}
if (StartsObjCMethodExpr) {
objCSelector.markEnd(*CurrentToken);
+ // determineStarAmpUsage() thinks that '*' '[' is allocating an
+ // array of pointers, but if '[' starts a selector then '*' is a
+ // binary operator.
if (Left->Parent != NULL &&
- (Left->Parent->is(tok::star) || Left->Parent->is(tok::amp)))
+ (Left->Parent->is(tok::star) || Left->Parent->is(tok::amp)) &&
+ Left->Parent->Type == TT_PointerOrReference)
Left->Parent->Type = TT_BinaryOperator;
}
Left->MatchingParen = CurrentToken;
@@ -607,16 +611,16 @@ private:
if (NextToken == NULL)
return TT_Unknown;
- if (NextToken->is(tok::l_square))
- 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) ||
- PrevToken->Type == TT_BinaryOperator ||
+ PrevToken->is(tok::equal) || PrevToken->Type == TT_BinaryOperator ||
PrevToken->Type == TT_UnaryOperator || PrevToken->Type == TT_CastRParen)
return TT_UnaryOperator;
+ if (NextToken->is(tok::l_square))
+ return TT_PointerOrReference;
+
if (PrevToken->FormatTok.Tok.isLiteral() || PrevToken->is(tok::r_paren) ||
PrevToken->is(tok::r_square) || NextToken->FormatTok.Tok.isLiteral() ||
isUnaryOperator(*NextToken) || NextToken->is(tok::l_paren) ||
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index fc52e834aa..fbe5f30f70 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -2245,9 +2245,8 @@ TEST_F(FormatTest, FormatObjCMethodExpr) {
verifyFormat("int a = --[foo bar:baz];");
verifyFormat("int a = sizeof [foo bar:baz];");
verifyFormat("int a = alignof [foo bar:baz];");
- // FIXME: no space after & and *.
- verifyFormat("int a = & [foo bar:baz];");
- verifyFormat("int a = * [foo bar:baz];");
+ verifyFormat("int a = &[foo bar:baz];");
+ verifyFormat("int a = *[foo bar:baz];");
// FIXME: Make casts work, without breaking f()[4].
//verifyFormat("int a = (int) [foo bar:baz];");