]> granicus.if.org Git - clang/commitdiff
Add pch reader/writer support for ObjCContainerDecl, ObjCInterfaceDecl, & ObjCIvarDecl.
authorSteve Naroff <snaroff@apple.com>
Mon, 20 Apr 2009 20:09:33 +0000 (20:09 +0000)
committerSteve Naroff <snaroff@apple.com>
Mon, 20 Apr 2009 20:09:33 +0000 (20:09 +0000)
Next step: Add selector support to PCHWriter::AddDeclarationName().

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69619 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclObjC.h
include/clang/Frontend/PCHBitCodes.h
lib/Frontend/PCHReader.cpp
lib/Frontend/PCHWriter.cpp
lib/Sema/SemaDeclObjC.cpp
tools/clang-cc/RewriteObjC.cpp

index 7ee7c7b91b1f56d62068c14f6f7bb463450f3864..c4b4c0b156a2b4a2b5602e403dd4205ecc6a587d 100644 (file)
@@ -479,15 +479,21 @@ public:
   SourceLocation getLocEnd() const { return EndLoc; }
   void setLocEnd(SourceLocation LE) { EndLoc = LE; };
   
+  void setClassLoc(SourceLocation Loc) { ClassLoc = Loc; }
   SourceLocation getClassLoc() const { return ClassLoc; }
   void setSuperClassLoc(SourceLocation Loc) { SuperClassLoc = Loc; }
   SourceLocation getSuperClassLoc() const { return SuperClassLoc; }
     
-  /// ImplicitInterfaceDecl - check that this is an implicitely declared
+  /// isImplicitInterfaceDecl - check that this is an implicitely declared
   /// ObjCInterfaceDecl node. This is for legacy objective-c @implementation
   /// declaration without an @interface declaration.
-  bool ImplicitInterfaceDecl() const { return InternalInterface; }
+  bool isImplicitInterfaceDecl() const { return InternalInterface; }
+  void setImplicitInterfaceDecl(bool val) { InternalInterface = val; }
   
+  // Low-level accessor
+  Type *getTypeForDecl() const { return TypeForDecl; }
+  void setTypeForDecl(Type *TD) { TypeForDecl = TD; }
+
   static bool classof(const Decl *D) { return D->getKind() == ObjCInterface; }
   static bool classof(const ObjCInterfaceDecl *D) { return true; }
 };
index c1e6a8f493c86f81acd251eb161c4e451b1e5d96..ad07e2ae6b6467f3ad918cb2738e588f04c1e4c1 100644 (file)
@@ -356,6 +356,10 @@ namespace clang {
       DECL_FUNCTION,
       /// \brief A ObjCMethodDecl record.
       DECL_OBJC_METHOD,
+      /// \brief A ObjCInterfaceDecl record.
+      DECL_OBJC_INTERFACE_DECL,
+      /// \brief A ObjCIvarDecl record.
+      DECL_OBJC_IVAR_DECL,
       /// \brief A FieldDecl record.
       DECL_FIELD,
       /// \brief A VarDecl record.
index 3975747b52cae1692c5e0776624333b7ac2d1e32..f1cb4d3cdce1a27ff41367076eb40a50a89fd98e 100644 (file)
@@ -68,6 +68,9 @@ namespace {
     void VisitBlockDecl(BlockDecl *BD);
     std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
     void VisitObjCMethodDecl(ObjCMethodDecl *D);
+    void VisitObjCContainerDecl(ObjCContainerDecl *D);
+    void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
+    void VisitObjCIvarDecl(ObjCIvarDecl *D);
   };
 }
 
@@ -184,6 +187,35 @@ void PCHDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
   MD->setMethodParams(Reader.getContext(), &Params[0], NumParams);
 }
 
+void PCHDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
+  VisitNamedDecl(CD);
+  CD->setAtEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+}
+
+void PCHDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
+  VisitObjCContainerDecl(ID);
+  ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
+  ID->setSuperClass(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
+  unsigned NumIvars = Record[Idx++];
+  llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
+  IVars.reserve(NumIvars);
+  for (unsigned I = 0; I != NumIvars; ++I)
+    IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
+  ID->setIVarList(&IVars[0], NumIvars, Reader.getContext());
+
+  ID->setForwardDecl(Record[Idx++]);
+  ID->setImplicitInterfaceDecl(Record[Idx++]);
+  ID->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  ID->setSuperClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  ID->setLocEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  // FIXME: add protocols, categories.
+}
+
+void PCHDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
+  VisitFieldDecl(IVD);
+  IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]);
+}
+
 void PCHDeclReader::VisitFieldDecl(FieldDecl *FD) {
   VisitValueDecl(FD);
   FD->setMutable(Record[Idx++]);
@@ -1801,6 +1833,17 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
     break;
   }
 
+  case pch::DECL_OBJC_INTERFACE_DECL: {
+    D = ObjCInterfaceDecl::Create(Context, 0, SourceLocation(), 0);
+    break;
+  }
+
+  case pch::DECL_OBJC_IVAR_DECL: {
+    D = ObjCIvarDecl::Create(Context, 0, SourceLocation(), 0, QualType(),
+                             ObjCIvarDecl::None);
+    break;
+  }
+
   case pch::DECL_FIELD: {
     D = FieldDecl::Create(Context, 0, SourceLocation(), 0, QualType(), 0, 
                           false);
index 9f6c4c1be0ce362afb8bfccb8c53ab0595774ac1..22c52aa0ffaa0976ac8ef11ec306cda0a31299b1 100644 (file)
@@ -272,6 +272,9 @@ namespace {
     void VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset, 
                           uint64_t VisibleOffset);
     void VisitObjCMethodDecl(ObjCMethodDecl *D);
+    void VisitObjCContainerDecl(ObjCContainerDecl *D);
+    void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
+    void VisitObjCIvarDecl(ObjCIvarDecl *D);
   };
 }
 
@@ -387,6 +390,36 @@ void PCHDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) {
   Code = pch::DECL_OBJC_METHOD;
 }
 
+void PCHDeclWriter::VisitObjCContainerDecl(ObjCContainerDecl *D) {
+  VisitNamedDecl(D);
+  Writer.AddSourceLocation(D->getAtEndLoc(), Record);
+  // Abstract class (no need to define a stable pch::DECL code).
+}
+
+void PCHDeclWriter::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
+  VisitObjCContainerDecl(D);
+  Writer.AddTypeRef(QualType(D->getTypeForDecl(), 0), Record);
+  Writer.AddDeclRef(D->getSuperClass(), Record);
+  Record.push_back(D->ivar_size());
+  for (ObjCInterfaceDecl::ivar_iterator I = D->ivar_begin(), 
+                                     IEnd = D->ivar_end(); I != IEnd; ++I)
+    Writer.AddDeclRef(*I, Record);
+  Record.push_back(D->isForwardDecl());
+  Record.push_back(D->isImplicitInterfaceDecl());
+  Writer.AddSourceLocation(D->getClassLoc(), Record);
+  Writer.AddSourceLocation(D->getSuperClassLoc(), Record);
+  Writer.AddSourceLocation(D->getLocEnd(), Record);
+  // FIXME: add protocols, categories.
+  Code = pch::DECL_OBJC_INTERFACE_DECL;
+}
+
+void PCHDeclWriter::VisitObjCIvarDecl(ObjCIvarDecl *D) {
+  VisitFieldDecl(D);
+  // FIXME: stable encoding for @public/@private/@protected/@package
+  Record.push_back(D->getAccessControl()); 
+  Code = pch::DECL_OBJC_IVAR_DECL;
+}
+
 void PCHDeclWriter::VisitFieldDecl(FieldDecl *D) {
   VisitValueDecl(D);
   Record.push_back(D->isMutable());
index b813e085eea29d25de3950a397adc3411fb63e85..9b5f0d7bb07bedcae7d5b3da89ec52a7dd0edd92 100644 (file)
@@ -699,7 +699,7 @@ void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
   /// Check case of non-existing @interface decl.
   /// (legacy objective-c @implementation decl without an @interface decl).
   /// Add implementations's ivar to the synthesize class's ivar list.
-  if (IDecl->ImplicitInterfaceDecl()) {
+  if (IDecl->isImplicitInterfaceDecl()) {
     IDecl->setIVarList(ivars, numIvars, Context);
     IDecl->setLocEnd(RBrace);
     return;
index 46f8e7ead38161098ca32f428b0301391cb23d85..842b63010f4df1e3964a90c6f30839be27d84e60 100644 (file)
@@ -3164,7 +3164,7 @@ void RewriteObjC::RewriteObjCClassMetaData(ObjCImplementationDecl *IDecl,
   ObjCInterfaceDecl *CDecl = IDecl->getClassInterface();
   
   // Explictly declared @interface's are already synthesized.
-  if (CDecl->ImplicitInterfaceDecl()) {
+  if (CDecl->isImplicitInterfaceDecl()) {
     // FIXME: Implementation of a class with no @interface (legacy) doese not 
     // produce correct synthesis as yet.
     SynthesizeObjCInternalStruct(CDecl, Result);