logic: implemented recording template variable specialization edges
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user