1*10de0904SEnrico Granata //===-- SBDeclaration.cpp -----------------------------------------*- C++ -*-===//
2*10de0904SEnrico Granata //
3*10de0904SEnrico Granata //                     The LLVM Compiler Infrastructure
4*10de0904SEnrico Granata //
5*10de0904SEnrico Granata // This file is distributed under the University of Illinois Open Source
6*10de0904SEnrico Granata // License. See LICENSE.TXT for details.
7*10de0904SEnrico Granata //
8*10de0904SEnrico Granata //===----------------------------------------------------------------------===//
9*10de0904SEnrico Granata 
10*10de0904SEnrico Granata #include "lldb/API/SBDeclaration.h"
11*10de0904SEnrico Granata #include "lldb/API/SBStream.h"
12*10de0904SEnrico Granata #include "lldb/Core/Log.h"
13*10de0904SEnrico Granata #include "lldb/Core/Stream.h"
14*10de0904SEnrico Granata #include "lldb/Symbol/Declaration.h"
15*10de0904SEnrico Granata 
16*10de0904SEnrico Granata using namespace lldb;
17*10de0904SEnrico Granata using namespace lldb_private;
18*10de0904SEnrico Granata 
19*10de0904SEnrico Granata 
20*10de0904SEnrico Granata SBDeclaration::SBDeclaration () :
21*10de0904SEnrico Granata     m_opaque_ap ()
22*10de0904SEnrico Granata {
23*10de0904SEnrico Granata }
24*10de0904SEnrico Granata 
25*10de0904SEnrico Granata SBDeclaration::SBDeclaration (const SBDeclaration &rhs) :
26*10de0904SEnrico Granata     m_opaque_ap ()
27*10de0904SEnrico Granata {
28*10de0904SEnrico Granata     if (rhs.IsValid())
29*10de0904SEnrico Granata         ref() = rhs.ref();
30*10de0904SEnrico Granata }
31*10de0904SEnrico Granata 
32*10de0904SEnrico Granata SBDeclaration::SBDeclaration (const lldb_private::Declaration *lldb_object_ptr) :
33*10de0904SEnrico Granata     m_opaque_ap ()
34*10de0904SEnrico Granata {
35*10de0904SEnrico Granata     if (lldb_object_ptr)
36*10de0904SEnrico Granata         ref() = *lldb_object_ptr;
37*10de0904SEnrico Granata }
38*10de0904SEnrico Granata 
39*10de0904SEnrico Granata const SBDeclaration &
40*10de0904SEnrico Granata SBDeclaration::operator = (const SBDeclaration &rhs)
41*10de0904SEnrico Granata {
42*10de0904SEnrico Granata     if (this != &rhs)
43*10de0904SEnrico Granata     {
44*10de0904SEnrico Granata         if (rhs.IsValid())
45*10de0904SEnrico Granata             ref() = rhs.ref();
46*10de0904SEnrico Granata         else
47*10de0904SEnrico Granata             m_opaque_ap.reset();
48*10de0904SEnrico Granata     }
49*10de0904SEnrico Granata     return *this;
50*10de0904SEnrico Granata }
51*10de0904SEnrico Granata 
52*10de0904SEnrico Granata void
53*10de0904SEnrico Granata SBDeclaration::SetDeclaration (const lldb_private::Declaration &lldb_object_ref)
54*10de0904SEnrico Granata {
55*10de0904SEnrico Granata     ref() = lldb_object_ref;
56*10de0904SEnrico Granata }
57*10de0904SEnrico Granata 
58*10de0904SEnrico Granata 
59*10de0904SEnrico Granata SBDeclaration::~SBDeclaration ()
60*10de0904SEnrico Granata {
61*10de0904SEnrico Granata }
62*10de0904SEnrico Granata 
63*10de0904SEnrico Granata 
64*10de0904SEnrico Granata bool
65*10de0904SEnrico Granata SBDeclaration::IsValid () const
66*10de0904SEnrico Granata {
67*10de0904SEnrico Granata     return m_opaque_ap.get() && m_opaque_ap->IsValid();
68*10de0904SEnrico Granata }
69*10de0904SEnrico Granata 
70*10de0904SEnrico Granata 
71*10de0904SEnrico Granata SBFileSpec
72*10de0904SEnrico Granata SBDeclaration::GetFileSpec () const
73*10de0904SEnrico Granata {
74*10de0904SEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
75*10de0904SEnrico Granata 
76*10de0904SEnrico Granata     SBFileSpec sb_file_spec;
77*10de0904SEnrico Granata     if (m_opaque_ap.get() && m_opaque_ap->GetFile())
78*10de0904SEnrico Granata         sb_file_spec.SetFileSpec(m_opaque_ap->GetFile());
79*10de0904SEnrico Granata 
80*10de0904SEnrico Granata     if (log)
81*10de0904SEnrico Granata     {
82*10de0904SEnrico Granata         SBStream sstr;
83*10de0904SEnrico Granata         sb_file_spec.GetDescription (sstr);
84*10de0904SEnrico Granata         log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(),
85*10de0904SEnrico Granata                      sb_file_spec.get(), sstr.GetData());
86*10de0904SEnrico Granata     }
87*10de0904SEnrico Granata 
88*10de0904SEnrico Granata     return sb_file_spec;
89*10de0904SEnrico Granata }
90*10de0904SEnrico Granata 
91*10de0904SEnrico Granata uint32_t
92*10de0904SEnrico Granata SBDeclaration::GetLine () const
93*10de0904SEnrico Granata {
94*10de0904SEnrico Granata     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
95*10de0904SEnrico Granata 
96*10de0904SEnrico Granata     uint32_t line = 0;
97*10de0904SEnrico Granata     if (m_opaque_ap.get())
98*10de0904SEnrico Granata         line = m_opaque_ap->GetLine();
99*10de0904SEnrico Granata 
100*10de0904SEnrico Granata     if (log)
101*10de0904SEnrico Granata         log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line);
102*10de0904SEnrico Granata 
103*10de0904SEnrico Granata     return line;
104*10de0904SEnrico Granata }
105*10de0904SEnrico Granata 
106*10de0904SEnrico Granata 
107*10de0904SEnrico Granata uint32_t
108*10de0904SEnrico Granata SBDeclaration::GetColumn () const
109*10de0904SEnrico Granata {
110*10de0904SEnrico Granata     if (m_opaque_ap.get())
111*10de0904SEnrico Granata         return m_opaque_ap->GetColumn();
112*10de0904SEnrico Granata     return 0;
113*10de0904SEnrico Granata }
114*10de0904SEnrico Granata 
115*10de0904SEnrico Granata void
116*10de0904SEnrico Granata SBDeclaration::SetFileSpec (lldb::SBFileSpec filespec)
117*10de0904SEnrico Granata {
118*10de0904SEnrico Granata     if (filespec.IsValid())
119*10de0904SEnrico Granata         ref().SetFile(filespec.ref());
120*10de0904SEnrico Granata     else
121*10de0904SEnrico Granata         ref().SetFile(FileSpec());
122*10de0904SEnrico Granata }
123*10de0904SEnrico Granata void
124*10de0904SEnrico Granata SBDeclaration::SetLine (uint32_t line)
125*10de0904SEnrico Granata {
126*10de0904SEnrico Granata     ref().SetLine(line);
127*10de0904SEnrico Granata }
128*10de0904SEnrico Granata 
129*10de0904SEnrico Granata void
130*10de0904SEnrico Granata SBDeclaration::SetColumn (uint32_t column)
131*10de0904SEnrico Granata {
132*10de0904SEnrico Granata     ref().SetColumn(column);
133*10de0904SEnrico Granata }
134*10de0904SEnrico Granata 
135*10de0904SEnrico Granata 
136*10de0904SEnrico Granata 
137*10de0904SEnrico Granata bool
138*10de0904SEnrico Granata SBDeclaration::operator == (const SBDeclaration &rhs) const
139*10de0904SEnrico Granata {
140*10de0904SEnrico Granata     lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
141*10de0904SEnrico Granata     lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
142*10de0904SEnrico Granata 
143*10de0904SEnrico Granata     if (lhs_ptr && rhs_ptr)
144*10de0904SEnrico Granata         return lldb_private::Declaration::Compare (*lhs_ptr, *rhs_ptr) == 0;
145*10de0904SEnrico Granata 
146*10de0904SEnrico Granata     return lhs_ptr == rhs_ptr;
147*10de0904SEnrico Granata }
148*10de0904SEnrico Granata 
149*10de0904SEnrico Granata bool
150*10de0904SEnrico Granata SBDeclaration::operator != (const SBDeclaration &rhs) const
151*10de0904SEnrico Granata {
152*10de0904SEnrico Granata     lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
153*10de0904SEnrico Granata     lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
154*10de0904SEnrico Granata 
155*10de0904SEnrico Granata     if (lhs_ptr && rhs_ptr)
156*10de0904SEnrico Granata         return lldb_private::Declaration::Compare (*lhs_ptr, *rhs_ptr) != 0;
157*10de0904SEnrico Granata 
158*10de0904SEnrico Granata     return lhs_ptr != rhs_ptr;
159*10de0904SEnrico Granata }
160*10de0904SEnrico Granata 
161*10de0904SEnrico Granata const lldb_private::Declaration *
162*10de0904SEnrico Granata SBDeclaration::operator->() const
163*10de0904SEnrico Granata {
164*10de0904SEnrico Granata     return m_opaque_ap.get();
165*10de0904SEnrico Granata }
166*10de0904SEnrico Granata 
167*10de0904SEnrico Granata lldb_private::Declaration &
168*10de0904SEnrico Granata SBDeclaration::ref()
169*10de0904SEnrico Granata {
170*10de0904SEnrico Granata     if (m_opaque_ap.get() == NULL)
171*10de0904SEnrico Granata         m_opaque_ap.reset (new lldb_private::Declaration ());
172*10de0904SEnrico Granata     return *m_opaque_ap;
173*10de0904SEnrico Granata }
174*10de0904SEnrico Granata 
175*10de0904SEnrico Granata const lldb_private::Declaration &
176*10de0904SEnrico Granata SBDeclaration::ref() const
177*10de0904SEnrico Granata {
178*10de0904SEnrico Granata     return *m_opaque_ap;
179*10de0904SEnrico Granata }
180*10de0904SEnrico Granata 
181*10de0904SEnrico Granata bool
182*10de0904SEnrico Granata SBDeclaration::GetDescription (SBStream &description)
183*10de0904SEnrico Granata {
184*10de0904SEnrico Granata     Stream &strm = description.ref();
185*10de0904SEnrico Granata 
186*10de0904SEnrico Granata     if (m_opaque_ap.get())
187*10de0904SEnrico Granata     {
188*10de0904SEnrico Granata         char file_path[PATH_MAX*2];
189*10de0904SEnrico Granata         m_opaque_ap->GetFile().GetPath (file_path, sizeof (file_path));
190*10de0904SEnrico Granata         strm.Printf ("%s:%u", file_path, GetLine());
191*10de0904SEnrico Granata         if (GetColumn() > 0)
192*10de0904SEnrico Granata             strm.Printf (":%u", GetColumn());
193*10de0904SEnrico Granata     }
194*10de0904SEnrico Granata     else
195*10de0904SEnrico Granata         strm.PutCString ("No value");
196*10de0904SEnrico Granata 
197*10de0904SEnrico Granata     return true;
198*10de0904SEnrico Granata }
199*10de0904SEnrico Granata 
200*10de0904SEnrico Granata lldb_private::Declaration *
201*10de0904SEnrico Granata SBDeclaration::get ()
202*10de0904SEnrico Granata {
203*10de0904SEnrico Granata     return m_opaque_ap.get();
204*10de0904SEnrico Granata }
205