diff options
Diffstat (limited to 'lldb/source/Symbol')
-rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 30 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTType.cpp | 95 | ||||
-rw-r--r-- | lldb/source/Symbol/Type.cpp | 8 |
3 files changed, 69 insertions, 64 deletions
diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index fb55a51344f..9da3c703ac8 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2571,9 +2571,8 @@ ClangASTContext::GetChildClangTypeAtIndex // Base classes should be a multiple of 8 bits in size assert (bit_offset % 8 == 0); child_byte_offset = bit_offset/8; - std::string base_class_type_name(base_class->getType().getAsString()); - - child_name.assign(base_class_type_name.c_str()); + + child_name = ClangASTType::GetTypeNameForQualType(base_class->getType()); uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); @@ -3401,7 +3400,8 @@ ClangASTContext::GetIndexOfChildWithName if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) continue; - if (base_class->getType().getAsString().compare (name) == 0) + std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(base_class->getType())); + if (base_class_type_name.compare (name) == 0) return child_idx; ++child_idx; } @@ -4660,28 +4660,6 @@ ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, D return NULL; } - -std::string -ClangASTContext::GetTypeName (clang_type_t opaque_qual_type) -{ - std::string return_name; - - QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); - - const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); - if (typedef_type) - { - const TypedefNameDecl *typedef_decl = typedef_type->getDecl(); - return_name = typedef_decl->getQualifiedNameAsString(); - } - else - { - return_name = qual_type.getAsString(); - } - - return return_name; -} - // Disable this for now since I can't seem to get a nicely formatted float // out of the APFloat class without just getting the float, double or quad // and then using a formatted print on it which defeats the purpose. We ideally diff --git a/lldb/source/Symbol/ClangASTType.cpp b/lldb/source/Symbol/ClangASTType.cpp index 53011f00fb4..c94d605b25c 100644 --- a/lldb/source/Symbol/ClangASTType.cpp +++ b/lldb/source/Symbol/ClangASTType.cpp @@ -38,57 +38,88 @@ #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Process.h" - using namespace lldb; using namespace lldb_private; -ClangASTType::~ClangASTType() -{ -} -ConstString -ClangASTType::GetClangTypeName () +ClangASTType::~ClangASTType() { - return GetClangTypeName (m_type); } -ConstString -ClangASTType::GetClangTypeName (clang_type_t clang_type) +std::string +ClangASTType::GetTypeNameForQualType (clang::QualType qual_type) { - ConstString clang_type_name; - if (clang_type) + std::string type_name; + + const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); + if (typedef_type) { - clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); - return GetClangTypeName(qual_type); - + const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); + type_name = typedef_decl->getQualifiedNameAsString(); } else { - clang_type_name.SetCString ("<invalid>"); + type_name = qual_type.getAsString(); + } + + // There is no call to a clang type to get the type name without the + // class/struct/union on the front, so lets strip it here + const char *type_name_cstr = type_name.c_str(); + if (type_name_cstr[0] == 'c' && + type_name_cstr[1] == 'l' && + type_name_cstr[2] == 'a' && + type_name_cstr[3] == 's' && + type_name_cstr[4] == 's' && + type_name_cstr[5] == ' ') + { + type_name.erase (0, 6); + } + else if (type_name_cstr[0] == 's' && + type_name_cstr[1] == 't' && + type_name_cstr[2] == 'r' && + type_name_cstr[3] == 'u' && + type_name_cstr[4] == 'c' && + type_name_cstr[5] == 't' && + type_name_cstr[6] == ' ') + { + type_name.erase (0, 7); } + else if (type_name_cstr[0] == 'u' && + type_name_cstr[1] == 'n' && + type_name_cstr[2] == 'i' && + type_name_cstr[3] == 'o' && + type_name_cstr[4] == 'n' && + type_name_cstr[5] == ' ') + { + type_name.erase (0, 6); + } + return type_name; +} - return clang_type_name; +std::string +ClangASTType::GetTypeNameForOpaqueQualType (clang_type_t opaque_qual_type) +{ + return GetTypeNameForQualType (clang::QualType::getFromOpaquePtr(opaque_qual_type)); } + ConstString -ClangASTType::GetClangTypeName (clang::QualType qual_type) +ClangASTType::GetConstTypeName () { - ConstString clang_type_name; - const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>(); - if (typedef_type) - { - const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl(); - std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString()); - if (!clang_typedef_name.empty()) - clang_type_name.SetCString (clang_typedef_name.c_str()); - } + return GetConstTypeName (m_type); +} + +ConstString +ClangASTType::GetConstTypeName (clang_type_t clang_type) +{ + clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type)); + std::string type_name (GetTypeNameForQualType (qual_type)); + ConstString const_type_name; + if (type_name.empty()) + const_type_name.SetCString ("<invalid>"); else - { - std::string type_name(qual_type.getAsString()); - if (!type_name.empty()) - clang_type_name.SetCString (type_name.c_str()); - } - return clang_type_name; + const_type_name.SetCString(type_name.c_str()); + return const_type_name; } clang_type_t diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp index 71cbcdd2953..f9cd1015aba 100644 --- a/lldb/source/Symbol/Type.cpp +++ b/lldb/source/Symbol/Type.cpp @@ -194,14 +194,10 @@ Type::Dump (Stream *s, bool show_context) const ConstString & Type::GetName() { - if (!(m_name)) + if (!m_name) { if (ResolveClangType(eResolveStateForward)) - { - std::string type_name = ClangASTContext::GetTypeName (m_clang_type); - if (!type_name.empty()) - m_name.SetCString (type_name.c_str()); - } + m_name = ClangASTType::GetConstTypeName (m_clang_type); } return m_name; } |