diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index d45830ef91d90f60da8dd05785cccf3b671e441f..e8e37a3d0bb54b95387a86240a214b1016ca76cb 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -4051,12 +4051,18 @@ typedef struct { CXIdxLoc endLoc; } CXIdxEndContainerInfo; +typedef enum { + CXIdxEntityRef_Direct = 1, + CXIdxEntityRef_ImplicitProperty = 2 +} CXIdxEntityRefKind; + typedef struct { CXCursor cursor; CXIdxLoc loc; CXIdxEntity referencedEntity; CXIdxEntity parentEntity; CXIdxContainer container; + CXIdxEntityRefKind kind; } CXIdxEntityRefInfo; typedef struct { diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index fb83d20cbec4d4af7ce29836ac3d19b6f69f229f..5adffbd2a805a8381cd74dd1084c3de850f48338 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1920,6 +1920,11 @@ static void index_indexEntityReference(CXClientData client_data, printCXIndexEntity(info->parentEntity); printf(" | container: "); printCXIndexContainer(info->container); + printf(" | kind: "); + switch (info->kind) { + case CXIdxEntityRef_Direct: printf("direct"); break; + case CXIdxEntityRef_ImplicitProperty: printf("implicit prop"); break; + } printf("\n"); } diff --git a/tools/libclang/IndexBody.cpp b/tools/libclang/IndexBody.cpp index b2ffb99267ef6054b1fbbbc9935d13a3929eae3a..769a1c7ae81e125127a392d84551182d9fc73943 100644 --- a/tools/libclang/IndexBody.cpp +++ b/tools/libclang/IndexBody.cpp @@ -69,6 +69,21 @@ public: IndexCtx.handleReference(MD, E->getSelectorStartLoc(), 0, ParentDC, E); return true; } + + bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { + if (E->isImplicitProperty()) { + if (ObjCMethodDecl *MD = E->getImplicitPropertyGetter()) + IndexCtx.handleReference(MD, E->getLocation(), 0, ParentDC, E, + CXIdxEntityRef_ImplicitProperty); + if (ObjCMethodDecl *MD = E->getImplicitPropertySetter()) + IndexCtx.handleReference(MD, E->getLocation(), 0, ParentDC, E, + CXIdxEntityRef_ImplicitProperty); + } else { + IndexCtx.handleReference(E->getExplicitProperty(), E->getLocation(), 0, + ParentDC, E); + } + return true; + } }; } // anonymous namespace diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index 8a41856032a6aa32dc305be048da074c3d2bf842..f295582b535f7a44405b96c0ee7fe601480e98da 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -388,7 +388,8 @@ void IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, const NamedDecl *Parent, const DeclContext *DC, - const Expr *E) { + const Expr *E, + CXIdxEntityRefKind Kind) { if (Loc.isInvalid()) return; if (!CB.indexEntityReference) @@ -402,7 +403,8 @@ void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, getIndexLoc(Loc), getIndexEntity(D), getIndexEntity(Parent), - getIndexContainerForDC(DC) }; + getIndexContainerForDC(DC), + Kind }; CB.indexEntityReference(ClientData, &Info); } diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index 710568058f5feacd4da453ca33ce2047109447de..d69f1c8eaa9c0942bf6fac0d9fada30e4855106a 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -132,7 +132,8 @@ public: void handleReference(const NamedDecl *D, SourceLocation Loc, const NamedDecl *Parent, const DeclContext *DC, - const Expr *E = 0); + const Expr *E = 0, + CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct); void invokeStartedTagTypeDefinition(const TagDecl *D);