]> granicus.if.org Git - clang/commitdiff
Add a new libclang function clang_getTemplateCursorKind(), which
authorDouglas Gregor <dgregor@apple.com>
Tue, 31 Aug 2010 22:12:17 +0000 (22:12 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 31 Aug 2010 22:12:17 +0000 (22:12 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112655 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
tools/libclang/CIndex.cpp
tools/libclang/CIndexCXX.cpp
tools/libclang/libclang.darwin.exports
tools/libclang/libclang.exports

index be02bcf8c394732fb5ff972bd4de52e10a4b5907..404d7aa5140616ac5ab168477044b422e2073072 100644 (file)
@@ -1716,10 +1716,30 @@ CINDEX_LINKAGE unsigned clang_isCursorDefinition(CXCursor);
  */
 
 /**
- * \brief Determine if a C++ member function is declared 'static'.
+ * \brief Determine if a C++ member function or member function template is 
+ * declared 'static'.
  */
 CINDEX_LINKAGE unsigned clang_CXXMethod_isStatic(CXCursor C);
 
+/**
+ * \brief Given a cursor that represents a template, determine
+ * the cursor kind of the specializations would be generated by instantiating
+ * the template.
+ *
+ * This routine can be used to determine what flavor of function template,
+ * class template, or class template partial specialization is stored in the
+ * cursor. For example, it can describe whether a class template cursor is
+ * declared with "struct", "class" or "union".
+ *
+ * \param C The cursor to query. This cursor should represent a template
+ * declaration.
+ *
+ * \returns The cursor kind of the specializations that would be generated
+ * by instantiating the template \p C. If \p C is not a template, returns
+ * \c CXCursor_NoDeclFound.
+ */
+CINDEX_LINKAGE enum CXCursorKind clang_getTemplateCursorKind(CXCursor C);
+  
 /**
  * @}
  */
index 1515ed3c2c6af06d87ea77efd2649ae247b3e2ac..2a7e6e9b0659142281a104f966cc5597b35421b8 100644 (file)
@@ -3322,8 +3322,14 @@ extern "C" {
 unsigned clang_CXXMethod_isStatic(CXCursor C) {
   if (!clang_isDeclaration(C.kind))
     return 0;
-  CXXMethodDecl *D = dyn_cast<CXXMethodDecl>(cxcursor::getCursorDecl(C));
-  return (D && D->isStatic()) ? 1 : 0;
+  
+  CXXMethodDecl *Method = 0;
+  Decl *D = cxcursor::getCursorDecl(C);
+  if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D))
+    Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
+  else
+    Method = dyn_cast_or_null<CXXMethodDecl>(D);
+  return (Method && Method->isStatic()) ? 1 : 0;
 }
 
 } // end: extern "C"
index a168f160451bb3b5638f6b5a59e6ec1e31c464fb..ee83f98722fcacc6a0b1b61e3c349d5751c9b70a 100644 (file)
@@ -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"
index 0d01dd9b28882b4b564d5360c996b5841ae2d4c4..289026510f77133b96eb86a6a56ca33cdd26177e 100644 (file)
@@ -78,6 +78,7 @@ _clang_getRange
 _clang_getRangeEnd
 _clang_getRangeStart
 _clang_getResultType
+_clang_getTemplateCursorKind
 _clang_getTokenExtent
 _clang_getTokenKind
 _clang_getTokenLocation
index 60d335299ecc77581ce83766c1d0cdf6a31f84a1..254ba98a73be6f3d71a6f4ad6d5f2e35561687b4 100644 (file)
@@ -78,6 +78,7 @@ clang_getRange
 clang_getRangeEnd
 clang_getRangeStart
 clang_getResultType
+clang_getTemplateCursorKind
 clang_getTokenExtent
 clang_getTokenKind
 clang_getTokenLocation