Centralize all of the type name code so that we always strip the leading
"struct ", "class ", and "union " from the start of any type names that are
extracted from clang QualType objects. I had to fix test suite cases that
were expecting the struct/union/class prefix to be there.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@134132 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBType.cpp b/source/API/SBType.cpp
index 4f20124..c49f61b 100644
--- a/source/API/SBType.cpp
+++ b/source/API/SBType.cpp
@@ -71,7 +71,7 @@
SBType::GetName ()
{
if (IsValid ())
- return ClangASTType::GetClangTypeName (m_type).AsCString(NULL);
+ return ClangASTType::GetConstTypeName (m_type).AsCString(NULL);
return NULL;
}
diff --git a/source/Core/ValueObjectChild.cpp b/source/Core/ValueObjectChild.cpp
index 509852f..dcbb90a 100644
--- a/source/Core/ValueObjectChild.cpp
+++ b/source/Core/ValueObjectChild.cpp
@@ -71,7 +71,7 @@
{
if (m_type_name.IsEmpty())
{
- m_type_name = ClangASTType::GetClangTypeName (GetClangType());
+ m_type_name = ClangASTType::GetConstTypeName (GetClangType());
if (m_type_name)
{
if (m_bitfield_bit_size > 0)
diff --git a/source/Core/ValueObjectConstResult.cpp b/source/Core/ValueObjectConstResult.cpp
index fbb35eb..7ceddc9 100644
--- a/source/Core/ValueObjectConstResult.cpp
+++ b/source/Core/ValueObjectConstResult.cpp
@@ -273,7 +273,7 @@
ValueObjectConstResult::GetTypeName()
{
if (m_type_name.IsEmpty())
- m_type_name = ClangASTType::GetClangTypeName (GetClangType());
+ m_type_name = ClangASTType::GetConstTypeName (GetClangType());
return m_type_name;
}
diff --git a/source/Core/ValueObjectDynamicValue.cpp b/source/Core/ValueObjectDynamicValue.cpp
index 0188ad2..0a90b85 100644
--- a/source/Core/ValueObjectDynamicValue.cpp
+++ b/source/Core/ValueObjectDynamicValue.cpp
@@ -62,7 +62,7 @@
{
const bool success = UpdateValueIfNeeded();
if (success && m_type_sp)
- return ClangASTType::GetClangTypeName (GetClangType());
+ return ClangASTType::GetConstTypeName (GetClangType());
else
return m_parent->GetTypeName();
}
diff --git a/source/Core/ValueObjectMemory.cpp b/source/Core/ValueObjectMemory.cpp
index ad8c8f0..900d27f 100644
--- a/source/Core/ValueObjectMemory.cpp
+++ b/source/Core/ValueObjectMemory.cpp
@@ -140,11 +140,7 @@
{
if (m_type_sp)
return m_type_sp->GetName();
- ConstString name;
- std::string type_name (ClangASTContext::GetTypeName (m_clang_type.GetOpaqueQualType()));
- if (!type_name.empty())
- name.SetCString (type_name.c_str());
- return name;
+ return ClangASTType::GetConstTypeName (m_clang_type.GetOpaqueQualType());
}
uint32_t
diff --git a/source/Core/ValueObjectRegister.cpp b/source/Core/ValueObjectRegister.cpp
index bcefc30..db3d559 100644
--- a/source/Core/ValueObjectRegister.cpp
+++ b/source/Core/ValueObjectRegister.cpp
@@ -322,7 +322,7 @@
ValueObjectRegister::GetTypeName()
{
if (m_type_name.IsEmpty())
- m_type_name = ClangASTType::GetClangTypeName (GetClangType());
+ m_type_name = ClangASTType::GetConstTypeName (GetClangType());
return m_type_name;
}
diff --git a/source/Expression/ClangFunction.cpp b/source/Expression/ClangFunction.cpp
index f3a57d5..21e2cd2 100644
--- a/source/Expression/ClangFunction.cpp
+++ b/source/Expression/ClangFunction.cpp
@@ -118,7 +118,7 @@
// FIXME: How does clang tell us there's no return value? We need to handle that case.
unsigned num_errors = 0;
- std::string return_type_str = ClangASTContext::GetTypeName(m_function_return_qual_type);
+ std::string return_type_str (ClangASTType::GetTypeNameForOpaqueQualType (m_function_return_qual_type));
// Cons up the function we're going to wrap our call in, then compile it...
// We declare the function "extern "C"" because the compiler might be in C++
@@ -164,15 +164,15 @@
if (trust_function)
{
lldb::clang_type_t arg_clang_type = m_function_ptr->GetArgumentTypeAtIndex(i);
- type_name = ClangASTContext::GetTypeName(arg_clang_type);
+ type_name = ClangASTType::GetTypeNameForOpaqueQualType (arg_clang_type);
}
else
{
Value *arg_value = m_arg_values.GetValueAtIndex(i);
- void *clang_qual_type = arg_value->GetClangType ();
+ lldb::clang_type_t clang_qual_type = arg_value->GetClangType ();
if (clang_qual_type != NULL)
{
- type_name = ClangASTContext::GetTypeName(clang_qual_type);
+ type_name = ClangASTType::GetTypeNameForOpaqueQualType (clang_qual_type);
}
else
{
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
index fd7fc50..3cbdc79 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
@@ -528,7 +528,7 @@
size_t
AppleObjCRuntimeV2::GetByteOffsetForIvar (ClangASTType &parent_ast_type, const char *ivar_name)
{
- const char *class_name = parent_ast_type.GetClangTypeName().AsCString();
+ const char *class_name = parent_ast_type.GetConstTypeName().AsCString();
if (!class_name || *class_name == '\0' || !ivar_name || *ivar_name == '\0')
return LLDB_INVALID_IVAR_OFFSET;
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 9a7e7fd..7740d6f 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1493,7 +1493,7 @@
if (class_language == eLanguageTypeObjC)
{
- std::string class_str (ClangASTContext::GetTypeName (clang_type));
+ std::string class_str (ClangASTType::GetTypeNameForOpaqueQualType(clang_type));
if (!class_str.empty())
{
diff --git a/source/Symbol/ClangASTContext.cpp b/source/Symbol/ClangASTContext.cpp
index fb55a51..9da3c70 100644
--- a/source/Symbol/ClangASTContext.cpp
+++ b/source/Symbol/ClangASTContext.cpp
@@ -2571,9 +2571,8 @@
// 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 @@
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 @@
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/source/Symbol/ClangASTType.cpp b/source/Symbol/ClangASTType.cpp
index 53011f0..c94d605 100644
--- a/source/Symbol/ClangASTType.cpp
+++ b/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 ()
+std::string
+ClangASTType::GetTypeNameForQualType (clang::QualType qual_type)
{
- return GetClangTypeName (m_type);
-}
-
-ConstString
-ClangASTType::GetClangTypeName (clang_type_t clang_type)
-{
- ConstString clang_type_name;
- if (clang_type)
- {
- clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
- return GetClangTypeName(qual_type);
-
- }
- else
- {
- clang_type_name.SetCString ("<invalid>");
- }
-
- return clang_type_name;
-}
-
-ConstString
-ClangASTType::GetClangTypeName (clang::QualType qual_type)
-{
- ConstString clang_type_name;
+ std::string 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());
+ type_name = typedef_decl->getQualifiedNameAsString();
}
else
{
- std::string type_name(qual_type.getAsString());
- if (!type_name.empty())
- clang_type_name.SetCString (type_name.c_str());
+ type_name = qual_type.getAsString();
}
- return clang_type_name;
+
+ // 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;
+}
+
+std::string
+ClangASTType::GetTypeNameForOpaqueQualType (clang_type_t opaque_qual_type)
+{
+ return GetTypeNameForQualType (clang::QualType::getFromOpaquePtr(opaque_qual_type));
+}
+
+
+ConstString
+ClangASTType::GetConstTypeName ()
+{
+ 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
+ const_type_name.SetCString(type_name.c_str());
+ return const_type_name;
}
clang_type_t
diff --git a/source/Symbol/Type.cpp b/source/Symbol/Type.cpp
index 71cbcdd..f9cd101 100644
--- a/source/Symbol/Type.cpp
+++ b/source/Symbol/Type.cpp
@@ -194,14 +194,10 @@
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;
}