blob: a943c2cd8bbadf65f70885f165d5341a4ac8b6fa [file] [log] [blame]
Zachary Turner8d48cd62017-03-22 17:33:23 +00001//===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===//
Enrico Granata10de0902012-10-10 22:54:17 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Enrico Granata10de0902012-10-10 22:54:17 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBDeclaration.h"
10#include "lldb/API/SBStream.h"
Zachary Turner8d48cd62017-03-22 17:33:23 +000011#include "lldb/Host/PosixApi.h"
Enrico Granata10de0902012-10-10 22:54:17 +000012#include "lldb/Symbol/Declaration.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000013#include "lldb/Utility/Log.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000014#include "lldb/Utility/Stream.h"
Enrico Granata10de0902012-10-10 22:54:17 +000015
Greg Claytondf3df252012-10-12 16:23:23 +000016#include <limits.h>
17
Enrico Granata10de0902012-10-10 22:54:17 +000018using namespace lldb;
19using namespace lldb_private;
20
Kate Stoneb9c1b512016-09-06 20:57:50 +000021SBDeclaration::SBDeclaration() : m_opaque_ap() {}
Enrico Granata10de0902012-10-10 22:54:17 +000022
Kate Stoneb9c1b512016-09-06 20:57:50 +000023SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_ap() {
24 if (rhs.IsValid())
25 ref() = rhs.ref();
Enrico Granata10de0902012-10-10 22:54:17 +000026}
27
Kate Stoneb9c1b512016-09-06 20:57:50 +000028SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr)
29 : m_opaque_ap() {
30 if (lldb_object_ptr)
31 ref() = *lldb_object_ptr;
32}
33
34const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
35 if (this != &rhs) {
Enrico Granata10de0902012-10-10 22:54:17 +000036 if (rhs.IsValid())
Kate Stoneb9c1b512016-09-06 20:57:50 +000037 ref() = rhs.ref();
Enrico Granata10de0902012-10-10 22:54:17 +000038 else
Kate Stoneb9c1b512016-09-06 20:57:50 +000039 m_opaque_ap.reset();
40 }
41 return *this;
Enrico Granata10de0902012-10-10 22:54:17 +000042}
43
Kate Stoneb9c1b512016-09-06 20:57:50 +000044void SBDeclaration::SetDeclaration(
45 const lldb_private::Declaration &lldb_object_ref) {
46 ref() = lldb_object_ref;
Enrico Granata10de0902012-10-10 22:54:17 +000047}
48
Kate Stoneb9c1b512016-09-06 20:57:50 +000049SBDeclaration::~SBDeclaration() {}
Enrico Granata10de0902012-10-10 22:54:17 +000050
Kate Stoneb9c1b512016-09-06 20:57:50 +000051bool SBDeclaration::IsValid() const {
52 return m_opaque_ap.get() && m_opaque_ap->IsValid();
Enrico Granata10de0902012-10-10 22:54:17 +000053}
54
Kate Stoneb9c1b512016-09-06 20:57:50 +000055SBFileSpec SBDeclaration::GetFileSpec() const {
56 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
57
58 SBFileSpec sb_file_spec;
59 if (m_opaque_ap.get() && m_opaque_ap->GetFile())
60 sb_file_spec.SetFileSpec(m_opaque_ap->GetFile());
61
62 if (log) {
63 SBStream sstr;
64 sb_file_spec.GetDescription(sstr);
65 log->Printf("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s",
66 static_cast<void *>(m_opaque_ap.get()),
67 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
68 }
69
70 return sb_file_spec;
Enrico Granata10de0902012-10-10 22:54:17 +000071}
72
Kate Stoneb9c1b512016-09-06 20:57:50 +000073uint32_t SBDeclaration::GetLine() const {
74 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
75
76 uint32_t line = 0;
Jonas Devlieghere34470772018-12-20 21:02:55 +000077 if (m_opaque_ap)
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 line = m_opaque_ap->GetLine();
79
80 if (log)
81 log->Printf("SBLineEntry(%p)::GetLine () => %u",
82 static_cast<void *>(m_opaque_ap.get()), line);
83
84 return line;
Enrico Granata10de0902012-10-10 22:54:17 +000085}
86
Kate Stoneb9c1b512016-09-06 20:57:50 +000087uint32_t SBDeclaration::GetColumn() const {
Jonas Devlieghere34470772018-12-20 21:02:55 +000088 if (m_opaque_ap)
Kate Stoneb9c1b512016-09-06 20:57:50 +000089 return m_opaque_ap->GetColumn();
90 return 0;
Enrico Granata10de0902012-10-10 22:54:17 +000091}
92
Kate Stoneb9c1b512016-09-06 20:57:50 +000093void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
94 if (filespec.IsValid())
95 ref().SetFile(filespec.ref());
96 else
97 ref().SetFile(FileSpec());
98}
99void SBDeclaration::SetLine(uint32_t line) { ref().SetLine(line); }
100
101void SBDeclaration::SetColumn(uint32_t column) { ref().SetColumn(column); }
102
103bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
104 lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
105 lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
106
107 if (lhs_ptr && rhs_ptr)
108 return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
109
110 return lhs_ptr == rhs_ptr;
Enrico Granata10de0902012-10-10 22:54:17 +0000111}
112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
114 lldb_private::Declaration *lhs_ptr = m_opaque_ap.get();
115 lldb_private::Declaration *rhs_ptr = rhs.m_opaque_ap.get();
116
117 if (lhs_ptr && rhs_ptr)
118 return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
119
120 return lhs_ptr != rhs_ptr;
Enrico Granata10de0902012-10-10 22:54:17 +0000121}
122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123const lldb_private::Declaration *SBDeclaration::operator->() const {
124 return m_opaque_ap.get();
Enrico Granata10de0902012-10-10 22:54:17 +0000125}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126
127lldb_private::Declaration &SBDeclaration::ref() {
Jonas Devlieghere34470772018-12-20 21:02:55 +0000128 if (m_opaque_ap == NULL)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 m_opaque_ap.reset(new lldb_private::Declaration());
130 return *m_opaque_ap;
131}
132
133const lldb_private::Declaration &SBDeclaration::ref() const {
134 return *m_opaque_ap;
135}
136
137bool SBDeclaration::GetDescription(SBStream &description) {
138 Stream &strm = description.ref();
139
Jonas Devlieghere34470772018-12-20 21:02:55 +0000140 if (m_opaque_ap) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141 char file_path[PATH_MAX * 2];
142 m_opaque_ap->GetFile().GetPath(file_path, sizeof(file_path));
143 strm.Printf("%s:%u", file_path, GetLine());
144 if (GetColumn() > 0)
145 strm.Printf(":%u", GetColumn());
146 } else
147 strm.PutCString("No value");
148
149 return true;
150}
151
152lldb_private::Declaration *SBDeclaration::get() { return m_opaque_ap.get(); }