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;
 }