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 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits