diff options
author | Nico Weber <nicolasweber@gmx.de> | 2013-01-18 02:43:57 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2013-01-18 02:43:57 +0000 |
commit | 6a21a556a728325e1fae4387128d149927a4fbff (patch) | |
tree | 8511ccb514da8a6b64bd6c11d7a4e8a5fcc1d5a4 /lib/Format/Format.cpp | |
parent | f373c5d0b7f04fc3fa4e34bdfb868d118de6a641 (diff) |
Formatter: The contents of @selector() should be formatted as a selector.
Before: @selector(foo: )
Now: @selector(foo:)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@172781 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Format/Format.cpp')
-rw-r--r-- | lib/Format/Format.cpp | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index d1c3a4fa70..4b994e3b75 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -747,6 +747,25 @@ public: : CurrentToken(&RootToken), KeywordVirtualFound(false), ColonIsObjCMethodExpr(false) {} + /// \brief A helper class to manage AnnotatingParser::ColonIsObjCMethodExpr. + struct ObjCSelectorRAII { + AnnotatingParser &P; + bool ColonWasObjCMethodExpr; + + ObjCSelectorRAII(AnnotatingParser &P) + : P(P), ColonWasObjCMethodExpr(P.ColonIsObjCMethodExpr) {} + + ~ObjCSelectorRAII() { P.ColonIsObjCMethodExpr = ColonWasObjCMethodExpr; } + + void markStart(AnnotatedToken &Left) { + P.ColonIsObjCMethodExpr = true; + Left.Type = TT_ObjCMethodExpr; + } + + void markEnd(AnnotatedToken &Right) { Right.Type = TT_ObjCMethodExpr; } + }; + + bool parseAngle() { if (CurrentToken == NULL) return false; @@ -774,9 +793,23 @@ public: bool parseParens(bool LookForDecls = false) { if (CurrentToken == NULL) return false; + bool StartsObjCMethodExpr = false; AnnotatedToken *Left = CurrentToken->Parent; - if (CurrentToken->is(tok::caret)) + if (CurrentToken->is(tok::caret)) { + // ^( starts a block. Left->Type = TT_ObjCBlockLParen; + } else if (AnnotatedToken *MaybeSel = Left->Parent) { + // @selector( starts a selector. + if (MaybeSel->isObjCAtKeyword(tok::objc_selector) && MaybeSel->Parent && + MaybeSel->Parent->is(tok::at)) { + StartsObjCMethodExpr = true; + } + } + + ObjCSelectorRAII objCSelector(*this); + if (StartsObjCMethodExpr) + objCSelector.markStart(*Left); + while (CurrentToken != NULL) { // LookForDecls is set when "if (" has been seen. Check for // 'identifier' '*' 'identifier' followed by not '=' -- this @@ -796,6 +829,10 @@ public: if (CurrentToken->is(tok::r_paren)) { Left->MatchingParen = CurrentToken; CurrentToken->MatchingParen = Left; + + if (StartsObjCMethodExpr) + objCSelector.markEnd(*CurrentToken); + next(); return true; } @@ -824,18 +861,14 @@ public: getBinOpPrecedence(LSquare->Parent->FormatTok.Tok.getKind(), true, true) > prec::Unknown; - bool ColonWasObjCMethodExpr = ColonIsObjCMethodExpr; - if (StartsObjCMethodExpr) { - ColonIsObjCMethodExpr = true; - LSquare->Type = TT_ObjCMethodExpr; - } + ObjCSelectorRAII objCSelector(*this); + if (StartsObjCMethodExpr) + objCSelector.markStart(*LSquare); while (CurrentToken != NULL) { if (CurrentToken->is(tok::r_square)) { - if (StartsObjCMethodExpr) { - ColonIsObjCMethodExpr = ColonWasObjCMethodExpr; - CurrentToken->Type = TT_ObjCMethodExpr; - } + if (StartsObjCMethodExpr) + objCSelector.markEnd(*CurrentToken); next(); return true; } |