aboutsummaryrefslogtreecommitdiff
path: root/tools/libclang/IndexingContext.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-12-07 20:44:12 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-12-07 20:44:12 +0000
commit838d3c23204f52ae27a9f5e9a254238a7ac5d41b (patch)
treeeda222d7d823375ede9ecc44d0362a836a28a280 /tools/libclang/IndexingContext.cpp
parentb39c5b4ddc9dcc7d9845c6c637e03e83302f8538 (diff)
[libclang] Introduce CXIdxEntityLanguage that indicates the language
of an indexed entity. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146067 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/libclang/IndexingContext.cpp')
-rw-r--r--tools/libclang/IndexingContext.cpp72
1 files changed, 54 insertions, 18 deletions
diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp
index 3f934be8a0..bb00acfea3 100644
--- a/tools/libclang/IndexingContext.cpp
+++ b/tools/libclang/IndexingContext.cpp
@@ -705,6 +705,7 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
EntityInfo.IndexCtx = this;
EntityInfo.kind = CXIdxEntity_Unexposed;
EntityInfo.templateKind = CXIdxEntity_NonTemplate;
+ EntityInfo.lang = CXIdxEntityLang_C;
if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
switch (TD->getTagKind()) {
@@ -713,15 +714,18 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
case TTK_Union:
EntityInfo.kind = CXIdxEntity_Union; break;
case TTK_Class:
- EntityInfo.kind = CXIdxEntity_CXXClass; break;
+ EntityInfo.kind = CXIdxEntity_CXXClass;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
case TTK_Enum:
EntityInfo.kind = CXIdxEntity_Enum; break;
}
if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) {
- if (TD->getTagKind() == TTK_Struct &&
- CXXRec->hasDefinition() && !CXXRec->isPOD())
- EntityInfo.kind = CXIdxEntity_CXXClass;
+ // FIXME: isPOD check is not sufficient, a POD can contain methods,
+ // we want a isCStructLike check.
+ if (CXXRec->hasDefinition() && !CXXRec->isPOD())
+ EntityInfo.lang = CXIdxEntityLang_CXX;
}
if (isa<ClassTemplatePartialSpecializationDecl>(D)) {
@@ -739,50 +743,77 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
break;
case Decl::Var:
EntityInfo.kind = CXIdxEntity_Variable;
- if (isa<CXXRecordDecl>(D->getDeclContext()))
+ if (isa<CXXRecordDecl>(D->getDeclContext())) {
EntityInfo.kind = CXIdxEntity_CXXStaticVariable;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ }
break;
case Decl::Field:
EntityInfo.kind = CXIdxEntity_Field;
if (const CXXRecordDecl *
- CXXRec = dyn_cast<CXXRecordDecl>(D->getDeclContext()))
+ CXXRec = dyn_cast<CXXRecordDecl>(D->getDeclContext())) {
+ // FIXME: isPOD check is not sufficient, a POD can contain methods,
+ // we want a isCStructLike check.
if (!CXXRec->isPOD())
- EntityInfo.kind = CXIdxEntity_CXXInstanceVariable;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ }
break;
case Decl::EnumConstant:
EntityInfo.kind = CXIdxEntity_EnumConstant; break;
case Decl::ObjCInterface:
- EntityInfo.kind = CXIdxEntity_ObjCClass; break;
+ EntityInfo.kind = CXIdxEntity_ObjCClass;
+ EntityInfo.lang = CXIdxEntityLang_ObjC;
+ break;
case Decl::ObjCProtocol:
- EntityInfo.kind = CXIdxEntity_ObjCProtocol; break;
+ EntityInfo.kind = CXIdxEntity_ObjCProtocol;
+ EntityInfo.lang = CXIdxEntityLang_ObjC;
+ break;
case Decl::ObjCCategory:
- EntityInfo.kind = CXIdxEntity_ObjCCategory; break;
+ EntityInfo.kind = CXIdxEntity_ObjCCategory;
+ EntityInfo.lang = CXIdxEntityLang_ObjC;
+ break;
case Decl::ObjCMethod:
if (cast<ObjCMethodDecl>(D)->isInstanceMethod())
EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod;
else
EntityInfo.kind = CXIdxEntity_ObjCClassMethod;
+ EntityInfo.lang = CXIdxEntityLang_ObjC;
break;
case Decl::ObjCProperty:
- EntityInfo.kind = CXIdxEntity_ObjCProperty; break;
+ EntityInfo.kind = CXIdxEntity_ObjCProperty;
+ EntityInfo.lang = CXIdxEntityLang_ObjC;
+ break;
case Decl::ObjCIvar:
- EntityInfo.kind = CXIdxEntity_ObjCIvar; break;
+ EntityInfo.kind = CXIdxEntity_ObjCIvar;
+ EntityInfo.lang = CXIdxEntityLang_ObjC;
+ break;
case Decl::Namespace:
- EntityInfo.kind = CXIdxEntity_CXXNamespace; break;
+ EntityInfo.kind = CXIdxEntity_CXXNamespace;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
case Decl::NamespaceAlias:
- EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias; break;
+ EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
case Decl::CXXConstructor:
- EntityInfo.kind = CXIdxEntity_CXXConstructor; break;
+ EntityInfo.kind = CXIdxEntity_CXXConstructor;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
case Decl::CXXDestructor:
- EntityInfo.kind = CXIdxEntity_CXXDestructor; break;
+ EntityInfo.kind = CXIdxEntity_CXXDestructor;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
case Decl::CXXConversion:
- EntityInfo.kind = CXIdxEntity_CXXConversionFunction; break;
+ EntityInfo.kind = CXIdxEntity_CXXConversionFunction;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
case Decl::CXXMethod: {
const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
if (MD->isStatic())
EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
else
EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
break;
}
case Decl::ClassTemplate:
@@ -813,7 +844,9 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
EntityInfo.templateKind = CXIdxEntity_Template;
break;
case Decl::TypeAlias:
- EntityInfo.kind = CXIdxEntity_CXXTypeAlias; break;
+ EntityInfo.kind = CXIdxEntity_CXXTypeAlias;
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+ break;
default:
break;
}
@@ -828,6 +861,9 @@ void IndexingContext::getEntityInfo(const NamedDecl *D,
EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
}
+ if (EntityInfo.templateKind != CXIdxEntity_NonTemplate)
+ EntityInfo.lang = CXIdxEntityLang_CXX;
+
if (IdentifierInfo *II = D->getIdentifier()) {
EntityInfo.name = SA.toCStr(II->getName());