Implement clang_getCanonicalCursor() in libclang, which does the obvious thing.

llvm-svn: 119874
This commit is contained in:
Douglas Gregor 2010-11-19 23:44:15 +00:00
parent 6ae70b2e0f
commit fec4dc9418
4 changed files with 38 additions and 0 deletions

View File

@ -2074,6 +2074,32 @@ CINDEX_LINKAGE CXCursor clang_getCursorDefinition(CXCursor);
*/
CINDEX_LINKAGE unsigned clang_isCursorDefinition(CXCursor);
/**
* \brief Retrieve the canonical cursor corresponding to the given cursor.
*
* In the C family of languages, many kinds of entities can be declared several
* times within a single translation unit. For example, a structure type can
* be forward-declared (possibly multiple times) and later defined:
*
* \code
* struct X;
* struct X;
* struct X {
* int member;
* };
* \endcode
*
* The declarations and the definition of \c X are represented by three
* different cursors, all of which are declarations of the same underlying
* entity. One of these cursor is considered the "canonical" cursor, which
* is effectively the representative for the underlying entity. One can
* determine if two cursors are declarations of the same underlying entity by
* comparing their canonical cursors.
*
* \returns The canonical cursor for the entity referred to by the given cursor.
*/
CINDEX_LINKAGE CXCursor clang_getCanonicalCursor(CXCursor);
/**
* @}
*/

View File

@ -3717,6 +3717,16 @@ unsigned clang_isCursorDefinition(CXCursor C) {
return clang_getCursorDefinition(C) == C;
}
CXCursor clang_getCanonicalCursor(CXCursor C) {
if (!clang_isDeclaration(C.kind))
return C;
if (Decl *D = getCursorDecl(C))
return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
return C;
}
unsigned clang_getNumOverloadedDecls(CXCursor C) {
if (C.kind != CXCursor_OverloadedDeclRef)
return 0;

View File

@ -32,6 +32,7 @@ _clang_equalTypes
_clang_formatDiagnostic
_clang_getCString
_clang_getCXXAccessSpecifier
_clang_getCanonicalCursor
_clang_getCanonicalType
_clang_getClangVersion
_clang_getCompletionAvailability

View File

@ -32,6 +32,7 @@ clang_equalTypes
clang_formatDiagnostic
clang_getCString
clang_getCXXAccessSpecifier
clang_getCanonicalCursor
clang_getCanonicalType
clang_getClangVersion
clang_getCompletionAvailability