logic: skip recording qualifier of template parameter decl name (e.g."A<typename T>::T" -> "T")

This commit is contained in:
mlangkabel
2019-10-18 13:05:28 +02:00
committed by Eberhard Graether
parent 517dde06e4
commit 0498d68f5b
21 changed files with 1956 additions and 2029 deletions
@@ -61,83 +61,10 @@ std::unique_ptr<CxxDeclName> CxxDeclNameResolver::getName(const clang::NamedDecl
declName->setParent(CxxSpecifierNameResolver(this).getName(usingDecl->getQualifier()));
}
else if (
clang::isa<clang::TemplateTypeParmDecl>(declaration) ||
clang::isa<clang::NonTypeTemplateParmDecl>(declaration) ||
clang::isa<clang::TemplateTemplateParmDecl>(declaration)
) {
clang::ASTContext::DynTypedNodeList parents = declaration->getASTContext().getParents(*declaration);
for (const clang::ast_type_traits::DynTypedNode* parent = parents.begin(); parent != parents.end(); parent++)
{
bool foundParent = false;
const clang::Decl* parentDecl = parent->get<clang::Decl>();
while (parentDecl != nullptr)
{
parentDecl = utility::getFirstDecl(parentDecl);
if (clang::isa<clang::TemplateDecl>(parentDecl))
{
const clang::TemplateDecl* parentTemplateDecl = clang::dyn_cast_or_null<clang::TemplateDecl>(parentDecl);
if (!ignoresContext(parentTemplateDecl) && !ignoresContext(parentTemplateDecl->getTemplatedDecl()))
{
declName->setParent(getName(parentTemplateDecl));
}
foundParent = true;
break;
}
else if (clang::isa<clang::ClassTemplatePartialSpecializationDecl>(parentDecl))
{
const clang::ClassTemplatePartialSpecializationDecl* parentClassTemplateDecl =
clang::dyn_cast_or_null<clang::ClassTemplatePartialSpecializationDecl>(parentDecl);
if (!ignoresContext(parentDecl))
{
declName->setParent(getName(parentClassTemplateDecl));
}
foundParent = true;
break;
}
else if (clang::isa<clang::VarTemplatePartialSpecializationDecl>(parentDecl))
{
const clang::VarTemplatePartialSpecializationDecl* parentVarTemplateDecl =
clang::dyn_cast_or_null<clang::VarTemplatePartialSpecializationDecl>(parentDecl);
if (!ignoresContext(parentDecl))
{
declName->setParent(getName(parentVarTemplateDecl));
}
foundParent = true;
break;
}
if (const clang::DeclContext* parentDeclContext = parentDecl->getDeclContext())
{
if (ignoresContext(parentDeclContext))
{
foundParent = true;
break;
}
parentDecl = clang::dyn_cast_or_null<clang::Decl>(parentDeclContext);
if (parentDecl)
{
if (clang::TemplateDecl* describedTemplate = parentDecl->getDescribedTemplate())
{
parentDecl = describedTemplate;
}
}
}
else
{
break;
}
}
if (foundParent)
{
// break for the first parent ast node that can be resolved to a parent name (also if it is ignored).
break;
}
}
}
else
!clang::isa<clang::TemplateTypeParmDecl>(declaration) &&
!clang::isa<clang::NonTypeTemplateParmDecl>(declaration) &&
!clang::isa<clang::TemplateTemplateParmDecl>(declaration)
)
{
declName->setParent(getContextName(declaration->getDeclContext()));
}
+7 -7
View File
@@ -2617,7 +2617,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->usages, L"void A<typename T>::foo() -> A<typename T>::T A<typename T>::m_t <8:3 8:5>"
client->usages, L"void A<typename T>::foo() -> T A<typename T>::m_t <8:3 8:5>"
));
}
@@ -3343,7 +3343,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->templateMemberSpecializations, L"int A<int>::foo() -> A<typename T>::T A<typename T>::foo() <5:4 5:6>"
client->templateMemberSpecializations, L"int A<int>::foo() -> T A<typename T>::foo() <5:4 5:6>"
));
}
@@ -3363,7 +3363,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->templateMemberSpecializations, L"static int A<int>::foo -> static A<typename T>::T A<typename T>::foo <5:11 5:13>"
client->templateMemberSpecializations, L"static int A<int>::foo -> static T A<typename T>::foo <5:11 5:13>"
));
}
@@ -3383,7 +3383,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->templateMemberSpecializations, L"int A<int>::foo -> A<typename T>::T A<typename T>::foo <5:4 5:6>"
client->templateMemberSpecializations, L"int A<int>::foo -> T A<typename T>::foo <5:4 5:6>"
));
}
@@ -3406,7 +3406,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->templateMemberSpecializations, L"int A<int>::B::foo -> A<typename T>::T A<typename T>::B::foo <7:5 7:7>"
client->templateMemberSpecializations, L"int A<int>::B::foo -> T A<typename T>::B::foo <7:5 7:7>"
));
}
@@ -3771,7 +3771,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->usages, L"void A<typename T>::A<T>() -> A<typename T>::T A<typename T>::foo <4:7 4:9>"
client->usages, L"void A<typename T>::A<T>() -> T A<typename T>::foo <4:7 4:9>"
));
}
@@ -3790,7 +3790,7 @@ public:
));
TS_ASSERT(utility::containsElement<std::wstring>(
client->methods, L"private A<typename T>::T A<typename T>::foo() <4:2 <4:4 4:6> 4:8>" // TODO: should return type just be "T"?
client->methods, L"private T A<typename T>::foo() <4:2 <4:4 4:6> 4:8>"
));
}