logic: yield name of templated base for dependent template specialization

This commit is contained in:
mlangkabel
2019-10-18 13:05:28 +02:00
committed by Eberhard Graether
parent ce22e5917a
commit 517dde06e4
11 changed files with 685 additions and 655 deletions
@@ -158,6 +158,14 @@ std::unique_ptr<CxxTypeName> CxxTypeNameResolver::getName(const clang::Type* typ
resolver.ignoreContextDecl(templateSpecializationType->getTemplateName().getAsTemplateDecl()->getTemplatedDecl());
for (size_t i = 0; i < templateSpecializationType->getNumArgs(); i++)
{
if (templateSpecializationType->getArg(i).isDependent())
{
return std::make_unique<CxxTypeName>(
declName->getName(),
declName->getTemplateParameterNames(),
declName->getParent()
);
}
templateArguments.push_back(resolver.getTemplateArgumentName(templateSpecializationType->getArg(i)));
}
+26 -4
View File
@@ -15,6 +15,24 @@
class CxxParserTestSuite: public CxxTest::TestSuite
{
public:
//void test_foofooofooofow()
//{
// std::shared_ptr<TestIntermediateStorage> client = parseCode(
// "template <typename T1, typename T2>\n"
// "class vector { };\n"
// "template<class T>\n"
// "struct Alloc { };\n"
// "template<class T>\n"
// "using Vec = vector<T, Alloc<T>>;\n"
// "Vec<int> v;\n"
// );
// TS_ASSERT(utility::containsElement<std::wstring>(
// client->typeUses, L"B<A, template<typename> typename U> -> A<typename T> <8:9 8:9>"
// ));
//}
void test_cxx_parser_finds_usage_of_field_in_function_call_arguments()
{
std::shared_ptr<TestIntermediateStorage> client = parseCode(
@@ -2657,10 +2675,10 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->typeUses, L"Foo<T> & Foo<typename T>::operator=(const Foo<T> &) -> Foo<T> <4:2 4:4>"
client->typeUses, L"Foo<typename T> & Foo<typename T>::operator=(const Foo<typename T> &) -> Foo<typename T> <4:2 4:4>"
));
TS_ASSERT(utility::containsElement<std::wstring>(
client->typeUses, L"Foo<T> & Foo<typename T>::operator=(const Foo<T> &) -> Foo<T> <4:23 4:25>"
client->typeUses, L"Foo<typename T> & Foo<typename T>::operator=(const Foo<typename T> &) -> Foo<typename T> <4:23 4:25>"
));
}
@@ -2953,7 +2971,7 @@ public:
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->typeUses, L"B<typename U>::type -> A<B<typename U>::U>::type <11:25 11:28>"
client->typeUses, L"B<typename U>::type -> A<typename T>::type <11:25 11:28>"
));
TS_ASSERT(utility::containsElement<std::wstring>(
client->typeUses, L"B<int>::type -> A<int>::type <11:25 11:28>"
@@ -2978,10 +2996,14 @@ public:
"public:\n"
" typedef typename A<U>::template type<float> type;\n"
"};\n"
"B<bool>::type f = 0.0f;\n"
);
TS_ASSERT(utility::containsElement<std::wstring>(
client->typeUses, L"B<typename U>::type -> A<B<typename U>::U>::type<float> <12:10 12:17>"
client->typeUses, L"B<typename U>::type -> A<typename T>::type<float> <12:10 12:17>"
));
TS_ASSERT(utility::containsElement<std::wstring>(
client->typeUses, L"B<bool>::type f -> B<bool>::type <14:10 14:13>"
));
}