summaryrefslogtreecommitdiff
path: root/source/Symbol/Type.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Symbol/Type.cpp')
-rw-r--r--source/Symbol/Type.cpp112
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(),