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(FunctionDecl)
|
||||||
DEF_VISIT_TYPE_PTR(CXXMethodDecl)
|
DEF_VISIT_TYPE_PTR(CXXMethodDecl)
|
||||||
DEF_VISIT_TYPE_PTR(VarDecl)
|
DEF_VISIT_TYPE_PTR(VarDecl)
|
||||||
|
DEF_VISIT_TYPE_PTR(VarTemplateSpecializationDecl)
|
||||||
DEF_VISIT_TYPE_PTR(FieldDecl)
|
DEF_VISIT_TYPE_PTR(FieldDecl)
|
||||||
DEF_VISIT_TYPE_PTR(TypedefDecl)
|
DEF_VISIT_TYPE_PTR(TypedefDecl)
|
||||||
DEF_VISIT_TYPE_PTR(TypeAliasDecl)
|
DEF_VISIT_TYPE_PTR(TypeAliasDecl)
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ public:
|
|||||||
virtual bool VisitFunctionDecl(clang::FunctionDecl* d);
|
virtual bool VisitFunctionDecl(clang::FunctionDecl* d);
|
||||||
virtual bool VisitCXXMethodDecl(clang::CXXMethodDecl* d);
|
virtual bool VisitCXXMethodDecl(clang::CXXMethodDecl* d);
|
||||||
virtual bool VisitVarDecl(clang::VarDecl* d);
|
virtual bool VisitVarDecl(clang::VarDecl* d);
|
||||||
|
virtual bool VisitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d);
|
||||||
virtual bool VisitFieldDecl(clang::FieldDecl* d);
|
virtual bool VisitFieldDecl(clang::FieldDecl* d);
|
||||||
virtual bool VisitTypedefDecl(clang::TypedefDecl* d);
|
virtual bool VisitTypedefDecl(clang::TypedefDecl* d);
|
||||||
virtual bool VisitTypeAliasDecl(clang::TypeAliasDecl* d);
|
virtual bool VisitTypeAliasDecl(clang::TypeAliasDecl* d);
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ DEF_TRAVERSE_TYPE_PTR(CXXTemporaryObjectExpr)
|
|||||||
virtual void visitTagDecl(clang::TagDecl* d) {}
|
virtual void visitTagDecl(clang::TagDecl* d) {}
|
||||||
virtual void visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d) {}
|
virtual void visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d) {}
|
||||||
virtual void visitVarDecl(clang::VarDecl* d) {}
|
virtual void visitVarDecl(clang::VarDecl* d) {}
|
||||||
|
virtual void visitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d) {}
|
||||||
virtual void visitFieldDecl(clang::FieldDecl* d) {}
|
virtual void visitFieldDecl(clang::FieldDecl* d) {}
|
||||||
virtual void visitFunctionDecl(clang::FunctionDecl* d) {}
|
virtual void visitFunctionDecl(clang::FunctionDecl* d) {}
|
||||||
virtual void visitCXXMethodDecl(clang::CXXMethodDecl* 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)
|
void CxxAstVisitorComponentIndexer::visitFieldDecl(clang::FieldDecl* d)
|
||||||
{
|
{
|
||||||
if (shouldVisitDecl(d))
|
if (shouldVisitDecl(d))
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public:
|
|||||||
virtual void visitTagDecl(clang::TagDecl* d);
|
virtual void visitTagDecl(clang::TagDecl* d);
|
||||||
virtual void visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d);
|
virtual void visitClassTemplateSpecializationDecl(clang::ClassTemplateSpecializationDecl* d);
|
||||||
virtual void visitVarDecl(clang::VarDecl* d);
|
virtual void visitVarDecl(clang::VarDecl* d);
|
||||||
|
virtual void visitVarTemplateSpecializationDecl(clang::VarTemplateSpecializationDecl* d);
|
||||||
virtual void visitFieldDecl(clang::FieldDecl* d);
|
virtual void visitFieldDecl(clang::FieldDecl* d);
|
||||||
virtual void visitFunctionDecl(clang::FunctionDecl* d);
|
virtual void visitFunctionDecl(clang::FunctionDecl* d);
|
||||||
virtual void visitCXXMethodDecl(clang::CXXMethodDecl* d);
|
virtual void visitCXXMethodDecl(clang::CXXMethodDecl* d);
|
||||||
|
|||||||
Reference in New Issue
Block a user