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:
committed by
Eberhard Graether
parent
5a18d0973e
commit
04bda70b3c
@@ -115,8 +115,7 @@ void CxxAstVisitorComponentIndexer::beginTraverseTemplateArgumentLoc(const clang
|
|||||||
);
|
);
|
||||||
|
|
||||||
{
|
{
|
||||||
const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(1);
|
if (const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(1))
|
||||||
if (namedContextDecl)
|
|
||||||
{
|
{
|
||||||
m_client->recordReference(
|
m_client->recordReference(
|
||||||
REFERENCE_TYPE_USAGE,
|
REFERENCE_TYPE_USAGE,
|
||||||
@@ -524,11 +523,13 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl)
|
|||||||
{
|
{
|
||||||
const clang::TemplateSpecializationTypeLoc& tstl = tl.castAs<clang::TemplateSpecializationTypeLoc>();
|
const clang::TemplateSpecializationTypeLoc& tstl = tl.castAs<clang::TemplateSpecializationTypeLoc>();
|
||||||
const clang::TemplateSpecializationType* tst = tstl.getTypePtr();
|
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();
|
clang::TemplateDecl* d = tst->getTemplateName().getAsTemplateDecl();
|
||||||
m_client->recordLocalSymbol(getLocalSymbolName(d->getLocation()), getParseLocation(tl.getBeginLoc()));
|
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())
|
if (getAstVisitor()->getComponent<CxxAstVisitorComponentTypeRefKind>()->isTraversingTemplateArgument())
|
||||||
{
|
{
|
||||||
m_client->recordReference(
|
if (const clang::NamedDecl* namedContextDecl = getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(2))
|
||||||
REFERENCE_TYPE_USAGE,
|
{
|
||||||
symbolId,
|
m_client->recordReference(
|
||||||
getOrCreateSymbolId(getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl(2)), // we use the closest named decl here
|
REFERENCE_TYPE_USAGE,
|
||||||
parseLocation
|
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;
|
std::vector<std::wstring> templateArguments;
|
||||||
const clang::TemplateArgumentList& templateArgumentList =
|
const clang::TemplateArgumentList& templateArgumentList = templateSpecialitarionDecl->getTemplateArgs();
|
||||||
clang::dyn_cast<clang::ClassTemplateSpecializationDecl>(declaration)->getTemplateArgs();
|
|
||||||
for (size_t i = 0; i < templateArgumentList.size(); i++)
|
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)));
|
templateArguments.push_back(getTemplateArgumentName(templateArgumentList.get(i)));
|
||||||
}
|
}
|
||||||
return std::make_unique<CxxDeclName>(std::move(declNameString), std::move(templateArguments));
|
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++)
|
for (size_t i = 0; i < templateArgumentList->size(); i++)
|
||||||
{
|
{
|
||||||
const clang::TemplateArgument& templateArgument = templateArgumentList->get(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));
|
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))
|
else if (clang::isa<clang::VarTemplateSpecializationDecl>(declaration))
|
||||||
{
|
{
|
||||||
const clang::VarTemplateSpecializationDecl* templateSpecializationDeclaration =
|
const clang::VarTemplateSpecializationDecl* templateSpecializationDeclaration = clang::dyn_cast_or_null<clang::VarTemplateSpecializationDecl>(varDecl);
|
||||||
clang::dyn_cast_or_null<clang::VarTemplateSpecializationDecl>(varDecl);
|
|
||||||
const clang::TemplateArgumentList& templateArgumentList = templateSpecializationDeclaration->getTemplateArgs();
|
const clang::TemplateArgumentList& templateArgumentList = templateSpecializationDeclaration->getTemplateArgs();
|
||||||
for (size_t i = 0; i < templateArgumentList.size(); i++)
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user