This patch adds support for declaraing properties in categories,
just as they are declared in objc classes.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49817 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index 16299c4..596fefc 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -345,6 +345,69 @@
   Out << "@interface " 
       << PID->getClassInterface()->getName()
       << '(' << PID->getName() << ");\n";
+  // Output property declarations.
+  int NumProperties = PID->getNumPropertyDecl();
+  if (NumProperties > 0) {
+    for (int i = 0; i < NumProperties; i++) {
+      ObjCPropertyDecl *PDecl = PID->getPropertyDecl()[i];
+      Out << "@property";
+      if (PDecl->getPropertyAttributes() != ObjCPropertyDecl::OBJC_PR_noattr) {
+        bool first = true;
+        Out << " (";
+        if (PDecl->getPropertyAttributes() & 
+            ObjCPropertyDecl::OBJC_PR_readonly) {
+          Out << (first ? ' ' : ',') << "readonly";
+          first = false;
+        }
+        
+        if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
+          Out << (first ? ' ' : ',') << "getter = "
+          << PDecl->getGetterName()->getName();
+          first = false;
+        }
+        if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
+          Out << (first ? ' ' : ',') << "setter = "
+          << PDecl->getSetterName()->getName();
+          first = false;
+        }
+        
+        if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_assign) {
+          Out << (first ? ' ' : ',') << "assign";
+          first = false;
+        }
+        
+        if (PDecl->getPropertyAttributes() &
+            ObjCPropertyDecl::OBJC_PR_readwrite) {
+          Out << (first ? ' ' : ',') << "readwrite";
+          first = false;
+        }
+        
+        if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain) {
+          Out << (first ? ' ' : ',') << "retain";
+          first = false;
+        }
+        
+        if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) {
+          Out << (first ? ' ' : ',') << "copy";
+          first = false;
+        }
+        
+        if (PDecl->getPropertyAttributes() & 
+            ObjCPropertyDecl::OBJC_PR_nonatomic) {
+          Out << (first ? ' ' : ',') << "nonatomic";
+          first = false;
+        }
+        Out << " )";
+      }
+      Out << ' ' << PDecl->getType().getAsString()
+      << ' ' << PDecl->getName();
+      
+      Out << ";\n";
+    }
+  }
+  
+  Out << "@end\n";
+  
   // FIXME: implement the rest...
 }