diff options
-rw-r--r-- | lib/Format/TokenAnnotator.cpp | 25 | ||||
-rw-r--r-- | unittests/Format/FormatTest.cpp | 6 |
2 files changed, 20 insertions, 11 deletions
diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 12e7eac80e..9c7834f564 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -42,12 +42,15 @@ static bool isBinaryOperator(const AnnotatedToken &Tok) { } // Returns the previous token ignoring comments. -static const AnnotatedToken *getPreviousToken(const AnnotatedToken &Tok) { - const AnnotatedToken *PrevToken = Tok.Parent; +static AnnotatedToken *getPreviousToken(AnnotatedToken &Tok) { + AnnotatedToken *PrevToken = Tok.Parent; while (PrevToken != NULL && PrevToken->is(tok::comment)) PrevToken = PrevToken->Parent; return PrevToken; } +static const AnnotatedToken *getPreviousToken(const AnnotatedToken &Tok) { + return getPreviousToken(const_cast<AnnotatedToken &>(Tok)); +} // Returns the next token ignoring comments. static const AnnotatedToken *getNextToken(const AnnotatedToken &Tok) { @@ -181,12 +184,12 @@ public: // ')' or ']'), or it could be the start of an Objective-C method // expression. AnnotatedToken *Left = CurrentToken->Parent; + AnnotatedToken *Parent = getPreviousToken(*Left); bool StartsObjCMethodExpr = - !Left->Parent || Left->Parent->is(tok::colon) || - Left->Parent->is(tok::l_square) || Left->Parent->is(tok::l_paren) || - Left->Parent->is(tok::kw_return) || Left->Parent->is(tok::kw_throw) || - isUnaryOperator(*Left->Parent) || - getBinOpPrecedence(Left->Parent->FormatTok.Tok.getKind(), true, true) > + !Parent || Parent->is(tok::colon) || Parent->is(tok::l_square) || + Parent->is(tok::l_paren) || Parent->is(tok::kw_return) || + Parent->is(tok::kw_throw) || isUnaryOperator(*Parent) || + getBinOpPrecedence(Parent->FormatTok.Tok.getKind(), true, true) > prec::Unknown; if (StartsObjCMethodExpr) { @@ -208,10 +211,10 @@ public: // 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->Type == TT_PointerOrReference) - Left->Parent->Type = TT_BinaryOperator; + if (Parent != NULL && + (Parent->is(tok::star) || Parent->is(tok::amp)) && + Parent->Type == TT_PointerOrReference) + Parent->Type = TT_BinaryOperator; } Left->MatchingParen = CurrentToken; CurrentToken->MatchingParen = Left; diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index d2a1bef35b..7e88c4e34a 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -2422,6 +2422,12 @@ TEST_F(FormatTest, FormatObjCMethodExpr) { " fraction:1.0\n" " respectFlipped:NO\n" " hints:nil];"); + + verifyFormat( + "scoped_nsobject<NSTextField> message(\n" + " // The frame will be fixed up when |-setMessageText:| is called.\n" + " [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 0, 0)]);"); + } TEST_F(FormatTest, ObjCAt) { |