From eecf8b95d23e96de3b0d375a8a35f40dbd5dc2e6 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Thu, 14 Jan 2016 16:01:32 +0100 Subject: [PATCH] data: expanded typename resolving * implemented explicit handling of Decltype when resolving the typename. --- .../cxx/name_resolver/CxxTypeNameResolver.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/lib_parser/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp b/src/lib_parser/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp index 9234643a..34940b8c 100644 --- a/src/lib_parser/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp +++ b/src/lib_parser/data/parser/cxx/name_resolver/CxxTypeNameResolver.cpp @@ -98,10 +98,7 @@ std::shared_ptr CxxTypeNameResolver::typeToDataType(const clang::Type* pp.SuppressTagKeyword = true; // value "true": for a class A it prints "A" instead of "class A" pp.Bool = true; // value "true": prints bool type as "bool" instead of "_Bool" - clang::SmallString<64> Buf; - llvm::raw_svector_ostream StrOS(Buf); - clang::QualType::print(type, clang::Qualifiers(), StrOS, pp, clang::Twine()); - std::string typeName = StrOS.str(); + std::string typeName = type->getAs()->getName(pp); NameHierarchy typeNameHerarchy; typeNameHerarchy.push(std::make_shared(typeName)); @@ -138,7 +135,7 @@ std::shared_ptr CxxTypeNameResolver::typeToDataType(const clang::Type* templateArgumentNamePart += ">"; std::string declName = typeNameHerarchy.back()->getFullName(); - declName = declName.substr(0, declName.rfind("<")); // remove template parameters - TODO: FIX: does not work for A> + declName = declName.substr(0, declName.rfind("<")); // remove template parameters declName += templateArgumentNamePart; // add template arguments typeNameHerarchy.pop(); typeNameHerarchy.push(std::make_shared(declName)); @@ -184,9 +181,16 @@ std::shared_ptr CxxTypeNameResolver::typeToDataType(const clang::Type* dataType = qualTypeToDataType(autoType->getDeducedType()); break; } + case clang::Type::Decltype: + { + const clang::DecltypeType* decltypeType = clang::dyn_cast(type); + dataType = qualTypeToDataType(decltypeType->getUnderlyingType()); + break; + } default: { - LOG_INFO(std::string("Unhandled kind of type encountered: ") + type->getTypeClassName()); + std::string typeClassName = type->getTypeClassName(); + LOG_INFO(std::string("Unhandled kind of type encountered: ") + typeClassName); clang::PrintingPolicy pp = clang::PrintingPolicy(clang::LangOptions()); pp.SuppressTagKeyword = true; // value "true": for a class A it prints "A" instead of "class A" pp.Bool = true; // value "true": prints bool type as "bool" instead of "_Bool"