]> granicus.if.org Git - clang/commitdiff
AST generation for objc2's property declarations.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 11 Apr 2008 23:40:25 +0000 (23:40 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 11 Apr 2008 23:40:25 +0000 (23:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49565 91177308-0d34-0410-b5e6-96231b3b80d8

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

index defa7a151151b1c028b3e9ef2966dfa3aa68a7c7..727c57ab41b989fee7602c097c1d072408db818a 100644 (file)
@@ -320,7 +320,7 @@ void DeclPrinter::PrintObjCInterfaceDecl(ObjCInterfaceDecl *OID) {
       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)
index f286e2f87dc0ab7c1bf98930075d29de0557dbeb..951b43d36adddc9efd4787a1aee7289dfd259db7 100644 (file)
@@ -27,6 +27,7 @@ class ObjCMethodDecl;
 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 @@ public:
 /// 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 @@ public:
     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);
   }
index 2243f99c3b59e36d65de2bd9a55bdc9a3e39bb9f..167b5af98e28a015a747c340c2dd05e28cd8983f 100644 (file)
@@ -24,6 +24,7 @@ namespace clang {
   class ObjCDeclSpec;
   class Declarator;
   class AttributeList;
+  class FieldDeclarator;
   // Parse.
   class Scope;
   class Action;
@@ -648,8 +649,9 @@ public:
     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;
   }
                                      
index 0b73ca5b5783bc1a9a4df217d4df2fba8fbc3dc1..6e348cab08b310374d30c4280ce06dd380559711 100644 (file)
@@ -110,9 +110,10 @@ ObjCCompatibleAliasDecl::Create(ASTContext &C,
 }
 
 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 @@ ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() {
   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*));
-}
-
 
 
index 4e8790b40fff12dae7e067816eb6974b2196fb21..cc57bdc700416a609d3b04c050014cd60ee4f03c 100644 (file)
@@ -392,26 +392,15 @@ Parser::DeclTy *Parser::ParseObjCPropertyDecl(DeclTy *interfaceDecl,
   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:
index 1626f0d51c7651077ac914c2d0dab4348abacc19..cf22f6808873a4b06505c1814eb17f871d588b77 100644 (file)
@@ -643,11 +643,10 @@ public:
                       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 {.
index 776a50f6f2ac8a317a037f13043cc61196a03a9c..7eb132ec404e3c259285d4d688e032d60d978c7d 100644 (file)
@@ -886,43 +886,52 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
   return ObjCMethod;
 }
 
-Sema::DeclTy *Sema::ActOnAddObjCProperties(SourceLocation AtLoc, 
-                                           DeclTy **allProperties,
-                                           unsigned NumProperties, 
-                                           ObjCDeclSpec &DS) {
-  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc);
-  
-  if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readonly)
+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 (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;
 }