18d48cd60SZachary Turner //===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===//
210de0904SEnrico Granata //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
610de0904SEnrico Granata //
710de0904SEnrico Granata //===----------------------------------------------------------------------===//
810de0904SEnrico Granata 
910de0904SEnrico Granata #include "lldb/API/SBDeclaration.h"
1010de0904SEnrico Granata #include "lldb/API/SBStream.h"
118d48cd60SZachary Turner #include "lldb/Host/PosixApi.h"
1210de0904SEnrico Granata #include "lldb/Symbol/Declaration.h"
136f9e6901SZachary Turner #include "lldb/Utility/Log.h"
14bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1510de0904SEnrico Granata 
16df3df25aSGreg Clayton #include <limits.h>
17df3df25aSGreg Clayton 
1810de0904SEnrico Granata using namespace lldb;
1910de0904SEnrico Granata using namespace lldb_private;
2010de0904SEnrico Granata 
21b9c1b51eSKate Stone SBDeclaration::SBDeclaration() : m_opaque_ap() {}
2210de0904SEnrico Granata 
23b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_ap() {
2410de0904SEnrico Granata   if (rhs.IsValid())
2510de0904SEnrico Granata     ref() = rhs.ref();
2610de0904SEnrico Granata }
2710de0904SEnrico Granata 
28b9c1b51eSKate Stone SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr)
29b9c1b51eSKate Stone     : m_opaque_ap() {
3010de0904SEnrico Granata   if (lldb_object_ptr)
3110de0904SEnrico Granata     ref() = *lldb_object_ptr;
3210de0904SEnrico Granata }
3310de0904SEnrico Granata 
34b9c1b51eSKate Stone const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
35b9c1b51eSKate Stone   if (this != &rhs) {
3610de0904SEnrico Granata     if (rhs.IsValid())
3710de0904SEnrico Granata       ref() = rhs.ref();
3810de0904SEnrico Granata     else
3910de0904SEnrico Granata       m_opaque_ap.reset();
4010de0904SEnrico Granata   }
4110de0904SEnrico Granata   return *this;
4210de0904SEnrico Granata }
4310de0904SEnrico Granata 
44b9c1b51eSKate Stone void SBDeclaration::SetDeclaration(
45b9c1b51eSKate Stone     const lldb_private::Declaration &lldb_object_ref) {
4610de0904SEnrico Granata   ref() = lldb_object_ref;
4710de0904SEnrico Granata }
4810de0904SEnrico Granata 
49b9c1b51eSKate Stone SBDeclaration::~SBDeclaration() {}
5010de0904SEnrico Granata 
51b9c1b51eSKate Stone bool SBDeclaration::IsValid() const {
5210de0904SEnrico Granata   return m_opaque_ap.get() && m_opaque_ap->IsValid();
5310de0904SEnrico Granata }
5410de0904SEnrico Granata 
55b9c1b51eSKate Stone SBFileSpec SBDeclaration::GetFileSpec() const {
565160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5710de0904SEnrico Granata 
5810de0904SEnrico Granata   SBFileSpec sb_file_spec;
5910de0904SEnrico Granata   if (m_opaque_ap.get() && m_opaque_ap->GetFile())
6010de0904SEnrico Granata     sb_file_spec.SetFileSpec(m_opaque_ap->GetFile());
6110de0904SEnrico Granata 
62b9c1b51eSKate Stone   if (log) {
6310de0904SEnrico Granata     SBStream sstr;
6410de0904SEnrico Granata     sb_file_spec.GetDescription(sstr);
65324a1036SSaleem Abdulrasool     log->Printf("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s",
66324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()),
67b9c1b51eSKate Stone                 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
6810de0904SEnrico Granata   }
6910de0904SEnrico Granata 
7010de0904SEnrico Granata   return sb_file_spec;
7110de0904SEnrico Granata }
7210de0904SEnrico Granata 
73b9c1b51eSKate Stone uint32_t SBDeclaration::GetLine() const {
745160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
7510de0904SEnrico Granata 
7610de0904SEnrico Granata   uint32_t line = 0;
773447077aSJonas Devlieghere   if (m_opaque_ap)
7810de0904SEnrico Granata     line = m_opaque_ap->GetLine();
7910de0904SEnrico Granata 
8010de0904SEnrico Granata   if (log)
81324a1036SSaleem Abdulrasool     log->Printf("SBLineEntry(%p)::GetLine () => %u",
82324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ap.get()), line);
8310de0904SEnrico Granata 
8410de0904SEnrico Granata   return line;
8510de0904SEnrico Granata }
8610de0904SEnrico Granata 
87b9c1b51eSKate Stone uint32_t SBDeclaration::GetColumn() const {
883447077aSJonas Devlieghere   if (m_opaque_ap)
8910de0904SEnrico Granata     return m_opaque_ap->GetColumn();
9010de0904SEnrico Granata   return 0;
9110de0904SEnrico Granata }
9210de0904SEnrico Granata 
93b9c1b51eSKate Stone void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
9410de0904SEnrico Granata   if (filespec.IsValid())
9510de0904SEnrico Granata     ref().SetFile(filespec.ref());
9610de0904SEnrico Granata   else
9710de0904SEnrico Granata     ref().SetFile(FileSpec());
9810de0904SEnrico Granata }
99b9c1b51eSKate Stone void SBDeclaration::SetLine(uint32_t line) { ref().SetLine(line); }
10010de0904SEnrico Granata 
101b9c1b51eSKate Stone void SBDeclaration::SetColumn(uint32_t column) { ref().SetColumn(column); }
10210de0904SEnrico Granata 
103b9c1b51eSKate Stone bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
10410de0904SEnrico Granata   lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
10510de0904SEnrico Granata   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
10610de0904SEnrico Granata 
10710de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
10810de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
10910de0904SEnrico Granata 
11010de0904SEnrico Granata   return lhs_ptr == rhs_ptr;
11110de0904SEnrico Granata }
11210de0904SEnrico Granata 
113b9c1b51eSKate Stone bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
11410de0904SEnrico Granata   lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
11510de0904SEnrico Granata   lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
11610de0904SEnrico Granata 
11710de0904SEnrico Granata   if (lhs_ptr && rhs_ptr)
11810de0904SEnrico Granata     return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
11910de0904SEnrico Granata 
12010de0904SEnrico Granata   return lhs_ptr != rhs_ptr;
12110de0904SEnrico Granata }
12210de0904SEnrico Granata 
123b9c1b51eSKate Stone const lldb_private::Declaration *SBDeclaration::operator->() const {
12410de0904SEnrico Granata   return m_opaque_ap.get();
12510de0904SEnrico Granata }
12610de0904SEnrico Granata 
127b9c1b51eSKate Stone lldb_private::Declaration &SBDeclaration::ref() {
1283447077aSJonas Devlieghere   if (m_opaque_ap == NULL)
12910de0904SEnrico Granata     m_opaque_ap.reset(new lldb_private::Declaration());
13010de0904SEnrico Granata   return *m_opaque_ap;
13110de0904SEnrico Granata }
13210de0904SEnrico Granata 
133b9c1b51eSKate Stone const lldb_private::Declaration &SBDeclaration::ref() const {
13410de0904SEnrico Granata   return *m_opaque_ap;
13510de0904SEnrico Granata }
13610de0904SEnrico Granata 
137b9c1b51eSKate Stone bool SBDeclaration::GetDescription(SBStream &description) {
13810de0904SEnrico Granata   Stream &strm = description.ref();
13910de0904SEnrico Granata 
1403447077aSJonas Devlieghere   if (m_opaque_ap) {
14110de0904SEnrico Granata     char file_path[PATH_MAX * 2];
14210de0904SEnrico Granata     m_opaque_ap->GetFile().GetPath(file_path, sizeof(file_path));
14310de0904SEnrico Granata     strm.Printf("%s:%u", file_path, GetLine());
14410de0904SEnrico Granata     if (GetColumn() > 0)
14510de0904SEnrico Granata       strm.Printf(":%u", GetColumn());
146b9c1b51eSKate Stone   } else
14710de0904SEnrico Granata     strm.PutCString("No value");
14810de0904SEnrico Granata 
14910de0904SEnrico Granata   return true;
15010de0904SEnrico Granata }
15110de0904SEnrico Granata 
152b9c1b51eSKate Stone lldb_private::Declaration *SBDeclaration::get() { return m_opaque_ap.get(); }
153