string Slice::ObjCGenerator::getFactoryMethod(const ContainedPtr& p, bool deprecated) { ClassDefPtr def = ClassDefPtr::dynamicCast(p); if(def && def->declaration()->isLocal()) { deprecated = false; // Local classes don't have this issue since they were added after this fix. } // // If deprecated is true, we return uDPConnectionInfo for a class // named UDPConnectionInfo, return udpConnectionInfo otherwise. // string name = fixId(p->name()); if(name.empty()) { return name; } else if(deprecated || name.size() < 2 || !isupper(*(name.begin() + 1))) { *name.begin() = tolower(*name.begin()); } else { for(string::iterator p = name.begin(); p != name.end() && isalpha(*p); ++p) { if(p != name.end() - 1 && isalpha(*(p + 1)) && !isupper(*(p + 1))) { break; } *p = tolower(*p); } } return name; }
bool FreezeScript::AnalyzeTransformVisitor::visitClassDefStart(const ClassDefPtr& v) { if(v->isInterface() || v->isLocal()) { return false; } string scoped = v->scoped(); if(ignoreType(scoped)) { return false; } TypeList l = _newUnit->lookupTypeNoBuiltin(scoped, false); if(l.empty()) { _missingTypes.push_back(scoped); return false; } ClassDeclPtr decl = ClassDeclPtr::dynamicCast(l.front()); if(!decl || decl->isInterface()) { if(!_ignoreTypeChanges) { typeChange(scoped, v->declaration(), l.front()); } return false; } ClassDefPtr newClass = decl->definition(); if(!newClass) { _missingTypes.push_back(scoped); return false; } _out.newline(); _out.newline(); _out << "<!-- class " << scoped << " -->"; _out << se("transform") << attr("type", scoped); DataMemberList oldMembers = v->dataMembers(); DataMemberList newMembers = newClass->dataMembers(); compareMembers(oldMembers, newMembers); _out << ee; return false; }