diff options
Diffstat (limited to 'clang/tools')
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 21 | ||||
-rw-r--r-- | clang/tools/libclang/CXType.cpp | 34 | ||||
-rw-r--r-- | clang/tools/libclang/libclang.exports | 2 |
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 |