]> granicus.if.org Git - clang/commitdiff
New AST representation for each objc2's property declaration.
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 14 Apr 2008 23:36:35 +0000 (23:36 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 14 Apr 2008 23:36:35 +0000 (23:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49699 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/ASTConsumers.cpp
include/clang/AST/DeclObjC.h
include/clang/Parse/Action.h
include/clang/Parse/Parser.h
lib/AST/DeclObjC.cpp
lib/Parse/ParseObjc.cpp
lib/Sema/Sema.h
lib/Sema/SemaDeclObjC.cpp

index 05debe38d492b2c91a34574d3bfd9d585156ca23..d05a307087b1866bafa20f6b602b86dda8fa02a4 100644 (file)
@@ -316,16 +316,9 @@ void DeclPrinter::PrintObjCInterfaceDecl(ObjCInterfaceDecl *OID) {
         }
         Out << " )";
       }
-      
-      ObjCPropertyDecl::propdecl_iterator
-        I = PDecl->propdecl_begin(), E = PDecl->propdecl_end();
-      
       Out << ' ' << PDecl->getType().getAsString()
-          << ' ' << (*I)->getName();
-    
-      for (++I; I != E; ++I)
-        Out << ", " << (*I)->getName();
-
+          << ' ' << PDecl->getName();
+      
       Out << ";\n";
     }
   }
index 951b43d36adddc9efd4787a1aee7289dfd259db7..bed6ac581287e343b564469a7ff12c79d33a3b17 100644 (file)
@@ -27,7 +27,6 @@ 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,
@@ -940,8 +939,12 @@ public:
   static bool classof(const ObjCCompatibleAliasDecl *D) { return true; }
   
 };
-  
-class ObjCPropertyDecl : public Decl {
+
+/// ObjCPropertyDecl - Represents one property declaration in an interface.
+/// For example:
+/// @property (assign, readwrite) int MyProperty;
+///
+class ObjCPropertyDecl : public NamedDecl {
 public:
   enum PropertyAttributeKind {
     OBJC_PR_noattr    = 0x00, 
@@ -956,31 +959,18 @@ public:
   };
 private:
   QualType DeclType;
-  // List of property name declarations
-  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, QualType T)
-    : Decl(ObjCProperty, L), DeclType(T),
-      PropertyDecls(0), NumPropertyDecls(0),
+  ObjCPropertyDecl(SourceLocation L, IdentifierInfo *Id, QualType T)
+    : NamedDecl(ObjCProperty, L, Id), DeclType(T),
       PropertyAttributes(OBJC_PR_noattr), GetterName(0), SetterName(0) {}
 public:
-  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, QualType T);
+  static ObjCPropertyDecl *Create(ASTContext &C, SourceLocation L, 
+                                  IdentifierInfo *Id, 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; }
-  NamedDecl **getPropertyDecls() { return PropertyDecls; }
-  void setNumPropertyDecls(unsigned num) { NumPropertyDecls = num; }
-  void setPropertyDecls(NamedDecl **Nd) { PropertyDecls = Nd; }
   PropertyAttributeKind getPropertyAttributes() const {
     return PropertyAttributeKind(PropertyAttributes);
   }
index 8d2c62bbb272066ff600884e6d03025723697822..217d8b1947fddb945ac3302622b058fb9f628ae7 100644 (file)
@@ -657,10 +657,9 @@ public:
     unsigned pNum = 0) {
     return;
   }
-  // ActOnAddObjCProperties - called to build one property AST
-  virtual DeclTy *ActOnAddObjCProperties (Scope *S, SourceLocation AtLoc,
-    FieldDeclarator *PropertyDeclarators, unsigned NumPropertyDeclarators, 
-    ObjCDeclSpec &ODS) {
+  // ActOnProperty - called to build one property AST
+  virtual DeclTy *ActOnProperty (Scope *S, SourceLocation AtLoc,
+                                 FieldDeclarator &FD, ObjCDeclSpec &ODS) {
     return 0;
   }
                                      
index 34addc0e8a27eb55436f0dc5916a9c5df2fea932..84fe49a76721e959c9184da0e874b108ea8e056c 100644 (file)
@@ -323,7 +323,6 @@ private:
                               DeclTy *classDecl,
             tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword);
   void ParseObjCPropertyAttribute(ObjCDeclSpec &DS);
-  DeclTy *ParseObjCPropertyDecl(DeclTy *interfaceDecl, SourceLocation AtLoc);
   
   DeclTy *ParseObjCMethodDefinition();
   
index 6e348cab08b310374d30c4280ce06dd380559711..7a99f0f5498b6beb523d7cdd4186e60c1542fec2 100644 (file)
@@ -111,9 +111,10 @@ ObjCCompatibleAliasDecl::Create(ASTContext &C,
 
 ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C,
                                            SourceLocation L,
+                                           IdentifierInfo *Id,
                                            QualType T) {
   void *Mem = C.getAllocator().Allocate<ObjCPropertyDecl>();
-  return new (Mem) ObjCPropertyDecl(L, T);
+  return new (Mem) ObjCPropertyDecl(L, Id, T);
 }
 
 //===----------------------------------------------------------------------===//
index cc57bdc700416a609d3b04c050014cd60ee4f03c..ec40e364795d6b26112e0f0bca9157aedc3abacc 100644 (file)
@@ -248,7 +248,32 @@ void Parser::ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
         if (contextKey != tok::objc_protocol)
           Diag(AtLoc, diag::err_objc_protocol_optional);
       } else if (ocKind == tok::objc_property) {
-        allProperties.push_back(ParseObjCPropertyDecl(interfaceDecl, AtLoc));
+        ObjCDeclSpec OCDS;
+        ConsumeToken(); // the "property" identifier
+        // Parse property attribute list, if any. 
+        if (Tok.is(tok::l_paren)) {
+          // property has attribute list.
+          ParseObjCPropertyAttribute(OCDS);
+        }
+        // Parse all the comma separated declarators.
+        DeclSpec DS;
+        llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
+        ParseStructDeclaration(DS, FieldDeclarators);
+        
+        if (Tok.is(tok::semi)) 
+          ConsumeToken();
+        else {
+          Diag(Tok, diag::err_expected_semi_decl_list);
+          SkipUntil(tok::r_brace, true, true);
+        }
+        // Convert them all to property declarations.
+        for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) {
+          FieldDeclarator &FD = FieldDeclarators[i];
+          // Install the property declarator into interfaceDecl.
+          DeclTy *Property = Actions.ActOnProperty(CurScope,
+                               DS.getSourceRange().getBegin(), FD, OCDS);
+          allProperties.push_back(Property);
+        }
         continue;
       } else {
         Diag(Tok, diag::err_objc_illegal_interface_qual);
@@ -370,39 +395,6 @@ void Parser::ParseObjCPropertyAttribute (ObjCDeclSpec &DS) {
   }
 }
 
-///   Main routine to parse property declaration.
-///
-///   @property property-attr-decl[opt] property-component-decl ';'
-///
-Parser::DeclTy *Parser::ParseObjCPropertyDecl(DeclTy *interfaceDecl, 
-                                              SourceLocation AtLoc) {
-  assert(Tok.isObjCAtKeyword(tok::objc_property) &&
-         "ParseObjCPropertyDecl(): Expected @property");
-  ObjCDeclSpec OCDS;
-  ConsumeToken(); // the "property" identifier
-  // Parse property attribute list, if any. 
-  if (Tok.is(tok::l_paren)) {
-    // property has attribute list.
-    ParseObjCPropertyAttribute(OCDS);
-  }
-  // Parse declaration portion of @property.
-  llvm::SmallVector<DeclTy*, 8> PropertyDecls;
-  
-  // Parse all the comma separated declarators.
-  DeclSpec DS;
-  llvm::SmallVector<FieldDeclarator, 8> FieldDeclarators;
-  ParseStructDeclaration(DS, FieldDeclarators);
-    
-  if (Tok.is(tok::semi)) 
-    ConsumeToken();
-  else {
-    Diag(Tok, diag::err_expected_semi_decl_list);
-    SkipUntil(tok::r_brace, true, true);
-  }
-  return Actions.ActOnAddObjCProperties(CurScope, AtLoc, &FieldDeclarators[0],
-                                        FieldDeclarators.size(), OCDS);
-}
-
 ///   objc-method-proto:
 ///     objc-instance-method objc-method-decl objc-method-attributes[opt] 
 ///     objc-class-method objc-method-decl objc-method-attributes[opt]
index 7b305737c2a91beb8f49623279a3cd8cec5a4758..50842f7d3a6b9764f9a2d01337d35d6d6536cc0d 100644 (file)
@@ -655,10 +655,8 @@ public:
                       DeclTy **allMethods = 0, unsigned allNum = 0,
                       DeclTy **allProperties = 0, unsigned pNum = 0);
   
-  virtual DeclTy *ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc, 
-                                         FieldDeclarator *allProperties,
-                                         unsigned NumProperties,
-                                         ObjCDeclSpec &ODS);  
+  virtual DeclTy *ActOnProperty(Scope *S, SourceLocation AtLoc,
+                                FieldDeclarator &FD, ObjCDeclSpec &ODS);  
   virtual DeclTy *ActOnMethodDeclaration(
     SourceLocation BeginLoc, // location of the + or -.
     SourceLocation EndLoc,   // location of the ; or {.
index 7eb132ec404e3c259285d4d688e032d60d978c7d..bf9af85a6c6c1cab20afe4ff9e2defc9bbb75912 100644 (file)
@@ -886,13 +886,12 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
   return ObjCMethod;
 }
 
-Sema::DeclTy *Sema::ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc, 
-                                           FieldDeclarator *propertyDeclarators,
-                                           unsigned NumPropertyDeclarators, 
-                                           ObjCDeclSpec &ODS) {
-  FieldDeclarator &FD = propertyDeclarators[0];
+Sema::DeclTy *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc, 
+                                  FieldDeclarator &FD,
+                                  ObjCDeclSpec &ODS) {
   QualType T = GetTypeForDeclarator(FD.D, S);
-  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc, T);
+  ObjCPropertyDecl *PDecl = ObjCPropertyDecl::Create(Context, AtLoc, 
+                                                     FD.D.getIdentifier(), T);
   
   if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_readonly)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
@@ -922,16 +921,6 @@ Sema::DeclTy *Sema::ActOnAddObjCProperties(Scope *S, SourceLocation AtLoc,
   if (ODS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nonatomic)
     PDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
   
-  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;
 }