From fb4961dfd0385c6e3d6c324187cf2d74ecfc964b Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 3 Mar 2010 06:36:57 +0000 Subject: [PATCH] Add clang_getCursorLinkage(), which returns the underlying linkage for the entity referred to by a CXCursor. llvm-svn: 97646 --- clang/include/clang-c/Index.h | 26 ++++++++++++++++++++++++++ clang/tools/CIndex/CIndex.cpp | 19 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index c1238e5d88e7..7bc290d88f4e 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -888,6 +888,32 @@ CINDEX_LINKAGE unsigned clang_isInvalid(enum CXCursorKind); */ CINDEX_LINKAGE unsigned clang_isTranslationUnit(enum CXCursorKind); +/** + * \brief Describe the linkage of the entity referred to by a cursor. + */ +enum CXLinkageKind { + /** \brief This value indicates that no linkage information is available + * for a provided CXCursor. */ + CXLinkage_Invalid, + /** + * \brief This is the linkage for variables, parameters, and so on that + * have automatic storage. This covers normal (non-extern) local variables. + */ + CXLinkage_NoLinkage, + /** \brief This is the linkage for static variables and static functions. */ + CXLinkage_Internal, + /** \brief This is the linkage for entities with external linkage that live + * in C++ anonymous namespaces.*/ + CXLinkage_UniqueExternal, + /** \brief This is the linkage for entities with true, external linkage. */ + CXLinkage_External +}; + +/** + * \brief Determine the linkage of the entity referred to be a given cursor. + */ +CINDEX_LINKAGE enum CXLinkageKind clang_getCursorLinkage(CXCursor cursor); + /** * @} */ diff --git a/clang/tools/CIndex/CIndex.cpp b/clang/tools/CIndex/CIndex.cpp index e13dddfcad58..6fc7b530307d 100644 --- a/clang/tools/CIndex/CIndex.cpp +++ b/clang/tools/CIndex/CIndex.cpp @@ -2209,6 +2209,25 @@ void clang_disposeTokens(CXTranslationUnit TU, } // end: extern "C" +//===----------------------------------------------------------------------===// +// Operations for querying linkage of a cursor. +//===----------------------------------------------------------------------===// + +extern "C" { +CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { + Decl *D = cxcursor::getCursorDecl(cursor); + if (NamedDecl *ND = dyn_cast_or_null(D)) + switch (ND->getLinkage()) { + case NoLinkage: return CXLinkage_NoLinkage; + case InternalLinkage: return CXLinkage_Internal; + case UniqueExternalLinkage: return CXLinkage_UniqueExternal; + case ExternalLinkage: return CXLinkage_External; + }; + + return CXLinkage_Invalid; +} +} // end: extern "C" + //===----------------------------------------------------------------------===// // CXString Operations. //===----------------------------------------------------------------------===//