diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-08-31 22:12:17 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-08-31 22:12:17 +0000 |
commit | f11309e1943782d323f195c06824a486982e3340 (patch) | |
tree | a9abcb75471da769bbf5469ffbf292db9304bb4f /clang/tools/libclang/CIndexCXX.cpp | |
parent | d657d8259778129bd43393a2d65c4eb029e9eb82 (diff) | |
download | bcm5719-llvm-f11309e1943782d323f195c06824a486982e3340.tar.gz bcm5719-llvm-f11309e1943782d323f195c06824a486982e3340.zip |
Add a new libclang function clang_getTemplateCursorKind(), which
determines the kind of declaration that would be generated if the
given template were instantiated. This allows a client to distinguish
among class/struct/union templates and function/member function/static
member function templates.
Also, teach clang_CXXMethod_isStatic() about function templates.
llvm-svn: 112655
Diffstat (limited to 'clang/tools/libclang/CIndexCXX.cpp')
-rw-r--r-- | clang/tools/libclang/CIndexCXX.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/clang/tools/libclang/CIndexCXX.cpp b/clang/tools/libclang/CIndexCXX.cpp index a168f160451..ee83f98722f 100644 --- a/clang/tools/libclang/CIndexCXX.cpp +++ b/clang/tools/libclang/CIndexCXX.cpp @@ -15,6 +15,7 @@ #include "CXCursor.h" #include "CXType.h" #include "clang/AST/DeclCXX.h" +#include "clang/AST/DeclTemplate.h" using namespace clang; using namespace clang::cxstring; @@ -45,4 +46,36 @@ enum CX_CXXAccessSpecifier clang_getCXXAccessSpecifier(CXCursor C) { return CX_CXXInvalidAccessSpecifier; } +enum CXCursorKind clang_getTemplateCursorKind(CXCursor C) { + using namespace clang::cxcursor; + + switch (C.kind) { + case CXCursor_ClassTemplate: + case CXCursor_FunctionTemplate: + if (TemplateDecl *Template + = dyn_cast_or_null<TemplateDecl>(getCursorDecl(C))) + return MakeCXCursor(Template->getTemplatedDecl(), + getCursorASTUnit(C)).kind; + break; + + case CXCursor_ClassTemplatePartialSpecialization: + if (ClassTemplateSpecializationDecl *PartialSpec + = dyn_cast_or_null<ClassTemplatePartialSpecializationDecl>( + getCursorDecl(C))) { + switch (PartialSpec->getTagKind()) { + case TTK_Class: return CXCursor_ClassDecl; + case TTK_Struct: return CXCursor_StructDecl; + case TTK_Union: return CXCursor_UnionDecl; + case TTK_Enum: return CXCursor_NoDeclFound; + } + } + break; + + default: + break; + } + + return CXCursor_NoDeclFound; +} + } // end extern "C" |