#include "llvm/ObjCMetadata/ObjCMetadata.h"
using namespace llvm;
Expected<ObjCClass> ObjCClassRef::getObjCClass() const {
return MetadataReader->getObjCClassFromRef(*this);
}
Expected<ObjCCategory> ObjCCategoryRef::getObjCCategory() const {
return MetadataReader->getObjCCategoryFromRef(*this);
}
Expected<ObjCProtocol> ObjCProtocolRef::getObjCProtocol() const {
return MetadataReader->getObjCProtocolFromRef(*this);
}
Expected<StringRef> ObjCClass::getName() const {
return MetadataReader->getObjCClassName(*this);
}
Expected<StringRef> ObjCClassRef::getClassName() const {
if (MetadataReader->isObjCClassExternal(*this)) {
StringRef symName = MetadataReader->getSymbolNameFromRef(Data);
return MetadataReader->guessClassNameBasedOnSymbol(symName);
} else if (auto class_t = getObjCClass())
return class_t->getName();
else
return class_t.takeError();
}
bool ObjCClassRef::isExternal() const {
return MetadataReader->isObjCClassExternal(*this);
}
Expected<StringRef> ObjCClass::getSuperClassName() const {
return MetadataReader->getObjCSuperClassName(*this);
}
Expected<bool> ObjCClass::isSwift() const {
return MetadataReader->isObjCClassSwift(*this);
}
Expected<bool> ObjCClass::isMetaClass() const {
return MetadataReader->isObjCClassMetaClass(*this);
}
Expected<ObjCPropertyList> ObjCClass::properties() const {
return MetadataReader->materializePropertyList(*this);
}
Expected<ObjCMethodList> ObjCClass::instanceMethods() const {
return MetadataReader->materializeInstanceMethodList(*this);
}
Expected<ObjCMethodList> ObjCClass::classMethods() const {
return MetadataReader->materializeClassMethodList(*this);
}
Expected<StringRef> ObjCCategory::getName() const {
return MetadataReader->getObjCCategoryName(*this);
}
Expected<StringRef> ObjCCategory::getBaseClassName() const {
return MetadataReader->getObjCCategoryBaseClassName(*this);
}
Expected<ObjCPropertyList> ObjCCategory::properties() const {
return MetadataReader->materializePropertyList(*this);
}
Expected<ObjCMethodList> ObjCCategory::instanceMethods() const {
return MetadataReader->materializeInstanceMethodList(*this);
}
Expected<ObjCMethodList> ObjCCategory::classMethods() const {
return MetadataReader->materializeClassMethodList(*this);
}
Expected<StringRef> ObjCProtocol::getName() const {
return MetadataReader->getObjCProtocolName(*this);
}
Expected<ObjCPropertyList> ObjCProtocol::properties() const {
return MetadataReader->materializePropertyList(*this);
}
Expected<ObjCMethodList> ObjCProtocol::instanceMethods() const {
return MetadataReader->materializeInstanceMethodList(*this);
}
Expected<ObjCMethodList> ObjCProtocol::classMethods() const {
return MetadataReader->materializeClassMethodList(*this);
}
Expected<ObjCMethodList> ObjCProtocol::optionalInstanceMethods() const {
return MetadataReader->materializeOptionalInstanceMethodList(*this);
}
Expected<ObjCMethodList> ObjCProtocol::optionalClassMethods() const {
return MetadataReader->materializeOptionalClassMethodList(*this);
}
Expected<StringRef> ObjCProperty::getName() const {
return MetadataReader->getPropertyName(*this);
}
Expected<StringRef> ObjCProperty::getAttribute() const {
return MetadataReader->getPropertyAttribute(*this);
}
Expected<std::string> ObjCProperty::getGetter() const {
auto Name = getName();
if (!Name)
return Name.takeError();
if (*Name == "#EncryptedString#")
return *Name;
auto Attr = getAttribute();
if (!Attr)
return Attr.takeError();
SmallVector<StringRef, 4> Attrs;
Attr->split(Attrs, ',');
for (auto a : Attrs) {
if (a.startswith("G"))
return a.drop_front(1).str();
}
return Name->str();
}
Expected<std::string> ObjCProperty::getSetter() const {
auto Name = getName();
if (!Name)
return Name.takeError();
if (*Name == "#EncryptedString#")
return *Name;
auto Attr = getAttribute();
if (!Attr)
return Attr.takeError();
SmallVector<StringRef, 4> Attrs;
Attr->split(Attrs, ',');
for (auto a : Attrs) {
if (a.startswith("S"))
return a.drop_front(1).str();
else if (a.startswith("R"))
return std::string(); }
std::string setter =
"set" + Name->substr(0, 1).upper() + Name->substr(1).str() + ":";
return setter;
}
Expected<StringRef> ObjCMethod::getName() const {
return MetadataReader->getMethodName(*this);
}
Expected<StringRef> ObjCMethod::getType() const {
return MetadataReader->getMethodType(*this);
}
Expected<StringRef> ObjCSelectorRef::getSelector() const {
return MetadataReader->getObjCSelectorName(*this);
}