1*0b57cec5SDimitry Andric //===-- SBDeclaration.cpp -------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #include "lldb/API/SBDeclaration.h"
10*0b57cec5SDimitry Andric #include "Utils.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
12*0b57cec5SDimitry Andric #include "lldb/Core/Declaration.h"
13*0b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h"
14*0b57cec5SDimitry Andric #include "lldb/Utility/Instrumentation.h"
15*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric #include <climits>
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric using namespace lldb;
20*0b57cec5SDimitry Andric using namespace lldb_private;
21*0b57cec5SDimitry Andric 
SBDeclaration()22*0b57cec5SDimitry Andric SBDeclaration::SBDeclaration() { LLDB_INSTRUMENT_VA(this); }
23*0b57cec5SDimitry Andric 
SBDeclaration(const SBDeclaration & rhs)24*0b57cec5SDimitry Andric SBDeclaration::SBDeclaration(const SBDeclaration &rhs) {
25*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
28*0b57cec5SDimitry Andric }
29*0b57cec5SDimitry Andric 
SBDeclaration(const lldb_private::Declaration * lldb_object_ptr)30*0b57cec5SDimitry Andric SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr) {
31*0b57cec5SDimitry Andric   if (lldb_object_ptr)
32*0b57cec5SDimitry Andric     m_opaque_up = std::make_unique<Declaration>(*lldb_object_ptr);
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric 
operator =(const SBDeclaration & rhs)35*0b57cec5SDimitry Andric const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
36*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
37*0b57cec5SDimitry Andric 
38*0b57cec5SDimitry Andric   if (this != &rhs)
39*0b57cec5SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
40*0b57cec5SDimitry Andric   return *this;
41*0b57cec5SDimitry Andric }
42*0b57cec5SDimitry Andric 
SetDeclaration(const lldb_private::Declaration & lldb_object_ref)43*0b57cec5SDimitry Andric void SBDeclaration::SetDeclaration(
44*0b57cec5SDimitry Andric     const lldb_private::Declaration &lldb_object_ref) {
45*0b57cec5SDimitry Andric   ref() = lldb_object_ref;
46*0b57cec5SDimitry Andric }
47*0b57cec5SDimitry Andric 
48*0b57cec5SDimitry Andric SBDeclaration::~SBDeclaration() = default;
49*0b57cec5SDimitry Andric 
IsValid() const50*0b57cec5SDimitry Andric bool SBDeclaration::IsValid() const {
51*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
52*0b57cec5SDimitry Andric   return this->operator bool();
53*0b57cec5SDimitry Andric }
operator bool() const54*0b57cec5SDimitry Andric SBDeclaration::operator bool() const {
55*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
56*0b57cec5SDimitry Andric 
57*0b57cec5SDimitry Andric   return m_opaque_up.get() && m_opaque_up->IsValid();
58*0b57cec5SDimitry Andric }
59*0b57cec5SDimitry Andric 
GetFileSpec() const60*0b57cec5SDimitry Andric SBFileSpec SBDeclaration::GetFileSpec() const {
61*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
62*0b57cec5SDimitry Andric 
63*0b57cec5SDimitry Andric   SBFileSpec sb_file_spec;
64*0b57cec5SDimitry Andric   if (m_opaque_up.get() && m_opaque_up->GetFile())
65*0b57cec5SDimitry Andric     sb_file_spec.SetFileSpec(m_opaque_up->GetFile());
66*0b57cec5SDimitry Andric 
67*0b57cec5SDimitry Andric   return sb_file_spec;
68*0b57cec5SDimitry Andric }
69*0b57cec5SDimitry Andric 
GetLine() const70*0b57cec5SDimitry Andric uint32_t SBDeclaration::GetLine() const {
71*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
72*0b57cec5SDimitry Andric 
73*0b57cec5SDimitry Andric   uint32_t line = 0;
74*0b57cec5SDimitry Andric   if (m_opaque_up)
75*0b57cec5SDimitry Andric     line = m_opaque_up->GetLine();
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric 
78*0b57cec5SDimitry Andric   return line;
79*0b57cec5SDimitry Andric }
80*0b57cec5SDimitry Andric 
GetColumn() const81*0b57cec5SDimitry Andric uint32_t SBDeclaration::GetColumn() const {
82*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this);
83*0b57cec5SDimitry Andric 
84*0b57cec5SDimitry Andric   if (m_opaque_up)
85*0b57cec5SDimitry Andric     return m_opaque_up->GetColumn();
86*0b57cec5SDimitry Andric   return 0;
87*0b57cec5SDimitry Andric }
88*0b57cec5SDimitry Andric 
SetFileSpec(lldb::SBFileSpec filespec)89*0b57cec5SDimitry Andric void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
90*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, filespec);
91*0b57cec5SDimitry Andric 
92*0b57cec5SDimitry Andric   if (filespec.IsValid())
93*0b57cec5SDimitry Andric     ref().SetFile(filespec.ref());
94*0b57cec5SDimitry Andric   else
95*0b57cec5SDimitry Andric     ref().SetFile(FileSpec());
96*0b57cec5SDimitry Andric }
SetLine(uint32_t line)97*0b57cec5SDimitry Andric void SBDeclaration::SetLine(uint32_t line) {
98*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, line);
99*0b57cec5SDimitry Andric 
100*0b57cec5SDimitry Andric   ref().SetLine(line);
101*0b57cec5SDimitry Andric }
102*0b57cec5SDimitry Andric 
SetColumn(uint32_t column)103*0b57cec5SDimitry Andric void SBDeclaration::SetColumn(uint32_t column) {
104*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, column);
105*0b57cec5SDimitry Andric 
106*0b57cec5SDimitry Andric   ref().SetColumn(column);
107*0b57cec5SDimitry Andric }
108*0b57cec5SDimitry Andric 
operator ==(const SBDeclaration & rhs) const109*0b57cec5SDimitry Andric bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
110*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
111*0b57cec5SDimitry Andric 
112*0b57cec5SDimitry Andric   lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
113*0b57cec5SDimitry Andric   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
114*0b57cec5SDimitry Andric 
115*0b57cec5SDimitry Andric   if (lhs_ptr && rhs_ptr)
116*0b57cec5SDimitry Andric     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
117*0b57cec5SDimitry Andric 
118*0b57cec5SDimitry Andric   return lhs_ptr == rhs_ptr;
119*0b57cec5SDimitry Andric }
120*0b57cec5SDimitry Andric 
operator !=(const SBDeclaration & rhs) const121*0b57cec5SDimitry Andric bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
122*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
123*0b57cec5SDimitry Andric 
124*0b57cec5SDimitry Andric   lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
125*0b57cec5SDimitry Andric   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
126*0b57cec5SDimitry Andric 
127*0b57cec5SDimitry Andric   if (lhs_ptr && rhs_ptr)
128*0b57cec5SDimitry Andric     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
129*0b57cec5SDimitry Andric 
130*0b57cec5SDimitry Andric   return lhs_ptr != rhs_ptr;
131*0b57cec5SDimitry Andric }
132*0b57cec5SDimitry Andric 
operator ->() const133*0b57cec5SDimitry Andric const lldb_private::Declaration *SBDeclaration::operator->() const {
134*0b57cec5SDimitry Andric   return m_opaque_up.get();
135*0b57cec5SDimitry Andric }
136*0b57cec5SDimitry Andric 
ref()137*0b57cec5SDimitry Andric lldb_private::Declaration &SBDeclaration::ref() {
138*0b57cec5SDimitry Andric   if (m_opaque_up == nullptr)
139*0b57cec5SDimitry Andric     m_opaque_up = std::make_unique<lldb_private::Declaration>();
140*0b57cec5SDimitry Andric   return *m_opaque_up;
141*0b57cec5SDimitry Andric }
142*0b57cec5SDimitry Andric 
ref() const143*0b57cec5SDimitry Andric const lldb_private::Declaration &SBDeclaration::ref() const {
144*0b57cec5SDimitry Andric   return *m_opaque_up;
145*0b57cec5SDimitry Andric }
146*0b57cec5SDimitry Andric 
GetDescription(SBStream & description)147*0b57cec5SDimitry Andric bool SBDeclaration::GetDescription(SBStream &description) {
148*0b57cec5SDimitry Andric   LLDB_INSTRUMENT_VA(this, description);
149*0b57cec5SDimitry Andric 
150*0b57cec5SDimitry Andric   Stream &strm = description.ref();
151*0b57cec5SDimitry Andric 
152*0b57cec5SDimitry Andric   if (m_opaque_up) {
153*0b57cec5SDimitry Andric     char file_path[PATH_MAX * 2];
154*0b57cec5SDimitry Andric     m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path));
155*0b57cec5SDimitry Andric     strm.Printf("%s:%u", file_path, GetLine());
156*0b57cec5SDimitry Andric     if (GetColumn() > 0)
157*0b57cec5SDimitry Andric       strm.Printf(":%u", GetColumn());
158*0b57cec5SDimitry Andric   } else
159*0b57cec5SDimitry Andric     strm.PutCString("No value");
160*0b57cec5SDimitry Andric 
161*0b57cec5SDimitry Andric   return true;
162*0b57cec5SDimitry Andric }
163*0b57cec5SDimitry Andric 
get()164*0b57cec5SDimitry Andric lldb_private::Declaration *SBDeclaration::get() { return m_opaque_up.get(); }
165*0b57cec5SDimitry Andric