diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2013-01-10 23:11:41 +0000 |
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2013-01-10 23:11:41 +0000 |
| commit | 9efe291fa874cda376d60aef47373e83b3a862f1 (patch) | |
| tree | e66e6763bf8a3c8d34058c8d63e23318b946a0eb /clang/lib | |
| parent | e46e8225f4c1bf172fa1d89a72ffe02607d1efe7 (diff) | |
| download | bcm5719-llvm-9efe291fa874cda376d60aef47373e83b3a862f1.tar.gz bcm5719-llvm-9efe291fa874cda376d60aef47373e83b3a862f1.zip | |
Formatter: Put spaces in ObjC method decls in the right place for Google style.
Objective-C method declarations look like this:
- (returntype)name:(type)argname anothername:(type)arg2name;
In google style, there's no space after the leading '-' but one after
"(returntype)" instead (but none after the argument types), see
http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Method_Declarations_and_Definitions
Not inserting the space after '-' is easy, but to insert the space after the
return type, the formatter needs to know that a closing parenthesis ends the
return type. To do this, I tweaked the code in parse() to check for this, which
in turn required moving detection of TT_ObjCMethodSpecifier from annotate() to
parse(), because parse() runs before annotate().
(To keep things interesting, the return type is optional, but it's almost
always there in practice.)
http://llvm-reviews.chandlerc.com/D280
llvm-svn: 172140
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Format/Format.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index f84d3c5bc7a..87b996a7823 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -39,6 +39,7 @@ enum TokenType { TT_ObjCBlockLParen, TT_ObjCDecl, TT_ObjCMethodSpecifier, + TT_ObjCSelectorStart, TT_ObjCProperty, TT_OverloadedOperator, TT_PointerOrReference, @@ -107,6 +108,7 @@ FormatStyle getLLVMStyle() { LLVMStyle.IndentCaseLabels = false; LLVMStyle.SpacesBeforeTrailingComments = 1; LLVMStyle.ObjCSpaceBeforeProtocolList = true; + LLVMStyle.ObjCSpaceBeforeReturnType = true; return LLVMStyle; } @@ -120,6 +122,7 @@ FormatStyle getGoogleStyle() { GoogleStyle.IndentCaseLabels = true; GoogleStyle.SpacesBeforeTrailingComments = 2; GoogleStyle.ObjCSpaceBeforeProtocolList = false; + GoogleStyle.ObjCSpaceBeforeReturnType = false; return GoogleStyle; } @@ -680,14 +683,26 @@ public: AnnotatedToken *Tok = CurrentToken; next(); switch (Tok->FormatTok.Tok.getKind()) { - case tok::l_paren: + case tok::plus: + case tok::minus: + // At the start of the line, +/- specific ObjectiveC method + // declarations. + if (Tok->Parent == NULL) + Tok->Type = TT_ObjCMethodSpecifier; + break; + case tok::l_paren: { + bool ParensWereObjCReturnType = + Tok->Parent && Tok->Parent->Type == TT_ObjCMethodSpecifier; if (!parseParens()) return false; if (CurrentToken != NULL && CurrentToken->is(tok::colon)) { CurrentToken->Type = TT_CtorInitializerColon; next(); + } else if (CurrentToken != NULL && ParensWereObjCReturnType) { + CurrentToken->Type = TT_ObjCSelectorStart; + next(); } - break; + } break; case tok::l_square: if (!parseSquare()) return false; @@ -948,10 +963,6 @@ private: } TokenType determinePlusMinusCaretUsage(const AnnotatedToken &Tok) { - // At the start of the line, +/- specific ObjectiveC method declarations. - if (Tok.Parent == NULL) - return TT_ObjCMethodSpecifier; - // Use heuristics to recognize unary operators. if (Tok.Parent->is(tok::equal) || Tok.Parent->is(tok::l_paren) || Tok.Parent->is(tok::comma) || Tok.Parent->is(tok::l_square) || @@ -1044,7 +1055,9 @@ private: if (Tok.is(tok::colon)) return false; if (Tok.Parent->Type == TT_ObjCMethodSpecifier) - return true; + return Style.ObjCSpaceBeforeReturnType || Tok.isNot(tok::l_paren); + if (Tok.Type == TT_ObjCSelectorStart) + return !Style.ObjCSpaceBeforeReturnType; if (Tok.Parent->is(tok::r_paren) && Tok.is(tok::identifier)) // Don't space between ')' and <id> return false; |

