logic: implemented recording template variable specialization edges

This commit is contained in:
mlangkabel
2017-12-04 15:39:44 +01:00
parent 3e59dd5396
commit b02596ddfa
5 changed files with 30 additions and 0 deletions
@@ -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)
@@ -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);
@@ -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) {}
@@ -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<clang::VarTemplateDecl*, clang::VarTemplatePartialSpecializationDecl*> pu = d->getSpecializedTemplateOrPartial();
if (pu.is<clang::VarTemplateDecl*>())
{
specializedFromDecl = pu.get<clang::VarTemplateDecl*>();
}
else if (pu.is<clang::VarTemplatePartialSpecializationDecl*>())
{
specializedFromDecl = pu.get<clang::VarTemplatePartialSpecializationDecl*>();
}
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))
@@ -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);