diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp index 6e227894..b8b1584b 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.cpp @@ -578,6 +578,7 @@ DEF_VISIT_TYPE_PTR(ClassTemplateSpecializationDecl) DEF_VISIT_TYPE_PTR(FunctionDecl) DEF_VISIT_TYPE_PTR(CXXMethodDecl) DEF_VISIT_TYPE_PTR(VarDecl) +DEF_VISIT_TYPE_PTR(VarTemplateSpecializationDecl) DEF_VISIT_TYPE_PTR(FieldDecl) DEF_VISIT_TYPE_PTR(TypedefDecl) DEF_VISIT_TYPE_PTR(TypeAliasDecl) diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h index b280ab74..b5cefd2c 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitor.h @@ -117,6 +117,7 @@ public: virtual bool VisitFunctionDecl(clang::FunctionDecl* d); virtual bool VisitCXXMethodDecl(clang::CXXMethodDecl* d); virtual bool VisitVarDecl(clang::VarDecl* d); + virtual bool VisitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d); virtual bool VisitFieldDecl(clang::FieldDecl* d); virtual bool VisitTypedefDecl(clang::TypedefDecl* d); virtual bool VisitTypeAliasDecl(clang::TypeAliasDecl* d); diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h index 449dc140..0e7c3a13 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponent.h @@ -89,6 +89,7 @@ DEF_TRAVERSE_TYPE_PTR(CXXTemporaryObjectExpr) virtual void visitTagDecl(clang::TagDecl* d) {} virtual void visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d) {} virtual void visitVarDecl(clang::VarDecl* d) {} + virtual void visitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d) {} virtual void visitFieldDecl(clang::FieldDecl* d) {} virtual void visitFunctionDecl(clang::FunctionDecl* d) {} virtual void visitCXXMethodDecl(clang::CXXMethodDecl* d) {} diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp index 9e6a46bd..325e2343 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.cpp @@ -261,6 +261,32 @@ void CxxAstVisitorComponentIndexer::visitVarDecl(clang::VarDecl* d) } } +void CxxAstVisitorComponentIndexer::visitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d) +{ + if (shouldVisitDecl(d)) + { + clang::NamedDecl* specializedFromDecl; + + // todo: use context and childcontext!! + llvm::PointerUnion pu = d->getSpecializedTemplateOrPartial(); + if (pu.is()) + { + specializedFromDecl = pu.get(); + } + else if (pu.is()) + { + specializedFromDecl = pu.get(); + } + + m_client->recordReference( + REFERENCE_TEMPLATE_SPECIALIZATION, + getAstVisitor()->getDeclNameCache()->getValue(specializedFromDecl), + getAstVisitor()->getDeclNameCache()->getValue(d), + getParseLocation(d->getLocation()) + ); + } +} + void CxxAstVisitorComponentIndexer::visitFieldDecl(clang::FieldDecl* d) { if (shouldVisitDecl(d)) diff --git a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h index ac7c474f..c0303d3b 100644 --- a/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h +++ b/src/lib_cxx/data/parser/cxx/CxxAstVisitorComponentIndexer.h @@ -22,6 +22,7 @@ public: virtual void visitTagDecl(clang::TagDecl* d); virtual void visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d); virtual void visitVarDecl(clang::VarDecl* d); + virtual void visitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d); virtual void visitFieldDecl(clang::FieldDecl* d); virtual void visitFunctionDecl(clang::FunctionDecl* d); virtual void visitCXXMethodDecl(clang::CXXMethodDecl* d);