[Lldb-commits] [lldb] r244846 - Convert GetNumTemplateArguments() and GetTemplateArgument() to be instance functions on the CompilerType and the TypeSystem

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Wed Aug 12 17:24:25 PDT 2015


Author: enrico
Date: Wed Aug 12 19:24:24 2015
New Revision: 244846

URL: http://llvm.org/viewvc/llvm-project?rev=244846&view=rev
Log:
Convert GetNumTemplateArguments() and GetTemplateArgument() to be instance functions on the CompilerType and the TypeSystem


Modified:
    lldb/trunk/include/lldb/Symbol/ClangASTContext.h
    lldb/trunk/include/lldb/Symbol/CompilerType.h
    lldb/trunk/include/lldb/Symbol/TypeSystem.h
    lldb/trunk/source/API/SBType.cpp
    lldb/trunk/source/DataFormatters/LibCxxInitializerList.cpp
    lldb/trunk/source/DataFormatters/LibCxxList.cpp
    lldb/trunk/source/DataFormatters/LibStdcpp.cpp
    lldb/trunk/source/Symbol/ClangASTContext.cpp
    lldb/trunk/source/Symbol/CompilerType.cpp

Modified: lldb/trunk/include/lldb/Symbol/ClangASTContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ClangASTContext.h?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ClangASTContext.h (original)
+++ lldb/trunk/include/lldb/Symbol/ClangASTContext.h Wed Aug 12 19:24:24 2015
@@ -805,13 +805,13 @@ public:
                                    bool omit_empty_base_classes,
                                    std::vector<uint32_t>& child_indexes) override;
     
-    static size_t
-    GetNumTemplateArguments (const CompilerType& type);
+    size_t
+    GetNumTemplateArguments (void* type) override;
     
-    static CompilerType
-    GetTemplateArgument (const CompilerType& type,
+    CompilerType
+    GetTemplateArgument (void* type,
                          size_t idx,
-                         lldb::TemplateArgumentKind &kind);
+                         lldb::TemplateArgumentKind &kind) override;
     
     
     //----------------------------------------------------------------------

Modified: lldb/trunk/include/lldb/Symbol/CompilerType.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/CompilerType.h?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/CompilerType.h (original)
+++ lldb/trunk/include/lldb/Symbol/CompilerType.h Wed Aug 12 19:24:24 2015
@@ -370,6 +370,13 @@ public:
                                    bool omit_empty_base_classes,
                                    std::vector<uint32_t>& child_indexes) const;
     
+    size_t
+    GetNumTemplateArguments () const;
+    
+    CompilerType
+    GetTemplateArgument (size_t idx,
+                         lldb::TemplateArgumentKind &kind) const;
+    
     //------------------------------------------------------------------
     // Pointers & References
     //------------------------------------------------------------------

Modified: lldb/trunk/include/lldb/Symbol/TypeSystem.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/TypeSystem.h (original)
+++ lldb/trunk/include/lldb/Symbol/TypeSystem.h Wed Aug 12 19:24:24 2015
@@ -215,6 +215,14 @@ public:
                                    bool omit_empty_base_classes,
                                    std::vector<uint32_t>& child_indexes) = 0;
     
+    virtual size_t
+    GetNumTemplateArguments (void * type) = 0;
+    
+    virtual CompilerType
+    GetTemplateArgument (void * type,
+                         size_t idx,
+                         lldb::TemplateArgumentKind &kind) = 0;
+    
     //----------------------------------------------------------------------
     // Dumping types
     //----------------------------------------------------------------------

Modified: lldb/trunk/source/API/SBType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBType.cpp?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/source/API/SBType.cpp (original)
+++ lldb/trunk/source/API/SBType.cpp Wed Aug 12 19:24:24 2015
@@ -533,7 +533,7 @@ uint32_t
 SBType::GetNumberOfTemplateArguments ()
 {
     if (IsValid())
-        return ClangASTContext::GetNumTemplateArguments(m_opaque_sp->GetCompilerType(false));
+        return m_opaque_sp->GetCompilerType(false).GetNumTemplateArguments();
     return 0;
 }
 
@@ -543,7 +543,7 @@ SBType::GetTemplateArgumentType (uint32_
     if (IsValid())
     {
         TemplateArgumentKind kind = eTemplateArgumentKindNull;
-        CompilerType template_arg_type = ClangASTContext::GetTemplateArgument(m_opaque_sp->GetCompilerType(false), idx, kind);
+        CompilerType template_arg_type = m_opaque_sp->GetCompilerType(false).GetTemplateArgument(idx, kind);
         if (template_arg_type.IsValid())
             return SBType(template_arg_type);
     }
@@ -556,7 +556,7 @@ SBType::GetTemplateArgumentKind (uint32_
 {
     TemplateArgumentKind kind = eTemplateArgumentKindNull;
     if (IsValid())
-        ClangASTContext::GetTemplateArgument(m_opaque_sp->GetCompilerType(false), idx, kind);
+        m_opaque_sp->GetCompilerType(false).GetTemplateArgument(idx, kind);
     return kind;
 }
 

Modified: lldb/trunk/source/DataFormatters/LibCxxInitializerList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/LibCxxInitializerList.cpp?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/LibCxxInitializerList.cpp (original)
+++ lldb/trunk/source/DataFormatters/LibCxxInitializerList.cpp Wed Aug 12 19:24:24 2015
@@ -101,7 +101,7 @@ lldb_private::formatters::LibcxxInitiali
     m_num_elements = 0;
     m_children.clear();
     lldb::TemplateArgumentKind kind;
-    m_element_type = ClangASTContext::GetTemplateArgument(m_backend.GetClangType(), 0, kind);
+    m_element_type = m_backend.GetClangType().GetTemplateArgument(0, kind);
     if (kind != lldb::eTemplateArgumentKindType || false == m_element_type.IsValid())
         return false;
     

Modified: lldb/trunk/source/DataFormatters/LibCxxList.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/LibCxxList.cpp?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/LibCxxList.cpp (original)
+++ lldb/trunk/source/DataFormatters/LibCxxList.cpp Wed Aug 12 19:24:24 2015
@@ -336,10 +336,10 @@ lldb_private::formatters::LibcxxStdListS
     if (list_type.IsReferenceType())
         list_type = list_type.GetNonReferenceType();
 
-    if (ClangASTContext::GetNumTemplateArguments(list_type) == 0)
+    if (list_type.GetNumTemplateArguments() == 0)
         return false;
     lldb::TemplateArgumentKind kind;
-    m_element_type = ClangASTContext::GetTemplateArgument(list_type, 0, kind);
+    m_element_type = list_type.GetTemplateArgument(0, kind);
     m_head = impl_sp->GetChildMemberWithName(ConstString("__next_"), true).get();
     m_tail = impl_sp->GetChildMemberWithName(ConstString("__prev_"), true).get();
     return false;

Modified: lldb/trunk/source/DataFormatters/LibStdcpp.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/LibStdcpp.cpp?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/source/DataFormatters/LibStdcpp.cpp (original)
+++ lldb/trunk/source/DataFormatters/LibStdcpp.cpp Wed Aug 12 19:24:24 2015
@@ -79,10 +79,10 @@ lldb_private::formatters::LibstdcppMapIt
     m_pair_address += (is_64bit ? 32 : 16);
     
     CompilerType my_type(valobj_sp->GetClangType());
-    if (ClangASTContext::GetNumTemplateArguments(my_type) >= 1)
+    if (my_type.GetNumTemplateArguments() >= 1)
     {
         TemplateArgumentKind kind;
-        CompilerType pair_type = ClangASTContext::GetTemplateArgument(my_type, 0, kind);
+        CompilerType pair_type = my_type.GetTemplateArgument(0, kind);
         if (kind != eTemplateArgumentKindType && kind != eTemplateArgumentKindTemplate && kind != eTemplateArgumentKindTemplateExpansion)
             return false;
         m_pair_type = pair_type;

Modified: lldb/trunk/source/Symbol/ClangASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ClangASTContext.cpp?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ClangASTContext.cpp (original)
+++ lldb/trunk/source/Symbol/ClangASTContext.cpp Wed Aug 12 19:24:24 2015
@@ -6659,125 +6659,118 @@ ClangASTContext::GetIndexOfChildWithName
 
 
 size_t
-ClangASTContext::GetNumTemplateArguments (const CompilerType& type)
+ClangASTContext::GetNumTemplateArguments (void* type)
 {
     if (!type)
         return 0;
-    ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
-    if (ast)
+
+    clang::QualType qual_type (GetCanonicalQualType(type));
+    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
+    switch (type_class)
     {
-        clang::QualType qual_type (GetCanonicalQualType(type));
-        
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-            case clang::Type::Record:
-                if (ast->GetCompleteType(type.GetOpaqueQualType()))
+        case clang::Type::Record:
+            if (GetCompleteType(type))
+            {
+                const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
+                if (cxx_record_decl)
                 {
-                    const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                    if (cxx_record_decl)
-                    {
-                        const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
-                        if (template_decl)
-                            return template_decl->getTemplateArgs().size();
-                    }
+                    const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
+                    if (template_decl)
+                        return template_decl->getTemplateArgs().size();
                 }
-                break;
-                
-            case clang::Type::Typedef:
-                return GetNumTemplateArguments(CompilerType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
-                
-            case clang::Type::Elaborated:
-                return GetNumTemplateArguments(CompilerType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
-                
-            case clang::Type::Paren:
-                return GetNumTemplateArguments(CompilerType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
-                
-            default:
-                break;
-        }
+            }
+            break;
+            
+        case clang::Type::Typedef:
+            return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
+            
+        case clang::Type::Elaborated:
+            return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
+            
+        case clang::Type::Paren:
+            return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
+            
+        default:
+            break;
     }
+
     return 0;
 }
 
 CompilerType
-ClangASTContext::GetTemplateArgument (const CompilerType& type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
+ClangASTContext::GetTemplateArgument (void* type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
 {
     if (!type)
         return CompilerType();
-    ClangASTContext* ast = type.GetTypeSystem()->AsClangASTContext();
-    if (ast)
+
+    clang::QualType qual_type (GetCanonicalQualType(type));
+    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
+    switch (type_class)
     {
-        clang::QualType qual_type (GetCanonicalQualType(type));
-        
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-            case clang::Type::Record:
-                if (ast->GetCompleteType(type.GetOpaqueQualType()))
+        case clang::Type::Record:
+            if (GetCompleteType(type))
+            {
+                const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
+                if (cxx_record_decl)
                 {
-                    const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                    if (cxx_record_decl)
+                    const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
+                    if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
                     {
-                        const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
-                        if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
+                        const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
+                        switch (template_arg.getKind())
                         {
-                            const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
-                            switch (template_arg.getKind())
-                            {
-                                case clang::TemplateArgument::Null:
-                                    kind = eTemplateArgumentKindNull;
-                                    return CompilerType();
-                                    
-                                case clang::TemplateArgument::Type:
-                                    kind = eTemplateArgumentKindType;
-                                    return CompilerType(ast, template_arg.getAsType().getAsOpaquePtr());
-                                    
-                                case clang::TemplateArgument::Declaration:
-                                    kind = eTemplateArgumentKindDeclaration;
-                                    return CompilerType();
-                                    
-                                case clang::TemplateArgument::Integral:
-                                    kind = eTemplateArgumentKindIntegral;
-                                    return CompilerType(ast, template_arg.getIntegralType().getAsOpaquePtr());
-                                    
-                                case clang::TemplateArgument::Template:
-                                    kind = eTemplateArgumentKindTemplate;
-                                    return CompilerType();
-                                    
-                                case clang::TemplateArgument::TemplateExpansion:
-                                    kind = eTemplateArgumentKindTemplateExpansion;
-                                    return CompilerType();
-                                    
-                                case clang::TemplateArgument::Expression:
-                                    kind = eTemplateArgumentKindExpression;
-                                    return CompilerType();
-                                    
-                                case clang::TemplateArgument::Pack:
-                                    kind = eTemplateArgumentKindPack;
-                                    return CompilerType();
-                                    
-                                default:
-                                    assert (!"Unhandled clang::TemplateArgument::ArgKind");
-                                    break;
-                            }
+                            case clang::TemplateArgument::Null:
+                                kind = eTemplateArgumentKindNull;
+                                return CompilerType();
+                                
+                            case clang::TemplateArgument::Type:
+                                kind = eTemplateArgumentKindType;
+                                return CompilerType(getASTContext(), template_arg.getAsType());
+                                
+                            case clang::TemplateArgument::Declaration:
+                                kind = eTemplateArgumentKindDeclaration;
+                                return CompilerType();
+                                
+                            case clang::TemplateArgument::Integral:
+                                kind = eTemplateArgumentKindIntegral;
+                                return CompilerType(getASTContext(), template_arg.getIntegralType());
+                                
+                            case clang::TemplateArgument::Template:
+                                kind = eTemplateArgumentKindTemplate;
+                                return CompilerType();
+                                
+                            case clang::TemplateArgument::TemplateExpansion:
+                                kind = eTemplateArgumentKindTemplateExpansion;
+                                return CompilerType();
+                                
+                            case clang::TemplateArgument::Expression:
+                                kind = eTemplateArgumentKindExpression;
+                                return CompilerType();
+                                
+                            case clang::TemplateArgument::Pack:
+                                kind = eTemplateArgumentKindPack;
+                                return CompilerType();
+                                
+                            default:
+                                assert (!"Unhandled clang::TemplateArgument::ArgKind");
+                                break;
                         }
                     }
                 }
-                break;
-                
-            case clang::Type::Typedef:
-                return GetTemplateArgument(CompilerType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()), arg_idx, kind);
-                
-            case clang::Type::Elaborated:
-                return GetTemplateArgument(CompilerType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()), arg_idx, kind);
-                
-            case clang::Type::Paren:
-                return GetTemplateArgument(CompilerType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()), arg_idx, kind);
-                
-            default:
-                break;
-        }
+            }
+            break;
+            
+        case clang::Type::Typedef:
+            return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
+            
+        case clang::Type::Elaborated:
+            return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
+            
+        case clang::Type::Paren:
+            return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
+            
+        default:
+            break;
     }
     kind = eTemplateArgumentKindNull;
     return CompilerType ();

Modified: lldb/trunk/source/Symbol/CompilerType.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CompilerType.cpp?rev=244846&r1=244845&r2=244846&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/CompilerType.cpp (original)
+++ lldb/trunk/source/Symbol/CompilerType.cpp Wed Aug 12 19:24:24 2015
@@ -744,6 +744,27 @@ CompilerType::GetIndexOfChildMemberWithN
     return 0;
 }
 
+size_t
+CompilerType::GetNumTemplateArguments () const
+{
+    if (IsValid())
+    {
+        return m_type_system->GetNumTemplateArguments(m_type);
+    }
+    return 0;
+}
+
+CompilerType
+CompilerType::GetTemplateArgument (size_t idx,
+                                   lldb::TemplateArgumentKind &kind) const
+{
+    if (IsValid())
+    {
+        return m_type_system->GetTemplateArgument(m_type, idx, kind);
+    }
+    return CompilerType();
+}
+
 
 // Get the index of the child of "clang_type" whose name matches. This function
 // doesn't descend into the children, but only looks one level deep and name




More information about the lldb-commits mailing list