Make sure synthesized properties get inserted into the classes/categories meta data.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60426 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteObjC.cpp b/Driver/RewriteObjC.cpp
index 68ba314..aa898a8 100644
--- a/Driver/RewriteObjC.cpp
+++ b/Driver/RewriteObjC.cpp
@@ -169,7 +169,9 @@
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 @@
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 @@
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 @@
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 @@
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)