From 27ed5a06356c8b12ec15341b4ba28e4018c4bbd9 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Sat, 26 Sep 2015 19:18:07 +0200 Subject: [PATCH] data: handling nested type names * Implemented recursive handling of nested names in CxxTypeNameResolver. For example used when resolving names of dependent template parameters. --- bin/app/data/src/test2/header.h | 27 +++++++ bin/app/data/src/test2/main.cpp | 9 +++ .../cxx/name_resolver/CxxTypeNameResolver.cpp | 80 +++++++++++-------- .../cxx/name_resolver/CxxTypeNameResolver.h | 1 + 4 files changed, 83 insertions(+), 34 deletions(-) diff --git a/bin/app/data/src/test2/header.h b/bin/app/data/src/test2/header.h index 1f5ea562..767cbede 100644 --- a/bin/app/data/src/test2/header.h +++ b/bin/app/data/src/test2/header.h @@ -6,3 +6,30 @@ public: { } }; + +template +class Fooo +{ +public: + void bar() + { + } +}; + +template +class Foooo1 +{ +public: + void bar() + { + } +}; + +template +class Foooo2 +{ +public: + void bar() + { + } +}; diff --git a/bin/app/data/src/test2/main.cpp b/bin/app/data/src/test2/main.cpp index b819ac7e..cc49a049 100644 --- a/bin/app/data/src/test2/main.cpp +++ b/bin/app/data/src/test2/main.cpp @@ -1,7 +1,16 @@ #include "header.h" +#include + int main() { + std::vector> yay; + + for (Fooo a: yay) + { + a; + } + Foo ft; ft.bar(); return 0; diff --git a/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp b/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp index 0ad573d8..93ccdb05 100644 --- a/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp +++ b/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp @@ -165,41 +165,8 @@ std::shared_ptr CxxTypeNameResolver::typeToDataType(const clang::Type* case clang::Type::DependentName: { const clang::DependentNameType* dependentNameType = clang::dyn_cast(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(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(dependentNameType->getIdentifier()->getName().str())); dataType = std::make_shared(typeNameHerarchy); @@ -226,3 +193,48 @@ std::shared_ptr 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(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; +} diff --git a/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.h b/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.h index 3f9bb3d9..2893c0c5 100644 --- a/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.h +++ b/src/lib/data/parser/cxx/name_resolver/CxxTypeNameResolver.h @@ -15,6 +15,7 @@ public: private: std::shared_ptr typeToDataType(const clang::Type* type); + NameHierarchy getNameHierarchy(const clang::NestedNameSpecifier* nestedNameSpecifier); }; #endif // CXX_TYPE_NAME_RESOLVER_H