logic: template fixes

* omit recording usage of template argument for global scope
* use name of templated decl if specialization has dependend argument types
This commit is contained in:
mlangkabel
2019-10-18 13:05:28 +02:00
committed by Eberhard Graether
parent 5a18d0973e
commit 04bda70b3c
2 changed files with 51 additions and 16 deletions
@@ -115,8 +115,7 @@ void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang
);
{
const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(1);
if (namedContextDecl)
if (const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(1))
{
m_client->recordReference(
REFERENCE_TYPE_USAGE,
@@ -524,11 +523,13 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl)
{
const clang::TemplateSpecializationTypeLoc& tstl = tl.castAs<clang::TemplateSpecializationTypeLoc>();
const clang::TemplateSpecializationType* tst = tstl.getTypePtr();
if (tst->getTemplateName().isDependent())
const clang::TemplateName tln = tst->getTemplateName();
clang::TemplateName::NameKind nknk = tln.getKind();
if (tln.isDependent()) // e.g. T<int> where the template name T depends on a template parameter
{
clang::TemplateDecl* d = tst->getTemplateName().getAsTemplateDecl();
m_client->recordLocalSymbol(getLocalSymbolName(d->getLocation()), getParseLocation(tl.getBeginLoc()));
return; // TODO: skip recording template arg in parent scope
return;
}
}
@@ -562,12 +563,15 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl)
if (getAstVisitor()->getComponent<CxxAstVisitorComponentTypeRefKind>()->isTraversingTemplateArgument())
{
m_client->recordReference(
REFERENCE_TYPE_USAGE,
symbolId,
getOrCreateSymbolId(getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(2)), // we use the closest named decl here
parseLocation
);
if (const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(2))
{
m_client->recordReference(
REFERENCE_TYPE_USAGE,
symbolId,
getOrCreateSymbolId(namedContextDecl), // we use the closest named decl here
parseLocation
);
}
}
}
}
@@ -156,13 +156,25 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getDeclName(const clang::Named
)
);
}
else if (clang::isa<clang::ClassTemplateSpecializationDecl>(declaration))
else if (const clang::ClassTemplateSpecializationDecl* templateSpecialitarionDecl = clang::dyn_cast_or_null<clang::ClassTemplateSpecializationDecl>(declaration))
{
std::vector<std::wstring> templateArguments;
const clang::TemplateArgumentList& templateArgumentList =
clang::dyn_cast<clang::ClassTemplateSpecializationDecl>(declaration)->getTemplateArgs();
const clang::TemplateArgumentList& templateArgumentList = templateSpecialitarionDecl->getTemplateArgs();
for (size_t i = 0; i < templateArgumentList.size(); i++)
{
if (templateArgumentList.get(i).isDependent())
{
llvm::PointerUnion<clang::ClassTemplateDecl*, clang::ClassTemplatePartialSpecializationDecl*> pu = templateSpecialitarionDecl->getSpecializedTemplateOrPartial();
if (pu.is<clang::ClassTemplateDecl*>())
{
return getDeclName(pu.get<clang::ClassTemplateDecl*>());
}
else if (pu.is<clang::ClassTemplatePartialSpecializationDecl*>())
{
return getDeclName(pu.get<clang::ClassTemplatePartialSpecializationDecl*>());
}
}
templateArguments.push_back(getTemplateArgumentName(templateArgumentList.get(i)));
}
return std::make_unique<CxxDeclName>(std::move(declNameString), std::move(templateArguments));
@@ -194,6 +206,13 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getDeclName(const clang::Named
for (size_t i = 0; i < templateArgumentList->size(); i++)
{
const clang::TemplateArgument& templateArgument = templateArgumentList->get(i);
if (templateArgument.isDependent())
{
if (clang::FunctionTemplateDecl* templateFunctionDeclaration = functionDecl->getPrimaryTemplate())
{
return getDeclName(templateFunctionDeclaration);
}
}
templateArguments.push_back(getTemplateArgumentName(templateArgument));
}
}
@@ -337,12 +356,24 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getDeclName(const clang::Named
}
else if (clang::isa<clang::VarTemplateSpecializationDecl>(declaration))
{
const clang::VarTemplateSpecializationDecl* templateSpecializationDeclaration =
clang::dyn_cast_or_null<clang::VarTemplateSpecializationDecl>(varDecl);
const clang::VarTemplateSpecializationDecl* templateSpecializationDeclaration = clang::dyn_cast_or_null<clang::VarTemplateSpecializationDecl>(varDecl);
const clang::TemplateArgumentList& templateArgumentList = templateSpecializationDeclaration->getTemplateArgs();
for (size_t i = 0; i < templateArgumentList.size(); i++)
{
templateParameterNames.push_back(getTemplateArgumentName(templateArgumentList.get(i)));
const clang::TemplateArgument& templateArgument = templateArgumentList.get(i);
if (templateArgument.isDependent())
{
llvm::PointerUnion<clang::VarTemplateDecl*, clang::VarTemplatePartialSpecializationDecl*> pu = templateSpecializationDeclaration->getSpecializedTemplateOrPartial();
if (pu.is<clang::VarTemplateDecl*>())
{
return getDeclName(pu.get<clang::VarTemplateDecl*>());
}
else if (pu.is<clang::VarTemplatePartialSpecializationDecl*>())
{
return getDeclName(pu.get<clang::VarTemplatePartialSpecializationDecl*>());
}
}
templateParameterNames.push_back(getTemplateArgumentName(templateArgument));
}
}