Formatter: Support @public/@protected/@package/@private.

@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
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index 7a6b6e2..5c43383 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -510,8 +510,19 @@
     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)
diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp
index d722025..adb5363 100644
--- a/lib/Format/UnwrappedLineParser.cpp
+++ b/lib/Format/UnwrappedLineParser.cpp
@@ -198,6 +198,18 @@
 
   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;