Add libclang support for class template partial specializations,
including a cursor kind, visitation, and USRs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112629 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/libclang/CIndexUSRs.cpp b/tools/libclang/CIndexUSRs.cpp
index b397f1e..6705076 100644
--- a/tools/libclang/CIndexUSRs.cpp
+++ b/tools/libclang/CIndexUSRs.cpp
@@ -366,21 +366,33 @@
D = D->getCanonicalDecl();
VisitDeclContext(D->getDeclContext());
- bool IsTemplate = false;
- if (CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D))
+ bool AlreadyStarted = false;
+ if (CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(D)) {
if (ClassTemplateDecl *ClassTmpl = CXXRecord->getDescribedClassTemplate()) {
- IsTemplate = true;
+ AlreadyStarted = true;
switch (D->getTagKind()) {
- case TTK_Struct: Out << "@ST"; break;
- case TTK_Class: Out << "@CT"; break;
- case TTK_Union: Out << "@UT"; break;
- case TTK_Enum: llvm_unreachable("enum template");
+ case TTK_Struct: Out << "@ST"; break;
+ case TTK_Class: Out << "@CT"; break;
+ case TTK_Union: Out << "@UT"; break;
+ case TTK_Enum: llvm_unreachable("enum template"); break;
}
VisitTemplateParameterList(ClassTmpl->getTemplateParameters());
+ } else if (ClassTemplatePartialSpecializationDecl *PartialSpec
+ = dyn_cast<ClassTemplatePartialSpecializationDecl>(CXXRecord)) {
+ AlreadyStarted = true;
+
+ switch (D->getTagKind()) {
+ case TTK_Struct: Out << "@SP"; break;
+ case TTK_Class: Out << "@CP"; break;
+ case TTK_Union: Out << "@UP"; break;
+ case TTK_Enum: llvm_unreachable("enum partial specialization"); break;
+ }
+ VisitTemplateParameterList(PartialSpec->getTemplateParameters());
}
+ }
- if (!IsTemplate) {
+ if (!AlreadyStarted) {
switch (D->getTagKind()) {
case TTK_Struct: Out << "@S"; break;
case TTK_Class: Out << "@C"; break;