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;