1*8d48cd60SZachary Turner //===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===//
210de0904SEnrico Granata //
310de0904SEnrico Granata //                     The LLVM Compiler Infrastructure
410de0904SEnrico Granata //
510de0904SEnrico Granata // This file is distributed under the University of Illinois Open Source
610de0904SEnrico Granata // License. See LICENSE.TXT for details.
710de0904SEnrico Granata //
810de0904SEnrico Granata //===----------------------------------------------------------------------===//
910de0904SEnrico Granata 
1010de0904SEnrico Granata #include "lldb/API/SBDeclaration.h"
1110de0904SEnrico Granata #include "lldb/API/SBStream.h"
12*8d48cd60SZachary Turner #include "lldb/Host/PosixApi.h"
1310de0904SEnrico Granata #include "lldb/Symbol/Declaration.h"
146f9e6901SZachary Turner #include "lldb/Utility/Log.h"
15bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1610de0904SEnrico Granata 
17df3df25aSGreg Clayton #include <limits.h>
18df3df25aSGreg Clayton 
1910de0904SEnrico Granata using namespace lldb;
2010de0904SEnrico Granata using namespace lldb_private;
2110de0904SEnrico Granata 
22b9c1b51eSKate Stone SBDeclaration::SBDeclaration() : m_opaque_ap() {}
2310de0904SEnrico Granata 
24b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_ap() {
2510de0904SEnrico Granata   if (rhs.IsValid())
2610de0904SEnrico Granata     ref() = rhs.ref();
2710de0904SEnrico Granata }
2810de0904SEnrico Granata 
29b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr)
30b9c1b51eSKate Stone     : m_opaque_ap() {
3110de0904SEnrico Granata   if (lldb_object_ptr)
3210de0904SEnrico Granata     ref() = *lldb_object_ptr;
3310de0904SEnrico Granata }
3410de0904SEnrico Granata 
35b9c1b51eSKate Stone const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
36b9c1b51eSKate Stone   if (this != &rhs) {
3710de0904SEnrico Granata     if (rhs.IsValid())
3810de0904SEnrico Granata       ref() = rhs.ref();
3910de0904SEnrico Granata     else
4010de0904SEnrico Granata       m_opaque_ap.reset();
4110de0904SEnrico Granata   }
4210de0904SEnrico Granata   return *this;
4310de0904SEnrico Granata }
4410de0904SEnrico Granata 
45b9c1b51eSKate Stone void SBDeclaration::SetDeclaration(
46b9c1b51eSKate Stone     const lldb_private::Declaration &lldb_object_ref) {
4710de0904SEnrico Granata   ref() = lldb_object_ref;
4810de0904SEnrico Granata }
4910de0904SEnrico Granata 
50b9c1b51eSKate Stone SBDeclaration::~SBDeclaration() {}
5110de0904SEnrico Granata 
52b9c1b51eSKate Stone bool SBDeclaration::IsValid() const {
5310de0904SEnrico Granata   return m_opaque_ap.get() && m_opaque_ap->IsValid();
5410de0904SEnrico Granata }
5510de0904SEnrico Granata 
56b9c1b51eSKate Stone SBFileSpec SBDeclaration::GetFileSpec() const {
575160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5810de0904SEnrico Granata 
5910de0904SEnrico Granata   SBFileSpec sb_file_spec;
6010de0904SEnrico Granata   if (m_opaque_ap.get() && m_opaque_ap->GetFile())
6110de0904SEnrico Granata     sb_file_spec.SetFileSpec(m_opaque_ap->GetFile());
6210de0904SEnrico Granata 
63b9c1b51eSKate Stone   if (log) {
6410de0904SEnrico Granata     SBStream sstr;
6510de0904SEnrico Granata     sb_file_spec.GetDescription(sstr);
66324a1036SSaleem Abdulrasool     log->Printf("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s",
67324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()),
68b9c1b51eSKate Stone                 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
6910de0904SEnrico Granata   }
7010de0904SEnrico Granata 
7110de0904SEnrico Granata   return sb_file_spec;
7210de0904SEnrico Granata }
7310de0904SEnrico Granata 
74b9c1b51eSKate Stone uint32_t SBDeclaration::GetLine() const {
755160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
7610de0904SEnrico Granata 
7710de0904SEnrico Granata   uint32_t line = 0;
7810de0904SEnrico Granata   if (m_opaque_ap.get())
7910de0904SEnrico Granata     line = m_opaque_ap->GetLine();
8010de0904SEnrico Granata 
8110de0904SEnrico Granata   if (log)
82324a1036SSaleem Abdulrasool     log->Printf("SBLineEntry(%p)::GetLine () => %u",
83324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), line);
8410de0904SEnrico Granata 
8510de0904SEnrico Granata   return line;
8610de0904SEnrico Granata }
8710de0904SEnrico Granata 
88b9c1b51eSKate Stone uint32_t SBDeclaration::GetColumn() const {
8910de0904SEnrico Granata   if (m_opaque_ap.get())
9010de0904SEnrico Granata     return m_opaque_ap->GetColumn();
9110de0904SEnrico Granata   return 0;
9210de0904SEnrico Granata }
9310de0904SEnrico Granata 
94b9c1b51eSKate Stone void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
9510de0904SEnrico Granata   if (filespec.IsValid())
9610de0904SEnrico Granata     ref().SetFile(filespec.ref());
9710de0904SEnrico Granata   else
9810de0904SEnrico Granata     ref().SetFile(FileSpec());
9910de0904SEnrico Granata }
100b9c1b51eSKate Stone void SBDeclaration::SetLine(uint32_t line) { ref().SetLine(line); }
10110de0904SEnrico Granata 
102b9c1b51eSKate Stone void SBDeclaration::SetColumn(uint32_t column) { ref().SetColumn(column); }
10310de0904SEnrico Granata 
104b9c1b51eSKate Stone bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
10510de0904SEnrico Granata   lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
10610de0904SEnrico Granata   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
10710de0904SEnrico Granata 
10810de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
10910de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
11010de0904SEnrico Granata 
11110de0904SEnrico Granata   return lhs_ptr == rhs_ptr;
11210de0904SEnrico Granata }
11310de0904SEnrico Granata 
114b9c1b51eSKate Stone bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
11510de0904SEnrico Granata   lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
11610de0904SEnrico Granata   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
11710de0904SEnrico Granata 
11810de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
11910de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
12010de0904SEnrico Granata 
12110de0904SEnrico Granata   return lhs_ptr != rhs_ptr;
12210de0904SEnrico Granata }
12310de0904SEnrico Granata 
124b9c1b51eSKate Stone const lldb_private::Declaration *SBDeclaration::operator->() const {
12510de0904SEnrico Granata   return m_opaque_ap.get();
12610de0904SEnrico Granata }
12710de0904SEnrico Granata 
128b9c1b51eSKate Stone lldb_private::Declaration &SBDeclaration::ref() {
12910de0904SEnrico Granata   if (m_opaque_ap.get() == NULL)
13010de0904SEnrico Granata     m_opaque_ap.reset(new lldb_private::Declaration());
13110de0904SEnrico Granata   return *m_opaque_ap;
13210de0904SEnrico Granata }
13310de0904SEnrico Granata 
134b9c1b51eSKate Stone const lldb_private::Declaration &SBDeclaration::ref() const {
13510de0904SEnrico Granata   return *m_opaque_ap;
13610de0904SEnrico Granata }
13710de0904SEnrico Granata 
138b9c1b51eSKate Stone bool SBDeclaration::GetDescription(SBStream &description) {
13910de0904SEnrico Granata   Stream &strm = description.ref();
14010de0904SEnrico Granata 
141b9c1b51eSKate Stone   if (m_opaque_ap.get()) {
14210de0904SEnrico Granata     char file_path[PATH_MAX * 2];
14310de0904SEnrico Granata     m_opaque_ap->GetFile().GetPath(file_path, sizeof(file_path));
14410de0904SEnrico Granata     strm.Printf("%s:%u", file_path, GetLine());
14510de0904SEnrico Granata     if (GetColumn() > 0)
14610de0904SEnrico Granata       strm.Printf(":%u", GetColumn());
147b9c1b51eSKate Stone   } else
14810de0904SEnrico Granata     strm.PutCString("No value");
14910de0904SEnrico Granata 
15010de0904SEnrico Granata   return true;
15110de0904SEnrico Granata }
15210de0904SEnrico Granata 
153b9c1b51eSKate Stone lldb_private::Declaration *SBDeclaration::get() { return m_opaque_ap.get(); }
154