summaryrefslogtreecommitdiffstats
path: root/clang/tools
diff options
context:
space:
mode:
Diffstat (limited to 'clang/tools')
-rw-r--r--clang/tools/c-index-test/c-index-test.c21
-rw-r--r--clang/tools/libclang/CXType.cpp34
-rw-r--r--clang/tools/libclang/libclang.exports2
3 files changed, 54 insertions, 3 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c
index 3a47ae4badd..defc9168193 100644
--- a/clang/tools/c-index-test/c-index-test.c
+++ b/clang/tools/c-index-test/c-index-test.c
@@ -1263,11 +1263,11 @@ static enum CXChildVisitResult PrintType(CXCursor cursor, CXCursor p,
}
/* Print the argument types if they exist. */
{
- int numArgs = clang_Cursor_getNumArguments(cursor);
- if (numArgs != -1 && numArgs != 0) {
+ int NumArgs = clang_Cursor_getNumArguments(cursor);
+ if (NumArgs != -1 && NumArgs != 0) {
int i;
printf(" [args=");
- for (i = 0; i < numArgs; ++i) {
+ for (i = 0; i < NumArgs; ++i) {
CXType T = clang_getCursorType(clang_Cursor_getArgument(cursor, i));
if (T.kind != CXType_Invalid) {
PrintTypeAndTypeKind(T, " [%s] [%s]");
@@ -1276,6 +1276,21 @@ static enum CXChildVisitResult PrintType(CXCursor cursor, CXCursor p,
printf("]");
}
}
+ /* Print the template argument types if they exist. */
+ {
+ int NumTArgs = clang_Type_getNumTemplateArguments(T);
+ if (NumTArgs != -1 && NumTArgs != 0) {
+ int i;
+ printf(" [templateargs/%d=", NumTArgs);
+ for (i = 0; i < NumTArgs; ++i) {
+ CXType TArg = clang_Type_getTemplateArgumentAsType(T, i);
+ if (TArg.kind != CXType_Invalid) {
+ PrintTypeAndTypeKind(TArg, " [type=%s] [typekind=%s]");
+ }
+ }
+ printf("]");
+ }
+ }
/* Print if this is a non-POD type. */
printf(" [isPOD=%d]", clang_isPODType(T));
diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp
index d31168c1e75..545b56dedae 100644
--- a/clang/tools/libclang/CXType.cpp
+++ b/clang/tools/libclang/CXType.cpp
@@ -871,4 +871,38 @@ CXString clang_getDeclObjCTypeEncoding(CXCursor C) {
return cxstring::createDup(encoding);
}
+int clang_Type_getNumTemplateArguments(CXType CT) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return -1;
+ const CXXRecordDecl *RecordDecl = T->getAsCXXRecordDecl();
+ if (!RecordDecl)
+ return -1;
+ const ClassTemplateSpecializationDecl *TemplateDecl =
+ dyn_cast<ClassTemplateSpecializationDecl>(RecordDecl);
+ if (!TemplateDecl)
+ return -1;
+ return TemplateDecl->getTemplateArgs().size();
+}
+
+CXType clang_Type_getTemplateArgumentAsType(CXType CT, unsigned i) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return MakeCXType(QualType(), GetTU(CT));
+ const CXXRecordDecl *RecordDecl = T->getAsCXXRecordDecl();
+ if (!RecordDecl)
+ return MakeCXType(QualType(), GetTU(CT));
+ const ClassTemplateSpecializationDecl *TemplateDecl =
+ dyn_cast<ClassTemplateSpecializationDecl>(RecordDecl);
+ if (!TemplateDecl)
+ return MakeCXType(QualType(), GetTU(CT));
+ const TemplateArgumentList &TA = TemplateDecl->getTemplateArgs();
+ if (TA.size() <= i)
+ return MakeCXType(QualType(), GetTU(CT));
+ const TemplateArgument &A = TA.get(i);
+ if (A.getKind() != TemplateArgument::Type)
+ return MakeCXType(QualType(), GetTU(CT));
+ return MakeCXType(A.getAsType(), GetTU(CT));
+}
+
} // end: extern "C"
diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports
index 5fbd9a24685..dfee253ba1c 100644
--- a/clang/tools/libclang/libclang.exports
+++ b/clang/tools/libclang/libclang.exports
@@ -64,6 +64,8 @@ clang_Type_getAlignOf
clang_Type_getClassType
clang_Type_getSizeOf
clang_Type_getOffsetOf
+clang_Type_getNumTemplateArguments
+clang_Type_getTemplateArgumentAsType
clang_Type_getCXXRefQualifier
clang_VerbatimBlockLineComment_getText
clang_VerbatimLineComment_getText
OpenPOWER on IntegriCloud