forked from OSchip/llvm-project
[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:
parent
ceeb19cf18
commit
93db2923da
|
@ -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 *);
|
||||
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue