18d48cd60SZachary Turner //===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===//
210de0904SEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
610de0904SEnrico Granata //
710de0904SEnrico Granata //===----------------------------------------------------------------------===//
810de0904SEnrico Granata 
910de0904SEnrico Granata #include "lldb/API/SBDeclaration.h"
10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
11bd4bf82aSJonas Devlieghere #include "Utils.h"
1210de0904SEnrico Granata #include "lldb/API/SBStream.h"
138d48cd60SZachary Turner #include "lldb/Host/PosixApi.h"
1410de0904SEnrico Granata #include "lldb/Symbol/Declaration.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 
22baf5664fSJonas Devlieghere SBDeclaration::SBDeclaration() : m_opaque_up() {
23baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDeclaration);
24baf5664fSJonas Devlieghere }
2510de0904SEnrico Granata 
26d5b44036SJonas Devlieghere SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_up() {
27baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBDeclaration, (const lldb::SBDeclaration &), rhs);
28baf5664fSJonas Devlieghere 
29bd4bf82aSJonas Devlieghere   m_opaque_up = clone(rhs.m_opaque_up);
3010de0904SEnrico Granata }
3110de0904SEnrico Granata 
32b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr)
33d5b44036SJonas Devlieghere     : m_opaque_up() {
3410de0904SEnrico Granata   if (lldb_object_ptr)
35bd4bf82aSJonas Devlieghere     m_opaque_up = llvm::make_unique<Declaration>(*lldb_object_ptr);
3610de0904SEnrico Granata }
3710de0904SEnrico Granata 
38b9c1b51eSKate Stone const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
39baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBDeclaration &,
40baf5664fSJonas Devlieghere                      SBDeclaration, operator=,(const lldb::SBDeclaration &),
41baf5664fSJonas Devlieghere                      rhs);
42baf5664fSJonas Devlieghere 
43bd4bf82aSJonas Devlieghere   if (this != &rhs)
44bd4bf82aSJonas Devlieghere     m_opaque_up = clone(rhs.m_opaque_up);
45*306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
4610de0904SEnrico Granata }
4710de0904SEnrico Granata 
48b9c1b51eSKate Stone void SBDeclaration::SetDeclaration(
49b9c1b51eSKate Stone     const lldb_private::Declaration &lldb_object_ref) {
5010de0904SEnrico Granata   ref() = lldb_object_ref;
5110de0904SEnrico Granata }
5210de0904SEnrico Granata 
53b9c1b51eSKate Stone SBDeclaration::~SBDeclaration() {}
5410de0904SEnrico Granata 
55b9c1b51eSKate Stone bool SBDeclaration::IsValid() const {
56baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDeclaration, IsValid);
577f5237bcSPavel Labath   return this->operator bool();
587f5237bcSPavel Labath }
597f5237bcSPavel Labath SBDeclaration::operator bool() const {
607f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDeclaration, operator bool);
61baf5664fSJonas Devlieghere 
62d5b44036SJonas Devlieghere   return m_opaque_up.get() && m_opaque_up->IsValid();
6310de0904SEnrico Granata }
6410de0904SEnrico Granata 
65b9c1b51eSKate Stone SBFileSpec SBDeclaration::GetFileSpec() const {
66baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBDeclaration,
67baf5664fSJonas Devlieghere                                    GetFileSpec);
68baf5664fSJonas Devlieghere 
6910de0904SEnrico Granata 
7010de0904SEnrico Granata   SBFileSpec sb_file_spec;
71d5b44036SJonas Devlieghere   if (m_opaque_up.get() && m_opaque_up->GetFile())
72d5b44036SJonas Devlieghere     sb_file_spec.SetFileSpec(m_opaque_up->GetFile());
7310de0904SEnrico Granata 
7410de0904SEnrico Granata 
75baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
7610de0904SEnrico Granata }
7710de0904SEnrico Granata 
78b9c1b51eSKate Stone uint32_t SBDeclaration::GetLine() const {
79baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetLine);
80baf5664fSJonas Devlieghere 
8110de0904SEnrico Granata 
8210de0904SEnrico Granata   uint32_t line = 0;
83d5b44036SJonas Devlieghere   if (m_opaque_up)
84d5b44036SJonas Devlieghere     line = m_opaque_up->GetLine();
8510de0904SEnrico Granata 
8610de0904SEnrico Granata 
8710de0904SEnrico Granata   return line;
8810de0904SEnrico Granata }
8910de0904SEnrico Granata 
90b9c1b51eSKate Stone uint32_t SBDeclaration::GetColumn() const {
91baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetColumn);
92baf5664fSJonas Devlieghere 
93d5b44036SJonas Devlieghere   if (m_opaque_up)
94d5b44036SJonas Devlieghere     return m_opaque_up->GetColumn();
9510de0904SEnrico Granata   return 0;
9610de0904SEnrico Granata }
9710de0904SEnrico Granata 
98b9c1b51eSKate Stone void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
99baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDeclaration, SetFileSpec, (lldb::SBFileSpec),
100baf5664fSJonas Devlieghere                      filespec);
101baf5664fSJonas Devlieghere 
10210de0904SEnrico Granata   if (filespec.IsValid())
10310de0904SEnrico Granata     ref().SetFile(filespec.ref());
10410de0904SEnrico Granata   else
10510de0904SEnrico Granata     ref().SetFile(FileSpec());
10610de0904SEnrico Granata }
107baf5664fSJonas Devlieghere void SBDeclaration::SetLine(uint32_t line) {
108baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDeclaration, SetLine, (uint32_t), line);
10910de0904SEnrico Granata 
110baf5664fSJonas Devlieghere   ref().SetLine(line);
111baf5664fSJonas Devlieghere }
112baf5664fSJonas Devlieghere 
113baf5664fSJonas Devlieghere void SBDeclaration::SetColumn(uint32_t column) {
114baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDeclaration, SetColumn, (uint32_t), column);
115baf5664fSJonas Devlieghere 
116baf5664fSJonas Devlieghere   ref().SetColumn(column);
117baf5664fSJonas Devlieghere }
11810de0904SEnrico Granata 
119b9c1b51eSKate Stone bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
120baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
121baf5664fSJonas Devlieghere       bool, SBDeclaration, operator==,(const lldb::SBDeclaration &), rhs);
122baf5664fSJonas Devlieghere 
123d5b44036SJonas Devlieghere   lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
124d5b44036SJonas Devlieghere   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
12510de0904SEnrico Granata 
12610de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
12710de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
12810de0904SEnrico Granata 
12910de0904SEnrico Granata   return lhs_ptr == rhs_ptr;
13010de0904SEnrico Granata }
13110de0904SEnrico Granata 
132b9c1b51eSKate Stone bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
133baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
134baf5664fSJonas Devlieghere       bool, SBDeclaration, operator!=,(const lldb::SBDeclaration &), rhs);
135baf5664fSJonas Devlieghere 
136d5b44036SJonas Devlieghere   lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
137d5b44036SJonas Devlieghere   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
13810de0904SEnrico Granata 
13910de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
14010de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
14110de0904SEnrico Granata 
14210de0904SEnrico Granata   return lhs_ptr != rhs_ptr;
14310de0904SEnrico Granata }
14410de0904SEnrico Granata 
145b9c1b51eSKate Stone const lldb_private::Declaration *SBDeclaration::operator->() const {
146d5b44036SJonas Devlieghere   return m_opaque_up.get();
14710de0904SEnrico Granata }
14810de0904SEnrico Granata 
149b9c1b51eSKate Stone lldb_private::Declaration &SBDeclaration::ref() {
150d5b44036SJonas Devlieghere   if (m_opaque_up == NULL)
151d5b44036SJonas Devlieghere     m_opaque_up.reset(new lldb_private::Declaration());
152d5b44036SJonas Devlieghere   return *m_opaque_up;
15310de0904SEnrico Granata }
15410de0904SEnrico Granata 
155b9c1b51eSKate Stone const lldb_private::Declaration &SBDeclaration::ref() const {
156d5b44036SJonas Devlieghere   return *m_opaque_up;
15710de0904SEnrico Granata }
15810de0904SEnrico Granata 
159b9c1b51eSKate Stone bool SBDeclaration::GetDescription(SBStream &description) {
160baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDeclaration, GetDescription, (lldb::SBStream &),
161baf5664fSJonas Devlieghere                      description);
162baf5664fSJonas Devlieghere 
16310de0904SEnrico Granata   Stream &strm = description.ref();
16410de0904SEnrico Granata 
165d5b44036SJonas Devlieghere   if (m_opaque_up) {
16610de0904SEnrico Granata     char file_path[PATH_MAX * 2];
167d5b44036SJonas Devlieghere     m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path));
16810de0904SEnrico Granata     strm.Printf("%s:%u", file_path, GetLine());
16910de0904SEnrico Granata     if (GetColumn() > 0)
17010de0904SEnrico Granata       strm.Printf(":%u", GetColumn());
171b9c1b51eSKate Stone   } else
17210de0904SEnrico Granata     strm.PutCString("No value");
17310de0904SEnrico Granata 
17410de0904SEnrico Granata   return true;
17510de0904SEnrico Granata }
17610de0904SEnrico Granata 
177d5b44036SJonas Devlieghere lldb_private::Declaration *SBDeclaration::get() { return m_opaque_up.get(); }
178ae211eceSMichal Gorny 
179ae211eceSMichal Gorny namespace lldb_private {
180ae211eceSMichal Gorny namespace repro {
181ae211eceSMichal Gorny 
182ae211eceSMichal Gorny template <>
183ae211eceSMichal Gorny void RegisterMethods<SBDeclaration>(Registry &R) {
184ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDeclaration, ());
185ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBDeclaration, (const lldb::SBDeclaration &));
186ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
187ae211eceSMichal Gorny       const lldb::SBDeclaration &,
188ae211eceSMichal Gorny       SBDeclaration, operator=,(const lldb::SBDeclaration &));
189ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDeclaration, IsValid, ());
190ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBDeclaration, operator bool, ());
191ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBDeclaration, GetFileSpec,
192ae211eceSMichal Gorny                              ());
193ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBDeclaration, GetLine, ());
194ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBDeclaration, GetColumn, ());
195ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDeclaration, SetFileSpec, (lldb::SBFileSpec));
196ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDeclaration, SetLine, (uint32_t));
197ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(void, SBDeclaration, SetColumn, (uint32_t));
198ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(
199ae211eceSMichal Gorny       bool, SBDeclaration, operator==,(const lldb::SBDeclaration &));
200ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(
201ae211eceSMichal Gorny       bool, SBDeclaration, operator!=,(const lldb::SBDeclaration &));
202ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBDeclaration, GetDescription,
203ae211eceSMichal Gorny                        (lldb::SBStream &));
204ae211eceSMichal Gorny }
205ae211eceSMichal Gorny 
206ae211eceSMichal Gorny }
207ae211eceSMichal Gorny }
208