Huge change to clean up types.

A long time ago we start with clang types that were created by the symbol files and there were many functions in lldb_private::ClangASTContext that helped. Later we create ClangASTType which contains a clang::ASTContext and an opauque QualType, but we didn't switch over to fully using it. There were a lot of places where we would pass around a raw clang_type_t and also pass along a clang::ASTContext separately. This left room for error.

This checkin change all type code over to use ClangASTType everywhere and I cleaned up the interfaces quite a bit. Any code that was in ClangASTContext that was type related, was moved over into ClangASTType. All code that used these types was switched over to use all of the new goodness.

llvm-svn: 186130
diff --git a/lldb/source/Expression/ClangASTSource.cpp b/lldb/source/Expression/ClangASTSource.cpp
index 0fc3db6..49513d7 100644
--- a/lldb/source/Expression/ClangASTSource.cpp
+++ b/lldb/source/Expression/ClangASTSource.cpp
@@ -238,12 +238,12 @@
                     if (!type)
                         continue;
                     
-                    lldb::clang_type_t opaque_type = type->GetClangFullType();
+                    ClangASTType clang_type (type->GetClangFullType());
                     
-                    if (!opaque_type)
+                    if (!clang_type)
                         continue;
                     
-                    const TagType *tag_type = QualType::getFromOpaquePtr(opaque_type)->getAs<TagType>();
+                    const TagType *tag_type = clang_type.GetQualType()->getAs<TagType>();
                     
                     if (!tag_type)
                         continue;
@@ -277,12 +277,12 @@
                 if (!type)
                     continue;
                 
-                lldb::clang_type_t opaque_type = type->GetClangFullType();
+                ClangASTType clang_type (type->GetClangFullType());
                 
-                if (!opaque_type)
+                if (!clang_type)
                     continue;
                 
-                const TagType *tag_type = QualType::getFromOpaquePtr(opaque_type)->getAs<TagType>();
+                const TagType *tag_type = clang_type.GetQualType()->getAs<TagType>();
                 
                 if (!tag_type)
                     continue;
@@ -346,7 +346,7 @@
     if (!complete_type_sp)
         return NULL;
     
-    TypeFromUser complete_type = TypeFromUser(complete_type_sp->GetClangFullType(), complete_type_sp->GetClangAST());
+    TypeFromUser complete_type = TypeFromUser(complete_type_sp->GetClangFullType());
     lldb::clang_type_t complete_opaque_type = complete_type.GetOpaqueQualType();
     
     if (!complete_opaque_type)
@@ -696,12 +696,11 @@
                             (name_string ? name_string : "<anonymous>"));
             }
                         
-            clang::ASTContext *type_ast = type_sp->GetClangAST();
-            lldb::clang_type_t full_type = type_sp->GetClangFullType();
+            ClangASTType full_type = type_sp->GetClangFullType();
 
-            void *copied_type = GuardedCopyType(m_ast_context, type_ast, full_type);
+            ClangASTType copied_clang_type (GuardedCopyType(full_type));
                 
-            if (!copied_type)
+            if (!copied_clang_type)
             {                
                 if (log)
                     log->Printf("  CAS::FEVD[%u] - Couldn't export a type",
@@ -710,7 +709,7 @@
                 break;
             }
                 
-            context.AddTypeDecl(copied_type);
+            context.AddTypeDecl(copied_clang_type);
         }
         else
         {
@@ -750,13 +749,9 @@
                                 name.GetCString());
                 }
                 
-                const clang::Type *runtime_clang_type = QualType::getFromOpaquePtr(types[0].GetOpaqueQualType()).getTypePtr();
+                ClangASTType copied_clang_type (GuardedCopyType(types[0]));
                 
-                clang::QualType runtime_qual_type(runtime_clang_type, 0);
-                
-                void *copied_type = GuardedCopyType(m_ast_context, type_vendor->GetClangASTContext(), runtime_qual_type.getAsOpaquePtr());
-                
-                if (!copied_type)
+                if (!copied_clang_type)
                 {
                     if (log)
                         log->Printf("  CAS::FEVD[%u] - Couldn't export a type from the runtime",
@@ -765,7 +760,7 @@
                     break;
                 }
                 
-                context.AddTypeDecl(copied_type);
+                context.AddTypeDecl(copied_clang_type);
             }
             while(0);
         }
@@ -1688,42 +1683,43 @@
     return dyn_cast<NamespaceDecl>(copied_decl);
 }
 
-void * 
-ClangASTSource::GuardedCopyType (ASTContext *dest_context, 
-                                 ASTContext *source_context,
-                                 void *clang_type)
+ClangASTType
+ClangASTSource::GuardedCopyType (const ClangASTType &src_type)
 {
     ClangASTMetrics::RegisterLLDBImport();
     
     SetImportInProgress(true);
     
-    QualType ret_qual_type = m_ast_importer->CopyType (m_ast_context, source_context, QualType::getFromOpaquePtr(clang_type));
-    
-    void *ret = ret_qual_type.getAsOpaquePtr();
+    QualType copied_qual_type = m_ast_importer->CopyType (m_ast_context, src_type.GetASTContext(), src_type.GetQualType());
     
     SetImportInProgress(false);
     
-    if (ret && ret_qual_type->getCanonicalTypeInternal().isNull())
+    if (copied_qual_type.getAsOpaquePtr() && copied_qual_type->getCanonicalTypeInternal().isNull())
         // this shouldn't happen, but we're hardening because the AST importer seems to be generating bad types
         // on occasion.
-        return NULL;
+        return ClangASTType();
     
-    return ret;
+    return ClangASTType(m_ast_context, copied_qual_type);
 }
 
 clang::NamedDecl *
-NameSearchContext::AddVarDecl(void *type) 
+NameSearchContext::AddVarDecl(const ClangASTType &type)
 {
+    assert (type && "Type for variable must be valid!");
+
+    if (!type.IsValid())
+        return NULL;
+    
     IdentifierInfo *ii = m_decl_name.getAsIdentifierInfo();
     
-    assert (type && "Type for variable must be non-NULL!");
-        
-    clang::NamedDecl *Decl = VarDecl::Create(*m_ast_source.m_ast_context, 
+    clang::ASTContext *ast = type.GetASTContext();
+
+    clang::NamedDecl *Decl = VarDecl::Create(*ast,
                                              const_cast<DeclContext*>(m_decl_context), 
                                              SourceLocation(), 
                                              SourceLocation(),
                                              ii, 
-                                             QualType::getFromOpaquePtr(type), 
+                                             type.GetQualType(),
                                              0, 
                                              SC_Static);
     m_decls.push_back(Decl);
@@ -1732,25 +1728,32 @@
 }
 
 clang::NamedDecl *
-NameSearchContext::AddFunDecl (void *type) 
+NameSearchContext::AddFunDecl (const ClangASTType &type) 
 {
-    assert (type && "Type for variable must be non-NULL!");
+    assert (type && "Type for variable must be valid!");
     
+    if (!type.IsValid())
+        return NULL;
+
     if (m_function_types.count(type))
         return NULL;
     
     m_function_types.insert(type);
     
+    QualType qual_type (type.GetQualType());
+    
+    clang::ASTContext *ast = type.GetASTContext();
+
     const bool isInlineSpecified = false;
     const bool hasWrittenPrototype = true;
     const bool isConstexprSpecified = false;
 
-    clang::FunctionDecl *func_decl = FunctionDecl::Create (*m_ast_source.m_ast_context,
+    clang::FunctionDecl *func_decl = FunctionDecl::Create (*ast,
                                                            const_cast<DeclContext*>(m_decl_context),
                                                            SourceLocation(),
                                                            SourceLocation(),
                                                            m_decl_name.getAsIdentifierInfo(),
-                                                           QualType::getFromOpaquePtr(type),
+                                                           qual_type,
                                                            NULL,
                                                            SC_Static,
                                                            isInlineSpecified,
@@ -1761,7 +1764,6 @@
     // synthesize ParmVarDecls for all of the FunctionDecl's arguments.  To do
     // this, we raid the function's FunctionProtoType for types.
     
-    QualType qual_type (QualType::getFromOpaquePtr(type));
     const FunctionProtoType *func_proto_type = qual_type.getTypePtr()->getAs<FunctionProtoType>();
     
     if (func_proto_type)
@@ -1775,7 +1777,7 @@
         {
             QualType arg_qual_type (func_proto_type->getArgType(ArgIndex));
             
-            parm_var_decls.push_back(ParmVarDecl::Create (*m_ast_source.m_ast_context,
+            parm_var_decls.push_back(ParmVarDecl::Create (*ast,
                                                           const_cast<DeclContext*>(m_decl_context),
                                                           SourceLocation(),
                                                           SourceLocation(),
@@ -1812,15 +1814,15 @@
                                                                                 ArrayRef<QualType>(),                                        // argument types
                                                                                 proto_info));
     
-    return AddFunDecl(generic_function_type.getAsOpaquePtr());
+    return AddFunDecl(ClangASTType (m_ast_source.m_ast_context, generic_function_type));
 }
 
 clang::NamedDecl *
-NameSearchContext::AddTypeDecl(void *type)
+NameSearchContext::AddTypeDecl(const ClangASTType &clang_type)
 {
-    if (type)
+    if (clang_type)
     {
-        QualType qual_type = QualType::getFromOpaquePtr(type);
+        QualType qual_type = clang_type.GetQualType();
 
         if (const TypedefType *typedef_type = llvm::dyn_cast<TypedefType>(qual_type))
         {