aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang-c/Index.h14
-rw-r--r--tools/CIndex/CIndex.cpp4
-rw-r--r--tools/CIndex/CIndex.exports3
-rw-r--r--tools/CIndex/CIndexUSRs.cpp47
4 files changed, 52 insertions, 16 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index 96c1b2f087..b853d74bf5 100644
--- a/include/clang-c/Index.h
+++ b/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/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp
index 19e82fc36f..53b4ed6f30 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/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<NamedDecl *>(AnonDecl);
diff --git a/tools/CIndex/CIndex.exports b/tools/CIndex/CIndex.exports
index 3326087f9e..006fc06a96 100644
--- a/tools/CIndex/CIndex.exports
+++ b/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/tools/CIndex/CIndexUSRs.cpp b/tools/CIndex/CIndexUSRs.cpp
index 40f93cd323..e53c0c66f1 100644
--- a/tools/CIndex/CIndexUSRs.cpp
+++ b/tools/CIndex/CIndexUSRs.cpp
@@ -30,17 +30,52 @@ extern "C" {
//
// module.m: static void Foo() { }
//
+
+static inline Entity GetEntity(const CXEntity &E) {
+ return Entity::getFromOpaquePtr(E.data);
+}
+
+static inline ASTUnit *GetTranslationUnit(CXTranslationUnit TU) {
+ return (ASTUnit*) TU;
+}
-const char *clang_getDeclarationName(CXEntity) {
- return "";
+static inline ASTContext &GetASTContext(CXTranslationUnit TU) {
+ return GetTranslationUnit(TU)->getASTContext();
}
-const char *clang_getUSR(CXEntity) {
- return "";
+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;
}
-CXEntity clang_getEntity(const char *URI) {
- return 0;
+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 "";
}
} // end extern "C"