Add 'clang_getCursorLanguage' to return the "language" of the AST element (e.g., distinguish between C and Objective-C language features). Currently this only returns results for declarations.

llvm-svn: 101070
This commit is contained in:
Ted Kremenek 2010-04-12 21:22:16 +00:00
parent 601f6d5b59
commit 4ed2925b91
3 changed files with 80 additions and 1 deletions

View File

@ -936,10 +936,25 @@ enum CXLinkageKind {
};
/**
* \brief Determine the linkage of the entity referred to be a given cursor.
* \brief Determine the linkage of the entity referred to by a given cursor.
*/
CINDEX_LINKAGE enum CXLinkageKind clang_getCursorLinkage(CXCursor cursor);
/**
* \brief Describe the "language" of the entity referred to by a cursor.
*/
CINDEX_LINKAGE enum CXLanguageKind {
CXLanguage_C,
CXLanguage_ObjC,
CXLanguage_CPlusPlus,
CXLanguage_Invalid
};
/**
* \brief Determine the "language" of the entity referred to by a given cursor.
*/
CINDEX_LINKAGE enum CXLanguageKind clang_getCursorLanguage(CXCursor cursor);
/**
* @}
*/

View File

@ -2464,6 +2464,69 @@ CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
}
} // end: extern "C"
//===----------------------------------------------------------------------===//
// Operations for querying language of a cursor.
//===----------------------------------------------------------------------===//
static CXLanguageKind getDeclLanguage(const Decl *D) {
switch (D->getKind()) {
default:
break;
case Decl::ImplicitParam:
case Decl::ObjCAtDefsField:
case Decl::ObjCCategory:
case Decl::ObjCCategoryImpl:
case Decl::ObjCClass:
case Decl::ObjCCompatibleAlias:
case Decl::ObjCContainer:
case Decl::ObjCForwardProtocol:
case Decl::ObjCImplementation:
case Decl::ObjCInterface:
case Decl::ObjCIvar:
case Decl::ObjCMethod:
case Decl::ObjCProperty:
case Decl::ObjCPropertyImpl:
case Decl::ObjCProtocol:
return CXLanguage_ObjC;
case Decl::CXXConstructor:
case Decl::CXXConversion:
case Decl::CXXDestructor:
case Decl::CXXMethod:
case Decl::CXXRecord:
case Decl::ClassTemplate:
case Decl::ClassTemplatePartialSpecialization:
case Decl::ClassTemplateSpecialization:
case Decl::Friend:
case Decl::FriendTemplate:
case Decl::FunctionTemplate:
case Decl::LinkageSpec:
case Decl::Namespace:
case Decl::NamespaceAlias:
case Decl::NonTypeTemplateParm:
case Decl::StaticAssert:
case Decl::Template:
case Decl::TemplateTemplateParm:
case Decl::TemplateTypeParm:
case Decl::UnresolvedUsingTypename:
case Decl::UnresolvedUsingValue:
case Decl::Using:
case Decl::UsingDirective:
case Decl::UsingShadow:
return CXLanguage_CPlusPlus;
}
return CXLanguage_C;
}
extern "C" {
CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
if (clang_isDeclaration(cursor.kind))
return getDeclLanguage(cxcursor::getCursorDecl(cursor));
return CXLanguage_Invalid;
}
} // end: extern "C"
//===----------------------------------------------------------------------===//
// CXString Operations.
//===----------------------------------------------------------------------===//

View File

@ -32,6 +32,7 @@ _clang_getCursorDefinition
_clang_getCursorExtent
_clang_getCursorKind
_clang_getCursorKindSpelling
_clang_getCursorLanguage
_clang_getCursorLinkage
_clang_getCursorLocation
_clang_getCursorReferenced