130fdc8d8SChris Lattner //===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
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
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
94c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
10b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h"
11f6eaba85SJohnny Chen #include "lldb/API/SBStream.h"
12b9c1b51eSKate Stone #include "lldb/API/SBTarget.h"
1330fdc8d8SChris Lattner 
1430fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
15e37d605eSJim Ingham #include "lldb/Core/Debugger.h"
16b9c1b51eSKate Stone #include "lldb/Core/SourceManager.h"
1730fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
18bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1930fdc8d8SChris Lattner 
20e37d605eSJim Ingham #include "lldb/Target/Target.h"
2130fdc8d8SChris Lattner 
22b9c1b51eSKate Stone namespace lldb_private {
23b9c1b51eSKate Stone class SourceManagerImpl {
24e37d605eSJim Ingham public:
25b9c1b51eSKate Stone   SourceManagerImpl(const lldb::DebuggerSP &debugger_sp)
26b9c1b51eSKate Stone       : m_debugger_wp(debugger_sp), m_target_wp() {}
27e37d605eSJim Ingham 
28b9c1b51eSKate Stone   SourceManagerImpl(const lldb::TargetSP &target_sp)
29b9c1b51eSKate Stone       : m_debugger_wp(), m_target_wp(target_sp) {}
30e37d605eSJim Ingham 
31b9c1b51eSKate Stone   SourceManagerImpl(const SourceManagerImpl &rhs) {
32e37d605eSJim Ingham     if (&rhs == this)
33e37d605eSJim Ingham       return;
349585fbfcSGreg Clayton     m_debugger_wp = rhs.m_debugger_wp;
359585fbfcSGreg Clayton     m_target_wp = rhs.m_target_wp;
36e37d605eSJim Ingham   }
37e37d605eSJim Ingham 
38b9c1b51eSKate Stone   size_t DisplaySourceLinesWithLineNumbers(const lldb_private::FileSpec &file,
399666ba75STodd Fiala                                            uint32_t line, uint32_t column,
40e37d605eSJim Ingham                                            uint32_t context_before,
41e37d605eSJim Ingham                                            uint32_t context_after,
42e37d605eSJim Ingham                                            const char *current_line_cstr,
43b9c1b51eSKate Stone                                            lldb_private::Stream *s) {
4444d6d2c5SJohnny Chen     if (!file)
45e37d605eSJim Ingham       return 0;
46e37d605eSJim Ingham 
479585fbfcSGreg Clayton     lldb::TargetSP target_sp(m_target_wp.lock());
48b9c1b51eSKate Stone     if (target_sp) {
49b9c1b51eSKate Stone       return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers(
509666ba75STodd Fiala           file, line, column, context_before, context_after, current_line_cstr,
519666ba75STodd Fiala           s);
52b9c1b51eSKate Stone     } else {
539585fbfcSGreg Clayton       lldb::DebuggerSP debugger_sp(m_debugger_wp.lock());
54b9c1b51eSKate Stone       if (debugger_sp) {
55b9c1b51eSKate Stone         return debugger_sp->GetSourceManager()
569666ba75STodd Fiala             .DisplaySourceLinesWithLineNumbers(file, line, column,
579666ba75STodd Fiala                                                context_before, context_after,
589666ba75STodd Fiala                                                current_line_cstr, s);
599585fbfcSGreg Clayton       }
609585fbfcSGreg Clayton     }
61e37d605eSJim Ingham     return 0;
62e37d605eSJim Ingham   }
63e37d605eSJim Ingham 
64e37d605eSJim Ingham private:
659585fbfcSGreg Clayton   lldb::DebuggerWP m_debugger_wp;
669585fbfcSGreg Clayton   lldb::TargetWP m_target_wp;
67e37d605eSJim Ingham };
689a37766eSGreg Clayton }
699a37766eSGreg Clayton 
709a37766eSGreg Clayton using namespace lldb;
719a37766eSGreg Clayton using namespace lldb_private;
72e37d605eSJim Ingham 
73b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBDebugger &debugger) {
749a37766eSGreg Clayton   m_opaque_ap.reset(new SourceManagerImpl(debugger.get_sp()));
75e37d605eSJim Ingham }
76e37d605eSJim Ingham 
77b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBTarget &target) {
78b9556accSGreg Clayton   m_opaque_ap.reset(new SourceManagerImpl(target.GetSP()));
79e37d605eSJim Ingham }
80e37d605eSJim Ingham 
81b9c1b51eSKate Stone SBSourceManager::SBSourceManager(const SBSourceManager &rhs) {
82e37d605eSJim Ingham   if (&rhs == this)
83e37d605eSJim Ingham     return;
84e37d605eSJim Ingham 
859a37766eSGreg Clayton   m_opaque_ap.reset(new SourceManagerImpl(*(rhs.m_opaque_ap.get())));
86e37d605eSJim Ingham }
87e37d605eSJim Ingham 
88b9c1b51eSKate Stone const lldb::SBSourceManager &SBSourceManager::
89b9c1b51eSKate Stone operator=(const lldb::SBSourceManager &rhs) {
909a37766eSGreg Clayton   m_opaque_ap.reset(new SourceManagerImpl(*(rhs.m_opaque_ap.get())));
91e37d605eSJim Ingham   return *this;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
94b9c1b51eSKate Stone SBSourceManager::~SBSourceManager() {}
9530fdc8d8SChris Lattner 
96b9c1b51eSKate Stone size_t SBSourceManager::DisplaySourceLinesWithLineNumbers(
97b9c1b51eSKate Stone     const SBFileSpec &file, uint32_t line, uint32_t context_before,
98b9c1b51eSKate Stone     uint32_t context_after, const char *current_line_cstr, SBStream &s) {
999666ba75STodd Fiala   const uint32_t column = 0;
1009666ba75STodd Fiala   return DisplaySourceLinesWithLineNumbersAndColumn(
1019666ba75STodd Fiala       file.ref(), line, column, context_before, context_after,
1029666ba75STodd Fiala       current_line_cstr, s);
1039666ba75STodd Fiala }
1049666ba75STodd Fiala 
1059666ba75STodd Fiala size_t SBSourceManager::DisplaySourceLinesWithLineNumbersAndColumn(
1069666ba75STodd Fiala     const SBFileSpec &file, uint32_t line, uint32_t column,
1079666ba75STodd Fiala     uint32_t context_before, uint32_t context_after,
1089666ba75STodd Fiala     const char *current_line_cstr, SBStream &s) {
1093447077aSJonas Devlieghere   if (m_opaque_ap == NULL)
110efabb123SGreg Clayton     return 0;
111efabb123SGreg Clayton 
112b9c1b51eSKate Stone   return m_opaque_ap->DisplaySourceLinesWithLineNumbers(
1139666ba75STodd Fiala       file.ref(), line, column, context_before, context_after,
1149666ba75STodd Fiala       current_line_cstr, s.get());
11530fdc8d8SChris Lattner }
116