Synthesize property setter method as we do for getter.
 - Also, fix Parser to construct proper SetterName selector (should be
   lifted out of parser though).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55352 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index 5758460..a2f4eb2 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -212,6 +212,23 @@
   return 0;
 }
 
+/// constructSetterName - Return the setter name for the given
+/// identifier, i.e. "set" + Name where the initial character of Name
+/// has been capitalized.
+static IdentifierInfo *constructSetterName(IdentifierTable &Idents,
+                                           const IdentifierInfo *Name) {
+  unsigned N = Name->getLength();
+  char *SelectorName = new char[3 + N];
+  memcpy(SelectorName, "set", 3);
+  memcpy(&SelectorName[3], Name->getName(), N);
+  SelectorName[3] = toupper(SelectorName[3]);
+
+  IdentifierInfo *Setter = 
+    &Idents.get(SelectorName, &SelectorName[3 + N]);
+  delete[] SelectorName;
+  return Setter;
+}
+
 ///   objc-interface-decl-list:
 ///     empty
 ///     objc-interface-decl-list objc-property-decl [OBJC2]
@@ -276,11 +293,12 @@
           PP.getSelectorTable().getNullarySelector(OCDS.getGetterName() 
                                                    ? OCDS.getGetterName() 
                                                    : FD.D.getIdentifier());
+          IdentifierInfo *SetterName = OCDS.getSetterName();
+          if (!SetterName)
+            SetterName = constructSetterName(PP.getIdentifierTable(),
+                                             FD.D.getIdentifier());
           Selector SetterSel = 
-          PP.getSelectorTable().getNullarySelector(OCDS.getSetterName()
-                                                   ? OCDS.getSetterName()
-                                                   // FIXME. This is not right!
-                                                   : FD.D.getIdentifier());
+            PP.getSelectorTable().getUnarySelector(SetterName);
           DeclTy *Property = Actions.ActOnProperty(CurScope,
                                AtLoc, FD, OCDS,
                                GetterSel, SetterSel,