]> granicus.if.org Git - clang/commitdiff
Formatter: Support @public/@protected/@package/@private.
authorNico Weber <nicolasweber@gmx.de>
Mon, 7 Jan 2013 19:05:19 +0000 (19:05 +0000)
committerNico Weber <nicolasweber@gmx.de>
Mon, 7 Jan 2013 19:05:19 +0000 (19:05 +0000)
@package is an Objective-C 2 feature, so turn on ObjC2 as well.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@171766 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/Format.cpp
lib/Format/UnwrappedLineParser.cpp
unittests/Format/FormatTest.cpp

index 7a6b6e2081b836ae4c43258c449307ad879bc2ef..5c433834c843956f39c3bbb264c2bc444f4bcd27 100644 (file)
@@ -510,8 +510,19 @@ private:
     if (Newlines == 0 && !Token.IsFirst)
       Newlines = 1;
     unsigned Indent = Line.Level * 2;
-    if ((Token.Tok.is(tok::kw_public) || Token.Tok.is(tok::kw_protected) ||
-         Token.Tok.is(tok::kw_private)) &&
+
+    bool IsAccessModifier = false;
+    if (Token.Tok.is(tok::kw_public) || Token.Tok.is(tok::kw_protected) ||
+        Token.Tok.is(tok::kw_private))
+      IsAccessModifier = true;
+    else if (Token.Tok.is(tok::at) && Line.Tokens.size() > 1 &&
+             (Line.Tokens[1].Tok.isObjCAtKeyword(tok::objc_public) ||
+              Line.Tokens[1].Tok.isObjCAtKeyword(tok::objc_protected) ||
+              Line.Tokens[1].Tok.isObjCAtKeyword(tok::objc_package) ||
+              Line.Tokens[1].Tok.isObjCAtKeyword(tok::objc_private)))
+      IsAccessModifier = true;
+
+    if (IsAccessModifier &&
         static_cast<int>(Indent) + Style.AccessModifierOffset >= 0)
       Indent += Style.AccessModifierOffset;
     if (!Line.InPPDirective || Token.HasUnescapedNewline)
index d7220259b7e7feaaab30e6d2cc79581dba5c908f..adb536324a3c6a2f134042b5eb33da9f8e9b4226 100644 (file)
@@ -198,6 +198,18 @@ void UnwrappedLineParser::parseStructuralElement() {
 
   int TokenNumber = 0;
   switch (FormatTok.Tok.getKind()) {
+  case tok::at:
+    nextToken();
+    switch (FormatTok.Tok.getObjCKeywordID()) {
+    case tok::objc_public:
+    case tok::objc_protected:
+    case tok::objc_package:
+    case tok::objc_private:
+      return parseAccessSpecifier();
+    default:
+      break;
+    }
+    break;
   case tok::kw_namespace:
     parseNamespace();
     return;
index 2ba4765cc7294118301fde54073532f78fc0ab17..d3144432d4d642b9344244a4b3ea7319dcdabbdf 100644 (file)
@@ -30,6 +30,7 @@ protected:
     LangOpts.CPlusPlus = 1;
     LangOpts.CPlusPlus11 = 1;
     LangOpts.ObjC1 = 1;
+    LangOpts.ObjC2 = 1;
     Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts);
     tooling::Replacements Replace = reformat(Style, Lex, Context.Sources,
                                              Ranges);
@@ -424,6 +425,34 @@ TEST_F(FormatTest, FormatObjCTryCatch) {
                "}");
 }
 
+TEST_F(FormatTest, FormatObjCInterface) {
+  verifyFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
+               "@public\n"
+               "  int field1;\n"
+               "@protected\n"
+               "  int field2;\n"
+               "@private\n"
+               "  int field3;\n"
+               "@package\n"
+               "  int field4;\n"
+               "}\n"
+               "+ (id)init;\n"
+               "@end");
+
+  verifyGoogleFormat("@interface Foo : NSObject<NSSomeDelegate> {\n"
+                     " @public\n"
+                     "  int field1;\n"
+                     " @protected\n"
+                     "  int field2;\n"
+                     " @private\n"
+                     "  int field3;\n"
+                     " @package\n"
+                     "  int field4;\n"
+                     "}\n"
+                     "+ (id)init;\n"
+                     "@end");
+}
+
 TEST_F(FormatTest, StaticInitializers) {
   verifyFormat("static SomeClass SC = { 1, 'a' };");