[cfe-commits] r49862 - in /cfe/trunk: Driver/ASTConsumers.cpp include/clang/AST/DeclObjC.h lib/AST/DeclObjC.cpp lib/Sema/SemaDeclObjC.cpp

Fariborz Jahanian fjahanian at apple.com
Thu Apr 17 11:25:18 PDT 2008


Author: fjahanian
Date: Thu Apr 17 13:25:18 2008
New Revision: 49862

URL: http://llvm.org/viewvc/llvm-project?rev=49862&view=rev
Log:
Added property decl support for protocols.
Added assertion if unexpected property decls are found where they don't belong.
Consolidated property decl. printing by using a helper function.


Modified:
    cfe/trunk/Driver/ASTConsumers.cpp
    cfe/trunk/include/clang/AST/DeclObjC.h
    cfe/trunk/lib/AST/DeclObjC.cpp
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Modified: cfe/trunk/Driver/ASTConsumers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/ASTConsumers.cpp?rev=49862&r1=49861&r2=49862&view=diff

==============================================================================
--- cfe/trunk/Driver/ASTConsumers.cpp (original)
+++ cfe/trunk/Driver/ASTConsumers.cpp Thu Apr 17 13:25:18 2008
@@ -52,6 +52,7 @@
     void PrintObjCCategoryImplDecl(ObjCCategoryImplDecl *PID);    
     void PrintObjCCategoryDecl(ObjCCategoryDecl *PID);    
     void PrintObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *AID);
+    void PrintObjCPropertyDecl(ObjCPropertyDecl *PD);
   };
 } // end anonymous namespace
 
@@ -264,65 +265,9 @@
     Out << "}\n";
   }
   
-  int NumProperties = OID->getNumPropertyDecl();
-  if (NumProperties > 0) {
-    for (int i = 0; i < NumProperties; i++) {
-      ObjCPropertyDecl *PDecl = OID->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";
-    }
-  }
+  for (ObjCInterfaceDecl::classprop_iterator I = OID->classprop_begin(),
+       E = OID->classprop_end(); I != E; ++I)
+    PrintObjCPropertyDecl(*I);
   
   Out << "@end\n";
   // FIXME: implement the rest...
@@ -330,6 +275,11 @@
 
 void DeclPrinter::PrintObjCProtocolDecl(ObjCProtocolDecl *PID) {
   Out << "@protocol " << PID->getName() << '\n';
+  
+  for (ObjCProtocolDecl::classprop_iterator I = PID->classprop_begin(),
+       E = PID->classprop_end(); I != E; ++I)
+    PrintObjCPropertyDecl(*I);
+  Out << "@end\n";
   // FIXME: implement the rest...
 }
 
@@ -346,66 +296,9 @@
       << 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";
-    }
-  }
-  
+  for (ObjCCategoryDecl::classprop_iterator I = PID->classprop_begin(),
+       E = PID->classprop_end(); I != E; ++I)
+    PrintObjCPropertyDecl(*I);
   Out << "@end\n";
   
   // FIXME: implement the rest...
@@ -416,6 +309,65 @@
       << ' ' << AID->getClassInterface()->getName() << ";\n";  
 }
 
+/// PrintObjCPropertyDecl - print a property declaration.
+///
+void DeclPrinter::PrintObjCPropertyDecl(ObjCPropertyDecl *PDecl) {
+    
+  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";
+}
+    
 //===----------------------------------------------------------------------===//
 /// ASTPrinter - Pretty-printer of ASTs
 

Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=49862&r1=49861&r2=49862&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Thu Apr 17 13:25:18 2008
@@ -309,6 +309,11 @@
   
   void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
   
+  typedef ObjCPropertyDecl * const * classprop_iterator;
+  classprop_iterator classprop_begin() const { return PropertyDecl; }
+  classprop_iterator classprop_end() const {
+    return PropertyDecl+NumPropertyDecl;
+  }
   
   bool isForwardDecl() const { return ForwardDecl; }
   void setForwardDecl(bool val) { ForwardDecl = val; }
@@ -463,7 +468,11 @@
   /// protocol class methods
   ObjCMethodDecl **ClassMethods;  // Null if not defined
   unsigned NumClassMethods;  // 0 if none
-
+  
+  /// protocol properties
+  ObjCPropertyDecl **PropertyDecl;  // Null if no property
+  unsigned NumPropertyDecl;  // 0 if none
+  
   bool isForwardProtoDecl; // declared with @protocol.
   
   SourceLocation EndLoc; // marks the '>' or identifier.
@@ -474,6 +483,7 @@
       ReferencedProtocols(0), NumReferencedProtocols(0),
       InstanceMethods(0), NumInstanceMethods(0), 
       ClassMethods(0), NumClassMethods(0),
+      PropertyDecl(0), NumPropertyDecl(0),
       isForwardProtoDecl(true) {
     AllocReferencedProtocols(numRefProtos);
   }
@@ -504,6 +514,19 @@
   unsigned getNumReferencedProtocols() const { return NumReferencedProtocols; }
   unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
   unsigned getNumClassMethods() const { return NumClassMethods; }
+  
+  unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
+  
+  ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
+  ObjCPropertyDecl **getPropertyDecl() { return PropertyDecl; }
+  
+  void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+  
+  typedef ObjCPropertyDecl * const * classprop_iterator;
+  classprop_iterator classprop_begin() const { return PropertyDecl; }
+  classprop_iterator classprop_end() const {
+    return PropertyDecl+NumPropertyDecl;
+  }
 
   typedef ObjCMethodDecl * const * instmeth_iterator;
   instmeth_iterator instmeth_begin() const { return InstanceMethods; }
@@ -709,11 +732,18 @@
   unsigned getNumInstanceMethods() const { return NumInstanceMethods; }
   unsigned getNumClassMethods() const { return NumClassMethods; }
 
-  void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
   unsigned getNumPropertyDecl() const { return NumPropertyDecl; }
   
   ObjCPropertyDecl * const * getPropertyDecl() const { return PropertyDecl; }
   
+  void addProperties(ObjCPropertyDecl **Properties, unsigned NumProperties);
+  
+  typedef ObjCPropertyDecl * const * classprop_iterator;
+  classprop_iterator classprop_begin() const { return PropertyDecl; }
+  classprop_iterator classprop_end() const {
+    return PropertyDecl+NumPropertyDecl;
+  }
+  
   typedef ObjCMethodDecl * const * instmeth_iterator;
   instmeth_iterator instmeth_begin() const { return InstanceMethods; }
   instmeth_iterator instmeth_end() const {

Modified: cfe/trunk/lib/AST/DeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=49862&r1=49861&r2=49862&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp (original)
+++ cfe/trunk/lib/AST/DeclObjC.cpp Thu Apr 17 13:25:18 2008
@@ -198,6 +198,18 @@
 }                                   
 
 /// addProperties - Insert property declaration AST nodes into
+/// ObjCProtocolDecl's PropertyDecl field.
+///
+void ObjCProtocolDecl::addProperties(ObjCPropertyDecl **Properties, 
+                                     unsigned NumProperties) {
+  if (NumProperties == 0) return;
+  
+  NumPropertyDecl = NumProperties;
+  PropertyDecl = new ObjCPropertyDecl*[NumProperties];
+  memcpy(PropertyDecl, Properties, NumProperties*sizeof(ObjCPropertyDecl*));
+}
+
+/// addProperties - Insert property declaration AST nodes into
 /// ObjCCategoryDecl's PropertyDecl field.
 ///
 void ObjCCategoryDecl::addProperties(ObjCPropertyDecl **Properties, 

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=49862&r1=49861&r2=49862&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Thu Apr 17 13:25:18 2008
@@ -695,13 +695,15 @@
          || isa<ObjCProtocolDecl>(ClassDecl);
   bool checkIdenticalMethods = isa<ObjCImplementationDecl>(ClassDecl);
   
-  // TODO: property declaration in category and protocols.
   if (pNum != 0)
     if (ObjCInterfaceDecl *IDecl = dyn_cast<ObjCInterfaceDecl>(ClassDecl))
       IDecl->addProperties((ObjCPropertyDecl**)allProperties, pNum);
+    else if (ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(ClassDecl))
+      CDecl->addProperties((ObjCPropertyDecl**)allProperties, pNum);
+    else if (ObjCProtocolDecl *PDecl = dyn_cast<ObjCProtocolDecl>(ClassDecl))
+          PDecl->addProperties((ObjCPropertyDecl**)allProperties, pNum);
     else
-      if (ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(ClassDecl))
-        CDecl->addProperties((ObjCPropertyDecl**)allProperties, pNum);
+      assert(false && "ActOnAtEnd - property declaration misplaced");
   
   for (unsigned i = 0; i < allNum; i++ ) {
     ObjCMethodDecl *Method =





More information about the cfe-commits mailing list