diff options
Diffstat (limited to 'source/Symbol/Type.cpp')
-rw-r--r-- | source/Symbol/Type.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/source/Symbol/Type.cpp b/source/Symbol/Type.cpp index 4eb538fb13525..42b76590aaea8 100644 --- a/source/Symbol/Type.cpp +++ b/source/Symbol/Type.cpp @@ -31,6 +31,7 @@ #include "llvm/ADT/StringRef.h" #include "clang/AST/Decl.h" +#include "clang/AST/DeclObjC.h" using namespace lldb; using namespace lldb_private; @@ -1291,6 +1292,117 @@ TypeImpl::GetDescription (lldb_private::Stream &strm, return true; } +TypeMemberFunctionImpl& +TypeMemberFunctionImpl::operator = (const TypeMemberFunctionImpl& rhs) +{ + if (this != &rhs) + { + m_type = rhs.m_type; + m_objc_method_decl = rhs.m_objc_method_decl; + m_name = rhs.m_name; + m_kind = rhs.m_kind; + } + return *this; +} + +bool +TypeMemberFunctionImpl::IsValid () +{ + return m_type.IsValid() && m_kind != lldb::eMemberFunctionKindUnknown; +} + +ConstString +TypeMemberFunctionImpl::GetName () const +{ + return m_name; +} + +ClangASTType +TypeMemberFunctionImpl::GetType () const +{ + return m_type; +} + +lldb::MemberFunctionKind +TypeMemberFunctionImpl::GetKind () const +{ + return m_kind; +} + +std::string +TypeMemberFunctionImpl::GetPrintableTypeName () +{ + if (m_type) + return m_type.GetTypeName().AsCString("<unknown>"); + if (m_objc_method_decl) + { + if (m_objc_method_decl->getClassInterface()) + { + return m_objc_method_decl->getClassInterface()->getName(); + } + } + return "<unknown>"; +} + +bool +TypeMemberFunctionImpl::GetDescription (Stream& stream) +{ + switch (m_kind) { + case lldb::eMemberFunctionKindUnknown: + return false; + case lldb::eMemberFunctionKindConstructor: + stream.Printf("constructor for %s", GetPrintableTypeName().c_str()); + break; + case lldb::eMemberFunctionKindDestructor: + stream.Printf("destructor for %s", GetPrintableTypeName().c_str()); + break; + case lldb::eMemberFunctionKindInstanceMethod: + stream.Printf("instance method %s of type %s", + m_name.AsCString(), + GetPrintableTypeName().c_str()); + break; + case lldb::eMemberFunctionKindStaticMethod: + stream.Printf("static method %s of type %s", + m_name.AsCString(), + GetPrintableTypeName().c_str()); + break; + } + return true; +} + +ClangASTType +TypeMemberFunctionImpl::GetReturnType () const +{ + if (m_type) + return m_type.GetFunctionReturnType(); + if (m_objc_method_decl) + return ClangASTType(&m_objc_method_decl->getASTContext(),m_objc_method_decl->getReturnType().getAsOpaquePtr()); + return ClangASTType(); +} + +size_t +TypeMemberFunctionImpl::GetNumArguments () const +{ + if (m_type) + return m_type.GetNumberOfFunctionArguments(); + if (m_objc_method_decl) + return m_objc_method_decl->param_size(); + return 0; +} + +ClangASTType +TypeMemberFunctionImpl::GetArgumentAtIndex (size_t idx) const +{ + if (m_type) + return m_type.GetFunctionArgumentAtIndex (idx); + if (m_objc_method_decl) + { + if (idx < m_objc_method_decl->param_size()) + return ClangASTType(&m_objc_method_decl->getASTContext(), m_objc_method_decl->parameters()[idx]->getOriginalType().getAsOpaquePtr()); + } + return ClangASTType(); +} + TypeEnumMemberImpl::TypeEnumMemberImpl (const clang::EnumConstantDecl* enum_member_decl, const lldb_private::ClangASTType& integer_type) : m_integer_type_sp(), |