From: Nico Weber Date: Wed, 6 Feb 2013 16:54:35 +0000 (+0000) Subject: Formatter: Correctly detect ObjC message expressions preceded by a comment. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ac9bde236f4eced309712829b6009f902f8de20e;p=platform%2Fupstream%2Fllvm.git Formatter: Correctly detect ObjC message expressions preceded by a comment. llvm-svn: 174521 --- diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 12e7eac..9c7834f 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/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(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/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index d2a1bef..7e88c4e 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -2422,6 +2422,12 @@ TEST_F(FormatTest, FormatObjCMethodExpr) { " fraction:1.0\n" " respectFlipped:NO\n" " hints:nil];"); + + verifyFormat( + "scoped_nsobject 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) {