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

Fariborz Jahanian fjahanian at apple.com
Fri Apr 11 16:40:25 PDT 2008


Author: fjahanian
Date: Fri Apr 11 18:40:25 2008
New Revision: 49565

URL: http://llvm.org/viewvc/llvm-project?rev=49565&view=rev
Log:
AST generation for objc2's property declarations.

Modified:
    cfe/trunk/Driver/ASTConsumers.cpp
    cfe/trunk/include/clang/AST/DeclObjC.h
    cfe/trunk/include/clang/Parse/Action.h
    cfe/trunk/lib/AST/DeclObjC.cpp
    cfe/trunk/lib/Parse/ParseObjc.cpp
    cfe/trunk/lib/Sema/Sema.h
    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=49565&r1=49564&r2=49565&view=diff

==============================================================================
--- cfe/trunk/Driver/ASTConsumers.cpp (original)
+++ cfe/trunk/Driver/ASTConsumers.cpp Fri Apr 11 18:40:25 2008
@@ -320,7 +320,7 @@
       ObjCPropertyDecl::propdecl_iterator
         I = PDecl->propdecl_begin(), E = PDecl->propdecl_end();
       
-      Out << ' ' << (*I)->getType().getAsString()
+      Out << ' ' << PDecl->getType().getAsString()
           << ' ' << (*I)->getName();
     
       for (++I; I != E; ++I)

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

==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Fri Apr 11 18:40:25 2008
@@ -27,6 +27,7 @@
 class ObjCProtocolDecl;
 class ObjCCategoryDecl;
 class ObjCPropertyDecl;
+class FieldDeclarator;
 
 /// ObjCMethodDecl - Represents an instance or class method declaration.
 /// ObjC methods can be declared within 4 contexts: class interfaces,
@@ -833,7 +834,7 @@
 /// from the class interface to the class implementation (but I digress:-)
 ///
 class ObjCImplementationDecl : public NamedDecl {
-  /// Class interface for this category implementation
+  /// Class interface for this implementation
   ObjCInterfaceDecl *ClassInterface;
   
   /// Implementation Class's super class.
@@ -954,33 +955,32 @@
     OBJC_PR_setter    = 0x80
   };
 private:
+  QualType DeclType;
   // List of property name declarations
-  // FIXME: Property is not an ivar.
-  ObjCIvarDecl **PropertyDecls;
+  NamedDecl **PropertyDecls;
   unsigned NumPropertyDecls;
   unsigned PropertyAttributes : 8;
   
   IdentifierInfo *GetterName;    // getter name of NULL if no getter
   IdentifierInfo *SetterName;    // setter name of NULL if no setter
   
-  ObjCPropertyDecl(SourceLocation L)
-    : Decl(ObjCProperty, L), PropertyDecls(0), NumPropertyDecls(0),
+  ObjCPropertyDecl(SourceLocation L, QualType T)
+    : Decl(ObjCProperty, L), DeclType(T),
+      PropertyDecls(0), NumPropertyDecls(0),
       PropertyAttributes(OBJC_PR_noattr), GetterName(0), SetterName(0) {}
 public:
-  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L);
-  
-  typedef ObjCIvarDecl * const *propdecl_iterator;
+  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, QualType T);
+  QualType getType() const { return DeclType; }
+  typedef NamedDecl * const *propdecl_iterator;
   propdecl_iterator propdecl_begin() const { return PropertyDecls; }
   propdecl_iterator propdecl_end() const {
     return PropertyDecls+NumPropertyDecls; 
   }
   unsigned propdecl_size() const { return NumPropertyDecls; }
   bool propdecl_empty() const { return NumPropertyDecls == 0; }
-
-  /// setPropertyDeclLists - Set the property decl list to the specified array
-  /// of decls.
-  void setPropertyDeclLists(ObjCIvarDecl **Properties, unsigned NumProp);
-  
+  NamedDecl **getPropertyDecls() { return PropertyDecls; }
+  void setNumPropertyDecls(unsigned num) { NumPropertyDecls = num; }
+  void setPropertyDecls(NamedDecl **Nd) { PropertyDecls = Nd; }
   PropertyAttributeKind getPropertyAttributes() const {
     return PropertyAttributeKind(PropertyAttributes);
   }

Modified: cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=49565&r1=49564&r2=49565&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Fri Apr 11 18:40:25 2008
@@ -24,6 +24,7 @@
   class ObjCDeclSpec;
   class Declarator;
   class AttributeList;
+  class FieldDeclarator;
   // Parse.
   class Scope;
   class Action;
@@ -648,8 +649,9 @@
     return;
   }
   // ActOnAddObjCProperties - called to build one property AST
-  virtual DeclTy *ActOnAddObjCProperties (SourceLocation AtLoc,
-    DeclTy **allProperties, unsigned NumProperties, ObjCDeclSpec &DS) {
+  virtual DeclTy *ActOnAddObjCProperties (Scope *S, SourceLocation AtLoc,
+    FieldDeclarator *PropertyDeclarators, unsigned NumPropertyDeclarators, 
+    ObjCDeclSpec &ODS) {
     return 0;
   }
                                      

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

==============================================================================
--- cfe/trunk/lib/AST/DeclObjC.cpp (original)
+++ cfe/trunk/lib/AST/DeclObjC.cpp Fri Apr 11 18:40:25 2008
@@ -110,9 +110,10 @@
 }
 
 ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C,
-                                           SourceLocation L) {
+                                           SourceLocation L,
+                                           QualType T) {
   void *Mem = C.getAllocator().Allocate<ObjCPropertyDecl>();
-  return new (Mem) ObjCPropertyDecl(L);
+  return new (Mem) ObjCPropertyDecl(L, T);
 }
 
 //===----------------------------------------------------------------------===//
@@ -432,15 +433,5 @@
   return 0;
 }
 
-void ObjCPropertyDecl::setPropertyDeclLists(ObjCIvarDecl **Properties, 
-                                            unsigned NumProp) {
-  assert(PropertyDecls == 0 && "Properties already set");
-  if (NumProp == 0) return;
-  NumPropertyDecls = NumProp;
-
-  PropertyDecls = new ObjCIvarDecl*[NumProp];
-  memcpy(PropertyDecls, Properties, NumProp*sizeof(ObjCIvarDecl*));
-}
-
 
 

Modified: cfe/trunk/lib/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseObjc.cpp?rev=49565&r1=49564&r2=49565&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/lib/Parse/ParseObjc.cpp Fri Apr 11 18:40:25 2008
@@ -392,26 +392,15 @@
   DeclSpec DS;
   llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
   ParseStructDeclaration(DS, FieldDeclarators);
-  
-  // Convert them all to fields.
-  for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) {
-    FieldDeclarator &FD = FieldDeclarators[i];
-    // Install the declarator into interfaceDecl.
-    DeclTy *Field = Actions.ActOnIvar(CurScope,
-                                       DS.getSourceRange().getBegin(),
-                                      FD.D, FD.BitfieldSize, 
-                                      tok::objc_not_keyword);
-    PropertyDecls.push_back(Field);
-  }
-  
+    
   if (Tok.is(tok::semi)) 
     ConsumeToken();
   else {
     Diag(Tok, diag::err_expected_semi_decl_list);
     SkipUntil(tok::r_brace, true, true);
   }
-  return Actions.ActOnAddObjCProperties(AtLoc,  &PropertyDecls[0],
-                                        PropertyDecls.size(), OCDS);
+  return Actions.ActOnAddObjCProperties(CurScope, AtLoc, &FieldDeclarators[0],
+                                        FieldDeclarators.size(), OCDS);
 }
 
 ///   objc-method-proto:

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=49565&r1=49564&r2=49565&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Fri Apr 11 18:40:25 2008
@@ -643,11 +643,10 @@
                       DeclTy **allMethods = 0, unsigned allNum = 0,
                       DeclTy **allProperties = 0, unsigned pNum = 0);
   
-  virtual DeclTy *ActOnAddObjCProperties(SourceLocation AtLoc, 
-                                         DeclTy **allProperties,
+  virtual DeclTy *ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc, 
+                                         FieldDeclarator *allProperties,
                                          unsigned NumProperties,
-                                         ObjCDeclSpec &DS);
-  
+                                         ObjCDeclSpec &ODS);  
   virtual DeclTy *ActOnMethodDeclaration(
     SourceLocation BeginLoc, // location of the + or -.
     SourceLocation EndLoc,   // location of the ; or {.

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

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Apr 11 18:40:25 2008
@@ -886,43 +886,52 @@
   return ObjCMethod;
 }
 
-Sema::DeclTy *Sema::ActOnAddObjCProperties(SourceLocation AtLoc, 
-                                           DeclTy **allProperties,
-                                           unsigned NumProperties, 
-                                           ObjCDeclSpec &DS) {
-  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc);
+Sema::DeclTy *Sema::ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc, 
+                                           FieldDeclarator *propertyDeclarators,
+                                           unsigned NumPropertyDeclarators, 
+                                           ObjCDeclSpec &ODS) {
+  FieldDeclarator &FD = propertyDeclarators[0];
+  QualType T = GetTypeForDeclarator(FD.D, S);
+  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc, T);
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readonly)
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readonly)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_getter) {
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_getter) {
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_getter);
-    PDecl->setGetterName(DS.getGetterName());
+    PDecl->setGetterName(ODS.getGetterName());
   }
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_setter) {
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_setter) {
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_setter);
-    PDecl->setSetterName(DS.getSetterName());
+    PDecl->setSetterName(ODS.getSetterName());
   }
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_assign)
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_assign)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_assign);
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readwrite)
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readwrite)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readwrite);
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_retain)
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_retain)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_retain);
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_copy)
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_copy)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_copy);
   
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nonatomic)
+  if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nonatomic)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
   
-  if (NumProperties != 0)
-    PDecl->setPropertyDeclLists((ObjCIvarDecl**)allProperties, NumProperties);
-  
+  if (NumPropertyDeclarators != 0) {
+    NamedDecl **propertyName = new NamedDecl*[NumPropertyDeclarators];
+    PDecl->setPropertyDecls(propertyName);
+    PDecl->setNumPropertyDecls(NumPropertyDeclarators);
+    for (unsigned i = 0; i < NumPropertyDeclarators; i++) {
+      Declarator &D = propertyDeclarators[i].D;
+      propertyName[i] = new NamedDecl(Decl::ObjCProperty, 
+                                      D.getIdentifierLoc(), D.getIdentifier());
+    }
+  }
   return PDecl;
 }
 





More information about the cfe-commits mailing list