1 //===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===//
2 //
3 // 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
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "lldb/API/SBSourceManager.h"
10 #include "lldb/API/SBDebugger.h"
11 #include "lldb/API/SBStream.h"
12 #include "lldb/API/SBTarget.h"
13 
14 #include "lldb/API/SBFileSpec.h"
15 #include "lldb/Core/Debugger.h"
16 #include "lldb/Core/SourceManager.h"
17 #include "lldb/Core/StreamFile.h"
18 #include "lldb/Utility/Stream.h"
19 
20 #include "lldb/Target/Target.h"
21 
22 namespace lldb_private {
23 class SourceManagerImpl {
24 public:
25   SourceManagerImpl(const lldb::DebuggerSP &debugger_sp)
26       : m_debugger_wp(debugger_sp), m_target_wp() {}
27 
28   SourceManagerImpl(const lldb::TargetSP &target_sp)
29       : m_debugger_wp(), m_target_wp(target_sp) {}
30 
31   SourceManagerImpl(const SourceManagerImpl &rhs) {
32     if (&rhs == this)
33       return;
34     m_debugger_wp = rhs.m_debugger_wp;
35     m_target_wp = rhs.m_target_wp;
36   }
37 
38   size_t DisplaySourceLinesWithLineNumbers(const lldb_private::FileSpec &file,
39                                            uint32_t line, uint32_t column,
40                                            uint32_t context_before,
41                                            uint32_t context_after,
42                                            const char *current_line_cstr,
43                                            lldb_private::Stream *s) {
44     if (!file)
45       return 0;
46 
47     lldb::TargetSP target_sp(m_target_wp.lock());
48     if (target_sp) {
49       return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers(
50           file, line, column, context_before, context_after, current_line_cstr,
51           s);
52     } else {
53       lldb::DebuggerSP debugger_sp(m_debugger_wp.lock());
54       if (debugger_sp) {
55         return debugger_sp->GetSourceManager()
56             .DisplaySourceLinesWithLineNumbers(file, line, column,
57                                                context_before, context_after,
58                                                current_line_cstr, s);
59       }
60     }
61     return 0;
62   }
63 
64 private:
65   lldb::DebuggerWP m_debugger_wp;
66   lldb::TargetWP m_target_wp;
67 };
68 }
69 
70 using namespace lldb;
71 using namespace lldb_private;
72 
73 SBSourceManager::SBSourceManager(const SBDebugger &debugger) {
74   m_opaque_ap.reset(new SourceManagerImpl(debugger.get_sp()));
75 }
76 
77 SBSourceManager::SBSourceManager(const SBTarget &target) {
78   m_opaque_ap.reset(new SourceManagerImpl(target.GetSP()));
79 }
80 
81 SBSourceManager::SBSourceManager(const SBSourceManager &rhs) {
82   if (&rhs == this)
83     return;
84 
85   m_opaque_ap.reset(new SourceManagerImpl(*(rhs.m_opaque_ap.get())));
86 }
87 
88 const lldb::SBSourceManager &SBSourceManager::
89 operator=(const lldb::SBSourceManager &rhs) {
90   m_opaque_ap.reset(new SourceManagerImpl(*(rhs.m_opaque_ap.get())));
91   return *this;
92 }
93 
94 SBSourceManager::~SBSourceManager() {}
95 
96 size_t SBSourceManager::DisplaySourceLinesWithLineNumbers(
97     const SBFileSpec &file, uint32_t line, uint32_t context_before,
98     uint32_t context_after, const char *current_line_cstr, SBStream &s) {
99   const uint32_t column = 0;
100   return DisplaySourceLinesWithLineNumbersAndColumn(
101       file.ref(), line, column, context_before, context_after,
102       current_line_cstr, s);
103 }
104 
105 size_t SBSourceManager::DisplaySourceLinesWithLineNumbersAndColumn(
106     const SBFileSpec &file, uint32_t line, uint32_t column,
107     uint32_t context_before, uint32_t context_after,
108     const char *current_line_cstr, SBStream &s) {
109   if (m_opaque_ap == NULL)
110     return 0;
111 
112   return m_opaque_ap->DisplaySourceLinesWithLineNumbers(
113       file.ref(), line, column, context_before, context_after,
114       current_line_cstr, s.get());
115 }
116