diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-08-31 19:31:58 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-08-31 19:31:58 +0000 |
| commit | f96abb293a4de64a16acb64b273b4e9ae4a14639 (patch) | |
| tree | e3f1598c153102aee1e6a141da6041f9c11cfcce /clang/tools/libclang | |
| parent | 6fdcb172a9df9ba130dc5b0f48dd6b95315a0e5b (diff) | |
| download | bcm5719-llvm-f96abb293a4de64a16acb64b273b4e9ae4a14639.tar.gz bcm5719-llvm-f96abb293a4de64a16acb64b273b4e9ae4a14639.zip | |
Add libclang support for class template partial specializations,
including a cursor kind, visitation, and USRs.
llvm-svn: 112629
Diffstat (limited to 'clang/tools/libclang')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 20 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndexUSRs.cpp | 28 | ||||
| -rw-r--r-- | clang/tools/libclang/CXCursor.cpp | 2 |
3 files changed, 42 insertions, 8 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 919962cfdeb..ae53c16be07 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -290,6 +290,8 @@ public: bool VisitTranslationUnitDecl(TranslationUnitDecl *D); bool VisitTypedefDecl(TypedefDecl *D); bool VisitTagDecl(TagDecl *D); + bool VisitClassTemplatePartialSpecializationDecl( + ClassTemplatePartialSpecializationDecl *D); bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D); bool VisitEnumConstantDecl(EnumConstantDecl *D); bool VisitDeclaratorDecl(DeclaratorDecl *DD); @@ -600,6 +602,22 @@ bool CursorVisitor::VisitTagDecl(TagDecl *D) { return VisitDeclContext(D); } +bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl( + ClassTemplatePartialSpecializationDecl *D) { + // FIXME: Visit the "outer" template parameter lists on the TagDecl + // before visiting these template parameters. + if (VisitTemplateParameters(D->getTemplateParameters())) + return true; + + // Visit the partial specialization arguments. + const TemplateArgumentLoc *TemplateArgs = D->getTemplateArgsAsWritten(); + for (unsigned I = 0, N = D->getNumTemplateArgsAsWritten(); I != N; ++I) + if (VisitTemplateArgumentLoc(TemplateArgs[I])) + return true; + + return VisitCXXRecordDecl(D); +} + bool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { // FIXME: Visit default argument return false; @@ -2144,6 +2162,8 @@ CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { return createCXString("FunctionTemplate"); case CXCursor_ClassTemplate: return createCXString("ClassTemplate"); + case CXCursor_ClassTemplatePartialSpecialization: + return createCXString("ClassTemplatePartialSpecialization"); } llvm_unreachable("Unhandled CXCursorKind"); diff --git a/clang/tools/libclang/CIndexUSRs.cpp b/clang/tools/libclang/CIndexUSRs.cpp index b397f1e0d42..6705076c9f0 100644 --- a/clang/tools/libclang/CIndexUSRs.cpp +++ b/clang/tools/libclang/CIndexUSRs.cpp @@ -366,21 +366,33 @@ void USRGenerator::VisitTagDecl(TagDecl *D) { 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; diff --git a/clang/tools/libclang/CXCursor.cpp b/clang/tools/libclang/CXCursor.cpp index 283c3881574..691ccd5f327 100644 --- a/clang/tools/libclang/CXCursor.cpp +++ b/clang/tools/libclang/CXCursor.cpp @@ -65,6 +65,8 @@ static CXCursorKind GetCursorKind(Decl *D) { case Decl::TemplateTemplateParm:return CXCursor_TemplateTemplateParameter; case Decl::FunctionTemplate: return CXCursor_FunctionTemplate; case Decl::ClassTemplate: return CXCursor_ClassTemplate; + case Decl::ClassTemplatePartialSpecialization: + return CXCursor_ClassTemplatePartialSpecialization; default: if (TagDecl *TD = dyn_cast<TagDecl>(D)) { |

