]> granicus.if.org Git - clang/commitdiff
Make sure synthesized properties get inserted into the classes/categories meta data.
authorSteve Naroff <snaroff@apple.com>
Tue, 2 Dec 2008 17:36:43 +0000 (17:36 +0000)
committerSteve Naroff <snaroff@apple.com>
Tue, 2 Dec 2008 17:36:43 +0000 (17:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60426 91177308-0d34-0410-b5e6-96231b3b80d8

Driver/RewriteObjC.cpp

index 68ba314c11612e6c400efd49e9fe53b6f69d0d42..aa898a8fe6be1fd1a7a534172a145d3dce6facba 100644 (file)
@@ -169,7 +169,9 @@ namespace {
     void RewriteInclude();
     void RewriteTabs();
     void RewriteForwardClassDecl(ObjCClassDecl *Dcl);
-    void RewritePropertyImplDecl(ObjCPropertyImplDecl *PID);
+    void RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
+                                 ObjCImplementationDecl *IMD,
+                                 ObjCCategoryImplDecl *CID);
     void RewriteInterfaceDecl(ObjCInterfaceDecl *Dcl);
     void RewriteImplementationDecl(NamedDecl *Dcl);
     void RewriteObjCMethodDecl(ObjCMethodDecl *MDecl, std::string &ResultStr);
@@ -596,7 +598,9 @@ static std::string getIvarAccessString(ObjCInterfaceDecl *ClassDecl,
   return S;
 }
 
-void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID) {
+void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
+                                          ObjCImplementationDecl *IMD,
+                                          ObjCCategoryImplDecl *CID) {
   SourceLocation startLoc = PID->getLocStart();
   InsertText(startLoc, "// ", 3);
   const char *startBuf = SM->getCharacterData(startLoc);
@@ -623,6 +627,15 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID) {
   Getr += "return " + getIvarAccessString(ClassDecl, OID);
   Getr += "; }";
   InsertText(onePastSemiLoc, Getr.c_str(), Getr.size());
+
+  // Add the rewritten getter to trigger meta data generation. An alternate, and 
+  // possibly cleaner approach is to hack RewriteObjCMethodsMetaData() to deal 
+  // with properties explicitly. The following addInstanceMethod() required far 
+  // less code change (and actually models what the rewriter is doing).
+  if (IMD)
+    IMD->addInstanceMethod(PD->getGetterMethodDecl());
+  else
+    CID->addInstanceMethod(PD->getGetterMethodDecl());
   
   if (PD->isReadOnly())
     return;
@@ -636,6 +649,12 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID) {
   Setr += OID->getNameAsCString();
   Setr += "; }";
   InsertText(onePastSemiLoc, Setr.c_str(), Setr.size());
+
+  // Add the rewritten setter to trigger meta data generation.
+  if (IMD)
+    IMD->addInstanceMethod(PD->getSetterMethodDecl());
+  else
+    CID->addInstanceMethod(PD->getSetterMethodDecl());
 }
 
 void RewriteObjC::RewriteForwardClassDecl(ObjCClassDecl *ClassDecl) {
@@ -919,7 +938,7 @@ void RewriteObjC::RewriteImplementationDecl(NamedDecl *OID) {
   for (ObjCCategoryImplDecl::propimpl_iterator
        I = IMD ? IMD->propimpl_begin() : CID->propimpl_begin(),
        E = IMD ? IMD->propimpl_end() : CID->propimpl_end(); I != E; ++I) {
-    RewritePropertyImplDecl(*I);
+    RewritePropertyImplDecl(*I, IMD, CID);
   }
 
   if (IMD)