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"
10*baf5664fSJonas 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"
156f9e6901SZachary Turner #include "lldb/Utility/Log.h"
16bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1710de0904SEnrico Granata 
18df3df25aSGreg Clayton #include <limits.h>
19df3df25aSGreg Clayton 
2010de0904SEnrico Granata using namespace lldb;
2110de0904SEnrico Granata using namespace lldb_private;
2210de0904SEnrico Granata 
23*baf5664fSJonas Devlieghere SBDeclaration::SBDeclaration() : m_opaque_up() {
24*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDeclaration);
25*baf5664fSJonas Devlieghere }
2610de0904SEnrico Granata 
27d5b44036SJonas Devlieghere SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_up() {
28*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBDeclaration, (const lldb::SBDeclaration &), rhs);
29*baf5664fSJonas Devlieghere 
30bd4bf82aSJonas Devlieghere   m_opaque_up = clone(rhs.m_opaque_up);
3110de0904SEnrico Granata }
3210de0904SEnrico Granata 
33b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr)
34d5b44036SJonas Devlieghere     : m_opaque_up() {
3510de0904SEnrico Granata   if (lldb_object_ptr)
36bd4bf82aSJonas Devlieghere     m_opaque_up = llvm::make_unique<Declaration>(*lldb_object_ptr);
3710de0904SEnrico Granata }
3810de0904SEnrico Granata 
39b9c1b51eSKate Stone const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
40*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBDeclaration &,
41*baf5664fSJonas Devlieghere                      SBDeclaration, operator=,(const lldb::SBDeclaration &),
42*baf5664fSJonas Devlieghere                      rhs);
43*baf5664fSJonas Devlieghere 
44bd4bf82aSJonas Devlieghere   if (this != &rhs)
45bd4bf82aSJonas Devlieghere     m_opaque_up = clone(rhs.m_opaque_up);
4610de0904SEnrico Granata   return *this;
4710de0904SEnrico Granata }
4810de0904SEnrico Granata 
49b9c1b51eSKate Stone void SBDeclaration::SetDeclaration(
50b9c1b51eSKate Stone     const lldb_private::Declaration &lldb_object_ref) {
5110de0904SEnrico Granata   ref() = lldb_object_ref;
5210de0904SEnrico Granata }
5310de0904SEnrico Granata 
54b9c1b51eSKate Stone SBDeclaration::~SBDeclaration() {}
5510de0904SEnrico Granata 
56b9c1b51eSKate Stone bool SBDeclaration::IsValid() const {
57*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDeclaration, IsValid);
58*baf5664fSJonas Devlieghere 
59d5b44036SJonas Devlieghere   return m_opaque_up.get() && m_opaque_up->IsValid();
6010de0904SEnrico Granata }
6110de0904SEnrico Granata 
62b9c1b51eSKate Stone SBFileSpec SBDeclaration::GetFileSpec() const {
63*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBDeclaration,
64*baf5664fSJonas Devlieghere                                    GetFileSpec);
65*baf5664fSJonas Devlieghere 
665160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6710de0904SEnrico Granata 
6810de0904SEnrico Granata   SBFileSpec sb_file_spec;
69d5b44036SJonas Devlieghere   if (m_opaque_up.get() && m_opaque_up->GetFile())
70d5b44036SJonas Devlieghere     sb_file_spec.SetFileSpec(m_opaque_up->GetFile());
7110de0904SEnrico Granata 
72b9c1b51eSKate Stone   if (log) {
7310de0904SEnrico Granata     SBStream sstr;
7410de0904SEnrico Granata     sb_file_spec.GetDescription(sstr);
75324a1036SSaleem Abdulrasool     log->Printf("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s",
76d5b44036SJonas Devlieghere                 static_cast<void *>(m_opaque_up.get()),
77b9c1b51eSKate Stone                 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
7810de0904SEnrico Granata   }
7910de0904SEnrico Granata 
80*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
8110de0904SEnrico Granata }
8210de0904SEnrico Granata 
83b9c1b51eSKate Stone uint32_t SBDeclaration::GetLine() const {
84*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetLine);
85*baf5664fSJonas Devlieghere 
865160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
8710de0904SEnrico Granata 
8810de0904SEnrico Granata   uint32_t line = 0;
89d5b44036SJonas Devlieghere   if (m_opaque_up)
90d5b44036SJonas Devlieghere     line = m_opaque_up->GetLine();
9110de0904SEnrico Granata 
9210de0904SEnrico Granata   if (log)
93324a1036SSaleem Abdulrasool     log->Printf("SBLineEntry(%p)::GetLine () => %u",
94d5b44036SJonas Devlieghere                 static_cast<void *>(m_opaque_up.get()), line);
9510de0904SEnrico Granata 
9610de0904SEnrico Granata   return line;
9710de0904SEnrico Granata }
9810de0904SEnrico Granata 
99b9c1b51eSKate Stone uint32_t SBDeclaration::GetColumn() const {
100*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetColumn);
101*baf5664fSJonas Devlieghere 
102d5b44036SJonas Devlieghere   if (m_opaque_up)
103d5b44036SJonas Devlieghere     return m_opaque_up->GetColumn();
10410de0904SEnrico Granata   return 0;
10510de0904SEnrico Granata }
10610de0904SEnrico Granata 
107b9c1b51eSKate Stone void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
108*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDeclaration, SetFileSpec, (lldb::SBFileSpec),
109*baf5664fSJonas Devlieghere                      filespec);
110*baf5664fSJonas Devlieghere 
11110de0904SEnrico Granata   if (filespec.IsValid())
11210de0904SEnrico Granata     ref().SetFile(filespec.ref());
11310de0904SEnrico Granata   else
11410de0904SEnrico Granata     ref().SetFile(FileSpec());
11510de0904SEnrico Granata }
116*baf5664fSJonas Devlieghere void SBDeclaration::SetLine(uint32_t line) {
117*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDeclaration, SetLine, (uint32_t), line);
11810de0904SEnrico Granata 
119*baf5664fSJonas Devlieghere   ref().SetLine(line);
120*baf5664fSJonas Devlieghere }
121*baf5664fSJonas Devlieghere 
122*baf5664fSJonas Devlieghere void SBDeclaration::SetColumn(uint32_t column) {
123*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBDeclaration, SetColumn, (uint32_t), column);
124*baf5664fSJonas Devlieghere 
125*baf5664fSJonas Devlieghere   ref().SetColumn(column);
126*baf5664fSJonas Devlieghere }
12710de0904SEnrico Granata 
128b9c1b51eSKate Stone bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
129*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
130*baf5664fSJonas Devlieghere       bool, SBDeclaration, operator==,(const lldb::SBDeclaration &), rhs);
131*baf5664fSJonas Devlieghere 
132d5b44036SJonas Devlieghere   lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
133d5b44036SJonas Devlieghere   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
13410de0904SEnrico Granata 
13510de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
13610de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
13710de0904SEnrico Granata 
13810de0904SEnrico Granata   return lhs_ptr == rhs_ptr;
13910de0904SEnrico Granata }
14010de0904SEnrico Granata 
141b9c1b51eSKate Stone bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
142*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
143*baf5664fSJonas Devlieghere       bool, SBDeclaration, operator!=,(const lldb::SBDeclaration &), rhs);
144*baf5664fSJonas Devlieghere 
145d5b44036SJonas Devlieghere   lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
146d5b44036SJonas Devlieghere   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
14710de0904SEnrico Granata 
14810de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
14910de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
15010de0904SEnrico Granata 
15110de0904SEnrico Granata   return lhs_ptr != rhs_ptr;
15210de0904SEnrico Granata }
15310de0904SEnrico Granata 
154b9c1b51eSKate Stone const lldb_private::Declaration *SBDeclaration::operator->() const {
155d5b44036SJonas Devlieghere   return m_opaque_up.get();
15610de0904SEnrico Granata }
15710de0904SEnrico Granata 
158b9c1b51eSKate Stone lldb_private::Declaration &SBDeclaration::ref() {
159d5b44036SJonas Devlieghere   if (m_opaque_up == NULL)
160d5b44036SJonas Devlieghere     m_opaque_up.reset(new lldb_private::Declaration());
161d5b44036SJonas Devlieghere   return *m_opaque_up;
16210de0904SEnrico Granata }
16310de0904SEnrico Granata 
164b9c1b51eSKate Stone const lldb_private::Declaration &SBDeclaration::ref() const {
165d5b44036SJonas Devlieghere   return *m_opaque_up;
16610de0904SEnrico Granata }
16710de0904SEnrico Granata 
168b9c1b51eSKate Stone bool SBDeclaration::GetDescription(SBStream &description) {
169*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBDeclaration, GetDescription, (lldb::SBStream &),
170*baf5664fSJonas Devlieghere                      description);
171*baf5664fSJonas Devlieghere 
17210de0904SEnrico Granata   Stream &strm = description.ref();
17310de0904SEnrico Granata 
174d5b44036SJonas Devlieghere   if (m_opaque_up) {
17510de0904SEnrico Granata     char file_path[PATH_MAX * 2];
176d5b44036SJonas Devlieghere     m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path));
17710de0904SEnrico Granata     strm.Printf("%s:%u", file_path, GetLine());
17810de0904SEnrico Granata     if (GetColumn() > 0)
17910de0904SEnrico Granata       strm.Printf(":%u", GetColumn());
180b9c1b51eSKate Stone   } else
18110de0904SEnrico Granata     strm.PutCString("No value");
18210de0904SEnrico Granata 
18310de0904SEnrico Granata   return true;
18410de0904SEnrico Granata }
18510de0904SEnrico Granata 
186d5b44036SJonas Devlieghere lldb_private::Declaration *SBDeclaration::get() { return m_opaque_up.get(); }
187