diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 96c1b2f087ad..b853d74bf539 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -142,7 +142,10 @@ typedef struct { } CXCursor; /* A unique token for looking up "visible" CXDecls from a CXTranslationUnit. */ -typedef void *CXEntity; +typedef struct { + CXIndex index; + void *data; +} CXEntity; /** * For functions returning a string that might or might not need @@ -321,14 +324,17 @@ CINDEX_LINKAGE time_t clang_getFileTime(CXFile SFile); /* * CXEntity Operations. */ -CINDEX_LINKAGE const char *clang_getDeclarationName(CXEntity); + +/* clang_getDeclaration() maps from a CXEntity to the matching CXDecl (if any) + * in a specified translation unit. */ +CINDEX_LINKAGE CXDecl clang_getDeclaration(CXEntity, CXTranslationUnit); + CINDEX_LINKAGE const char *clang_getUSR(CXEntity); -CINDEX_LINKAGE CXEntity clang_getEntity(const char *USR); /* * CXDecl Operations. */ CINDEX_LINKAGE CXCursor clang_getCursorFromDecl(CXDecl); -CINDEX_LINKAGE CXEntity clang_getEntityFromDecl(CXDecl); +CINDEX_LINKAGE CXEntity clang_getEntityFromDecl(CXIndex, CXDecl); CINDEX_LINKAGE CXString clang_getDeclSpelling(CXDecl); CINDEX_LINKAGE unsigned clang_getDeclLine(CXDecl); CINDEX_LINKAGE unsigned clang_getDeclColumn(CXDecl); diff --git a/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp index 19e82fc36f9f..53b4ed6f3090 100644 --- a/clang/tools/CIndex/CIndex.cpp +++ b/clang/tools/CIndex/CIndex.cpp @@ -628,10 +628,6 @@ void clang_loadDeclaration(CXDecl Dcl, // CXDecl Operations. // -CXEntity clang_getEntityFromDecl(CXDecl) { - return 0; -} - CXString clang_getDeclSpelling(CXDecl AnonDecl) { assert(AnonDecl && "Passed null CXDecl"); NamedDecl *ND = static_cast(AnonDecl); diff --git a/clang/tools/CIndex/CIndex.exports b/clang/tools/CIndex/CIndex.exports index 3326087f9efc..006fc06a96a7 100644 --- a/clang/tools/CIndex/CIndex.exports +++ b/clang/tools/CIndex/CIndex.exports @@ -28,9 +28,8 @@ _clang_getDeclExtent _clang_getDeclSource _clang_getDeclSourceFile _clang_getDeclSpelling -_clang_getDeclarationName +_clang_getDeclaration _clang_getDefinitionSpellingAndExtent -_clang_getEntity _clang_getEntityFromDecl _clang_getFileName _clang_getFileTime diff --git a/clang/tools/CIndex/CIndexUSRs.cpp b/clang/tools/CIndex/CIndexUSRs.cpp index 40f93cd323aa..e53c0c66f179 100644 --- a/clang/tools/CIndex/CIndexUSRs.cpp +++ b/clang/tools/CIndex/CIndexUSRs.cpp @@ -30,17 +30,52 @@ extern "C" { // // module.m: static void Foo() { } // - -const char *clang_getDeclarationName(CXEntity) { - return ""; + +static inline Entity GetEntity(const CXEntity &E) { + return Entity::getFromOpaquePtr(E.data); +} + +static inline ASTUnit *GetTranslationUnit(CXTranslationUnit TU) { + return (ASTUnit*) TU; } +static inline ASTContext &GetASTContext(CXTranslationUnit TU) { + return GetTranslationUnit(TU)->getASTContext(); +} + +static inline CXEntity NullCXEntity() { + CXEntity CE; + CE.index = NULL; + CE.data = NULL; + return CE; +} + +static inline CXEntity MakeEntity(CXIndex CIdx, const Entity &E) { + CXEntity CE; + CE.index = CIdx; + CE.data = E.getAsOpaquePtr(); + return CE; +} + +static inline Program &GetProgram(CXIndex CIdx) { + return ((CIndexer*) CIdx)->getProgram(); +} + +/// clang_getDeclaration() maps from a CXEntity to the matching CXDecl (if any) +/// in a specified translation unit. +CXDecl clang_getDeclaration(CXEntity CE, CXTranslationUnit TU) { + return (CXDecl) GetEntity(CE).getDecl(GetASTContext(TU)); +} + + +CXEntity clang_getEntityFromDecl(CXIndex CIdx, CXDecl CE) { + if (Decl *D = (Decl *) CE) + return MakeEntity(CIdx, Entity::get(D, GetProgram(CIdx))); + return NullCXEntity(); +} + const char *clang_getUSR(CXEntity) { return ""; } -CXEntity clang_getEntity(const char *URI) { - return 0; -} - } // end extern "C"