110de0904SEnrico Granata //===-- 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"
1210de0904SEnrico Granata #include "lldb/Core/Log.h"
1310de0904SEnrico Granata #include "lldb/Core/Stream.h"
1410de0904SEnrico Granata #include "lldb/Symbol/Declaration.h"
1510de0904SEnrico Granata 
16*df3df25aSGreg Clayton #include <limits.h>
17*df3df25aSGreg Clayton 
1810de0904SEnrico Granata using namespace lldb;
1910de0904SEnrico Granata using namespace lldb_private;
2010de0904SEnrico Granata 
2110de0904SEnrico Granata 
2210de0904SEnrico Granata SBDeclaration::SBDeclaration () :
2310de0904SEnrico Granata     m_opaque_ap ()
2410de0904SEnrico Granata {
2510de0904SEnrico Granata }
2610de0904SEnrico Granata 
2710de0904SEnrico Granata SBDeclaration::SBDeclaration (const SBDeclaration &rhs) :
2810de0904SEnrico Granata     m_opaque_ap ()
2910de0904SEnrico Granata {
3010de0904SEnrico Granata     if (rhs.IsValid())
3110de0904SEnrico Granata         ref() = rhs.ref();
3210de0904SEnrico Granata }
3310de0904SEnrico Granata 
3410de0904SEnrico Granata SBDeclaration::SBDeclaration (const lldb_private::Declaration *lldb_object_ptr) :
3510de0904SEnrico Granata     m_opaque_ap ()
3610de0904SEnrico Granata {
3710de0904SEnrico Granata     if (lldb_object_ptr)
3810de0904SEnrico Granata         ref() = *lldb_object_ptr;
3910de0904SEnrico Granata }
4010de0904SEnrico Granata 
4110de0904SEnrico Granata const SBDeclaration &
4210de0904SEnrico Granata SBDeclaration::operator = (const SBDeclaration &rhs)
4310de0904SEnrico Granata {
4410de0904SEnrico Granata     if (this != &rhs)
4510de0904SEnrico Granata     {
4610de0904SEnrico Granata         if (rhs.IsValid())
4710de0904SEnrico Granata             ref() = rhs.ref();
4810de0904SEnrico Granata         else
4910de0904SEnrico Granata             m_opaque_ap.reset();
5010de0904SEnrico Granata     }
5110de0904SEnrico Granata     return *this;
5210de0904SEnrico Granata }
5310de0904SEnrico Granata 
5410de0904SEnrico Granata void
5510de0904SEnrico Granata SBDeclaration::SetDeclaration (const lldb_private::Declaration &lldb_object_ref)
5610de0904SEnrico Granata {
5710de0904SEnrico Granata     ref() = lldb_object_ref;
5810de0904SEnrico Granata }
5910de0904SEnrico Granata 
6010de0904SEnrico Granata 
6110de0904SEnrico Granata SBDeclaration::~SBDeclaration ()
6210de0904SEnrico Granata {
6310de0904SEnrico Granata }
6410de0904SEnrico Granata 
6510de0904SEnrico Granata 
6610de0904SEnrico Granata bool
6710de0904SEnrico Granata SBDeclaration::IsValid () const
6810de0904SEnrico Granata {
6910de0904SEnrico Granata     return m_opaque_ap.get() && m_opaque_ap->IsValid();
7010de0904SEnrico Granata }
7110de0904SEnrico Granata 
7210de0904SEnrico Granata 
7310de0904SEnrico Granata SBFileSpec
7410de0904SEnrico Granata SBDeclaration::GetFileSpec () const
7510de0904SEnrico Granata {
7610de0904SEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7710de0904SEnrico Granata 
7810de0904SEnrico Granata     SBFileSpec sb_file_spec;
7910de0904SEnrico Granata     if (m_opaque_ap.get() && m_opaque_ap->GetFile())
8010de0904SEnrico Granata         sb_file_spec.SetFileSpec(m_opaque_ap->GetFile());
8110de0904SEnrico Granata 
8210de0904SEnrico Granata     if (log)
8310de0904SEnrico Granata     {
8410de0904SEnrico Granata         SBStream sstr;
8510de0904SEnrico Granata         sb_file_spec.GetDescription (sstr);
8610de0904SEnrico Granata         log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(),
8710de0904SEnrico Granata                      sb_file_spec.get(), sstr.GetData());
8810de0904SEnrico Granata     }
8910de0904SEnrico Granata 
9010de0904SEnrico Granata     return sb_file_spec;
9110de0904SEnrico Granata }
9210de0904SEnrico Granata 
9310de0904SEnrico Granata uint32_t
9410de0904SEnrico Granata SBDeclaration::GetLine () const
9510de0904SEnrico Granata {
9610de0904SEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9710de0904SEnrico Granata 
9810de0904SEnrico Granata     uint32_t line = 0;
9910de0904SEnrico Granata     if (m_opaque_ap.get())
10010de0904SEnrico Granata         line = m_opaque_ap->GetLine();
10110de0904SEnrico Granata 
10210de0904SEnrico Granata     if (log)
10310de0904SEnrico Granata         log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line);
10410de0904SEnrico Granata 
10510de0904SEnrico Granata     return line;
10610de0904SEnrico Granata }
10710de0904SEnrico Granata 
10810de0904SEnrico Granata 
10910de0904SEnrico Granata uint32_t
11010de0904SEnrico Granata SBDeclaration::GetColumn () const
11110de0904SEnrico Granata {
11210de0904SEnrico Granata     if (m_opaque_ap.get())
11310de0904SEnrico Granata         return m_opaque_ap->GetColumn();
11410de0904SEnrico Granata     return 0;
11510de0904SEnrico Granata }
11610de0904SEnrico Granata 
11710de0904SEnrico Granata void
11810de0904SEnrico Granata SBDeclaration::SetFileSpec (lldb::SBFileSpec filespec)
11910de0904SEnrico Granata {
12010de0904SEnrico Granata     if (filespec.IsValid())
12110de0904SEnrico Granata         ref().SetFile(filespec.ref());
12210de0904SEnrico Granata     else
12310de0904SEnrico Granata         ref().SetFile(FileSpec());
12410de0904SEnrico Granata }
12510de0904SEnrico Granata void
12610de0904SEnrico Granata SBDeclaration::SetLine (uint32_t line)
12710de0904SEnrico Granata {
12810de0904SEnrico Granata     ref().SetLine(line);
12910de0904SEnrico Granata }
13010de0904SEnrico Granata 
13110de0904SEnrico Granata void
13210de0904SEnrico Granata SBDeclaration::SetColumn (uint32_t column)
13310de0904SEnrico Granata {
13410de0904SEnrico Granata     ref().SetColumn(column);
13510de0904SEnrico Granata }
13610de0904SEnrico Granata 
13710de0904SEnrico Granata 
13810de0904SEnrico Granata 
13910de0904SEnrico Granata bool
14010de0904SEnrico Granata SBDeclaration::operator == (const SBDeclaration &rhs) const
14110de0904SEnrico Granata {
14210de0904SEnrico Granata     lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
14310de0904SEnrico Granata     lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
14410de0904SEnrico Granata 
14510de0904SEnrico Granata     if (lhs_ptr && rhs_ptr)
14610de0904SEnrico Granata         return lldb_private::Declaration::Compare (*lhs_ptr, *rhs_ptr) == 0;
14710de0904SEnrico Granata 
14810de0904SEnrico Granata     return lhs_ptr == rhs_ptr;
14910de0904SEnrico Granata }
15010de0904SEnrico Granata 
15110de0904SEnrico Granata bool
15210de0904SEnrico Granata SBDeclaration::operator != (const SBDeclaration &rhs) const
15310de0904SEnrico Granata {
15410de0904SEnrico Granata     lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
15510de0904SEnrico Granata     lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
15610de0904SEnrico Granata 
15710de0904SEnrico Granata     if (lhs_ptr && rhs_ptr)
15810de0904SEnrico Granata         return lldb_private::Declaration::Compare (*lhs_ptr, *rhs_ptr) != 0;
15910de0904SEnrico Granata 
16010de0904SEnrico Granata     return lhs_ptr != rhs_ptr;
16110de0904SEnrico Granata }
16210de0904SEnrico Granata 
16310de0904SEnrico Granata const lldb_private::Declaration *
16410de0904SEnrico Granata SBDeclaration::operator->() const
16510de0904SEnrico Granata {
16610de0904SEnrico Granata     return m_opaque_ap.get();
16710de0904SEnrico Granata }
16810de0904SEnrico Granata 
16910de0904SEnrico Granata lldb_private::Declaration &
17010de0904SEnrico Granata SBDeclaration::ref()
17110de0904SEnrico Granata {
17210de0904SEnrico Granata     if (m_opaque_ap.get() == NULL)
17310de0904SEnrico Granata         m_opaque_ap.reset (new lldb_private::Declaration ());
17410de0904SEnrico Granata     return *m_opaque_ap;
17510de0904SEnrico Granata }
17610de0904SEnrico Granata 
17710de0904SEnrico Granata const lldb_private::Declaration &
17810de0904SEnrico Granata SBDeclaration::ref() const
17910de0904SEnrico Granata {
18010de0904SEnrico Granata     return *m_opaque_ap;
18110de0904SEnrico Granata }
18210de0904SEnrico Granata 
18310de0904SEnrico Granata bool
18410de0904SEnrico Granata SBDeclaration::GetDescription (SBStream &description)
18510de0904SEnrico Granata {
18610de0904SEnrico Granata     Stream &strm = description.ref();
18710de0904SEnrico Granata 
18810de0904SEnrico Granata     if (m_opaque_ap.get())
18910de0904SEnrico Granata     {
19010de0904SEnrico Granata         char file_path[PATH_MAX*2];
19110de0904SEnrico Granata         m_opaque_ap->GetFile().GetPath (file_path, sizeof (file_path));
19210de0904SEnrico Granata         strm.Printf ("%s:%u", file_path, GetLine());
19310de0904SEnrico Granata         if (GetColumn() > 0)
19410de0904SEnrico Granata             strm.Printf (":%u", GetColumn());
19510de0904SEnrico Granata     }
19610de0904SEnrico Granata     else
19710de0904SEnrico Granata         strm.PutCString ("No value");
19810de0904SEnrico Granata 
19910de0904SEnrico Granata     return true;
20010de0904SEnrico Granata }
20110de0904SEnrico Granata 
20210de0904SEnrico Granata lldb_private::Declaration *
20310de0904SEnrico Granata SBDeclaration::get ()
20410de0904SEnrico Granata {
20510de0904SEnrico Granata     return m_opaque_ap.get();
20610de0904SEnrico Granata }
207