[libclang] When indexing an objc property, also provide information about

the getter/setter objc method entities that the property is associated with.

rdar://10244558

llvm-svn: 151634
This commit is contained in:
Argyrios Kyrtzidis 2012-02-28 17:50:33 +00:00
parent ceeb19cf18
commit 93db2923da
6 changed files with 70 additions and 2 deletions

View File

@ -4270,6 +4270,12 @@ typedef struct {
const CXIdxObjCProtocolRefListInfo *protocols;
} CXIdxObjCCategoryDeclInfo;
typedef struct {
const CXIdxDeclInfo *declInfo;
const CXIdxEntityInfo *getter;
const CXIdxEntityInfo *setter;
} CXIdxObjCPropertyDeclInfo;
typedef struct {
const CXIdxDeclInfo *declInfo;
const CXIdxBaseClassInfo *const *bases;
@ -4387,6 +4393,9 @@ clang_index_getObjCCategoryDeclInfo(const CXIdxDeclInfo *);
CINDEX_LINKAGE const CXIdxObjCProtocolRefListInfo *
clang_index_getObjCProtocolRefListInfo(const CXIdxDeclInfo *);
CINDEX_LINKAGE const CXIdxObjCPropertyDeclInfo *
clang_index_getObjCPropertyDeclInfo(const CXIdxDeclInfo *);
CINDEX_LINKAGE const CXIdxIBOutletCollectionAttrInfo *
clang_index_getIBOutletCollectionAttrInfo(const CXIdxAttrInfo *);

View File

@ -1809,6 +1809,7 @@ static void index_indexDeclaration(CXClientData client_data,
const CXIdxObjCCategoryDeclInfo *CatInfo;
const CXIdxObjCInterfaceDeclInfo *InterInfo;
const CXIdxObjCProtocolRefListInfo *ProtoInfo;
const CXIdxObjCPropertyDeclInfo *PropInfo;
const CXIdxCXXClassDeclInfo *CXXClassInfo;
unsigned i;
index_data = (IndexData *)client_data;
@ -1870,6 +1871,17 @@ static void index_indexDeclaration(CXClientData client_data,
printProtocolList(ProtoInfo, client_data);
}
if ((PropInfo = clang_index_getObjCPropertyDeclInfo(info))) {
if (PropInfo->getter) {
printEntityInfo(" <getter>", client_data, PropInfo->getter);
printf("\n");
}
if (PropInfo->setter) {
printEntityInfo(" <setter>", client_data, PropInfo->setter);
printf("\n");
}
}
if ((CXXClassInfo = clang_index_getCXXClassDeclInfo(info))) {
for (i = 0; i != CXXClassInfo->numBases; ++i) {
printBaseClassInfo(client_data, CXXClassInfo->bases[i]);

View File

@ -608,6 +608,18 @@ clang_index_getObjCProtocolRefListInfo(const CXIdxDeclInfo *DInfo) {
return 0;
}
const CXIdxObjCPropertyDeclInfo *
clang_index_getObjCPropertyDeclInfo(const CXIdxDeclInfo *DInfo) {
if (!DInfo)
return 0;
const DeclInfo *DI = static_cast<const DeclInfo *>(DInfo);
if (const ObjCPropertyDeclInfo *PropInfo = dyn_cast<ObjCPropertyDeclInfo>(DI))
return &PropInfo->ObjCPropDeclInfo;
return 0;
}
const CXIdxIBOutletCollectionAttrInfo *
clang_index_getIBOutletCollectionAttrInfo(const CXIdxAttrInfo *AInfo) {
if (!AInfo)

View File

@ -517,8 +517,26 @@ bool IndexingContext::handleSynthesizedObjCMethod(const ObjCMethodDecl *D,
}
bool IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false,
/*isContainer=*/false);
ObjCPropertyDeclInfo DInfo;
EntityInfo GetterEntity;
EntityInfo SetterEntity;
ScratchAlloc SA(*this);
DInfo.ObjCPropDeclInfo.declInfo = &DInfo;
if (ObjCMethodDecl *Getter = D->getGetterMethodDecl()) {
getEntityInfo(Getter, GetterEntity, SA);
DInfo.ObjCPropDeclInfo.getter = &GetterEntity;
} else {
DInfo.ObjCPropDeclInfo.getter = 0;
}
if (ObjCMethodDecl *Setter = D->getSetterMethodDecl()) {
getEntityInfo(Setter, SetterEntity, SA);
DInfo.ObjCPropDeclInfo.setter = &SetterEntity;
} else {
DInfo.ObjCPropDeclInfo.setter = 0;
}
return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
}

View File

@ -53,6 +53,8 @@ struct DeclInfo : public CXIdxDeclInfo {
Info_ObjCProtocol,
Info_ObjCCategory,
Info_ObjCProperty,
Info_CXXClass
};
@ -168,6 +170,20 @@ struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
};
struct ObjCPropertyDeclInfo : public DeclInfo {
CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
ObjCPropertyDeclInfo()
: DeclInfo(Info_ObjCProperty,
/*isRedeclaration=*/false, /*isDefinition=*/false,
/*isContainer=*/false) { }
static bool classof(const DeclInfo *D) {
return D->Kind == Info_ObjCProperty;
}
static bool classof(const ObjCPropertyDeclInfo *D) { return true; }
};
struct CXXClassDeclInfo : public DeclInfo {
CXIdxCXXClassDeclInfo CXXClassInfo;

View File

@ -158,6 +158,7 @@ clang_index_getIBOutletCollectionAttrInfo
clang_index_getObjCCategoryDeclInfo
clang_index_getObjCContainerDeclInfo
clang_index_getObjCInterfaceDeclInfo
clang_index_getObjCPropertyDeclInfo
clang_index_getObjCProtocolRefListInfo
clang_index_isEntityObjCContainerKind
clang_index_setClientContainer