data: handling nested type names

* Implemented recursive handling of nested names in CxxTypeNameResolver. For example used when resolving names of dependent template parameters.
This commit is contained in:
malte_langkabel
2015-09-26 19:18:07 +02:00
parent ae27d8025b
commit 27ed5a0635
4 changed files with 83 additions and 34 deletions
+27
View File
@@ -6,3 +6,30 @@ public:
{
}
};
template <typename T>
class Fooo
{
public:
void bar()
{
}
};
template <typename T, typename T::a::type U>
class Foooo1
{
public:
void bar()
{
}
};
template <typename T, typename T::type U>
class Foooo2
{
public:
void bar()
{
}
};
+9
View File
@@ -1,7 +1,16 @@
#include "header.h"
#include <vector>
int main()
{
std::vector<Fooo<int>> yay;
for (Fooo<int> a: yay)
{
a;
}
Foo<true, int, float> ft;
ft.bar();
return 0;
@@ -165,41 +165,8 @@ std::shared_ptr<DataType> CxxTypeNameResolver::typeToDataType(const clang::Type*
case clang::Type::DependentName:
{
const clang::DependentNameType* dependentNameType = clang::dyn_cast<clang::DependentNameType>(type);
clang::NestedNameSpecifier* nns = dependentNameType->getQualifier();
clang::NestedNameSpecifier::SpecifierKind nnsKind = nns->getKind();
NameHierarchy typeNameHerarchy;
switch (nnsKind)
{
case clang::NestedNameSpecifier::Identifier:
typeNameHerarchy.push(std::make_shared<NameElement>(nns->getAsIdentifier()->getName())); // TODO: Test this one.
break;
case clang::NestedNameSpecifier::Namespace:
{
CxxDeclNameResolver declNameResolver(nns->getAsNamespace(), getIgnoredContextDecls());
typeNameHerarchy = declNameResolver.getDeclNameHierarchy();
}
break;
case clang::NestedNameSpecifier::NamespaceAlias:
{
CxxDeclNameResolver declNameResolver(nns->getAsNamespaceAlias(), getIgnoredContextDecls());
typeNameHerarchy = declNameResolver.getDeclNameHierarchy();
}
break;
case clang::NestedNameSpecifier::TypeSpec:
case clang::NestedNameSpecifier::TypeSpecWithTemplate:
typeNameHerarchy = typeToDataType(nns->getAsType())->getTypeNameHierarchy();
break;
case clang::NestedNameSpecifier::Global:
// no context name hierarchy needed.
break;
case clang::NestedNameSpecifier::Super:
{
CxxDeclNameResolver declNameResolver(nns->getAsRecordDecl(), getIgnoredContextDecls());
typeNameHerarchy = declNameResolver.getDeclNameHierarchy();
}
break;
}
NameHierarchy typeNameHerarchy = getNameHierarchy( dependentNameType->getQualifier());
typeNameHerarchy.push(std::make_shared<NameElement>(dependentNameType->getIdentifier()->getName().str()));
dataType = std::make_shared<NamedDataType>(typeNameHerarchy);
@@ -226,3 +193,48 @@ std::shared_ptr<DataType> CxxTypeNameResolver::typeToDataType(const clang::Type*
}
return dataType;
}
NameHierarchy CxxTypeNameResolver::getNameHierarchy(const clang::NestedNameSpecifier* nestedNameSpecifier)
{
clang::NestedNameSpecifier::SpecifierKind nnsKind = nestedNameSpecifier->getKind();
NameHierarchy typeNameHerarchy;
switch (nnsKind)
{
case clang::NestedNameSpecifier::Identifier:
{
const clang::NestedNameSpecifier* prefix = nestedNameSpecifier->getPrefix();
if (prefix)
{
typeNameHerarchy = getNameHierarchy(prefix);
}
typeNameHerarchy.push(std::make_shared<NameElement>(nestedNameSpecifier->getAsIdentifier()->getName()));
}
break;
case clang::NestedNameSpecifier::Namespace:
{
CxxDeclNameResolver declNameResolver(nestedNameSpecifier->getAsNamespace(), getIgnoredContextDecls());
typeNameHerarchy = declNameResolver.getDeclNameHierarchy();
}
break;
case clang::NestedNameSpecifier::NamespaceAlias:
{
CxxDeclNameResolver declNameResolver(nestedNameSpecifier->getAsNamespaceAlias(), getIgnoredContextDecls());
typeNameHerarchy = declNameResolver.getDeclNameHierarchy();
}
break;
case clang::NestedNameSpecifier::TypeSpec:
case clang::NestedNameSpecifier::TypeSpecWithTemplate:
typeNameHerarchy = typeToDataType(nestedNameSpecifier->getAsType())->getTypeNameHierarchy();
break;
case clang::NestedNameSpecifier::Global:
// no context name hierarchy needed.
break;
case clang::NestedNameSpecifier::Super:
{
CxxDeclNameResolver declNameResolver(nestedNameSpecifier->getAsRecordDecl(), getIgnoredContextDecls());
typeNameHerarchy = declNameResolver.getDeclNameHierarchy();
}
break;
}
return typeNameHerarchy;
}
@@ -15,6 +15,7 @@ public:
private:
std::shared_ptr<DataType> typeToDataType(const clang::Type* type);
NameHierarchy getNameHierarchy(const clang::NestedNameSpecifier* nestedNameSpecifier);
};
#endif // CXX_TYPE_NAME_RESOLVER_H