130fdc8d8SChris Lattner //===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
10e37d605eSJim Ingham #include "lldb/API/SBDebugger.h"
114c5de699SEli Friedman #include "lldb/API/SBSourceManager.h"
12e37d605eSJim Ingham #include "lldb/API/SBTarget.h"
13f6eaba85SJohnny Chen #include "lldb/API/SBStream.h"
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h"
16e37d605eSJim Ingham #include "lldb/Core/Debugger.h"
1730fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
1830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
1930fdc8d8SChris Lattner #include "lldb/Core/SourceManager.h"
2030fdc8d8SChris Lattner 
21e37d605eSJim Ingham #include "lldb/Target/Target.h"
2230fdc8d8SChris Lattner 
239a37766eSGreg Clayton namespace lldb_private
249a37766eSGreg Clayton {
259a37766eSGreg Clayton     class SourceManagerImpl
2630fdc8d8SChris Lattner     {
27e37d605eSJim Ingham     public:
289a37766eSGreg Clayton         SourceManagerImpl (const lldb::DebuggerSP &debugger_sp)
29e37d605eSJim Ingham         {
309a37766eSGreg Clayton             m_debugger_sp = debugger_sp;
31e37d605eSJim Ingham         }
32e37d605eSJim Ingham 
339a37766eSGreg Clayton         SourceManagerImpl (const lldb::TargetSP &target_sp)
34e37d605eSJim Ingham         {
359a37766eSGreg Clayton             m_target_sp = target_sp;
36e37d605eSJim Ingham         }
37e37d605eSJim Ingham 
389a37766eSGreg Clayton         SourceManagerImpl (const SourceManagerImpl &rhs)
39e37d605eSJim Ingham         {
40e37d605eSJim Ingham             if (&rhs == this)
41e37d605eSJim Ingham                 return;
42e37d605eSJim Ingham             m_debugger_sp = rhs.m_debugger_sp;
43e37d605eSJim Ingham             m_target_sp   = rhs.m_target_sp;
44e37d605eSJim Ingham         }
45e37d605eSJim Ingham 
46e37d605eSJim Ingham         size_t
479a37766eSGreg Clayton         DisplaySourceLinesWithLineNumbers (const lldb_private::FileSpec &file,
48e37d605eSJim Ingham                                            uint32_t line,
49e37d605eSJim Ingham                                            uint32_t context_before,
50e37d605eSJim Ingham                                            uint32_t context_after,
51e37d605eSJim Ingham                                            const char *current_line_cstr,
529a37766eSGreg Clayton                                            lldb_private::Stream *s)
53e37d605eSJim Ingham         {
5444d6d2c5SJohnny Chen             if (!file)
55e37d605eSJim Ingham                 return 0;
56e37d605eSJim Ingham 
57e37d605eSJim Ingham             if (m_debugger_sp)
589a37766eSGreg Clayton                 return m_debugger_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
59e37d605eSJim Ingham                                                                                             line,
60e37d605eSJim Ingham                                                                                             context_before,
61e37d605eSJim Ingham                                                                                             context_after,
62e37d605eSJim Ingham                                                                                             current_line_cstr,
639a37766eSGreg Clayton                                                                                             s);
64e37d605eSJim Ingham             else if (m_target_sp)
659a37766eSGreg Clayton                 return m_target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
66e37d605eSJim Ingham                                                                                           line,
67e37d605eSJim Ingham                                                                                           context_before,
68e37d605eSJim Ingham                                                                                           context_after,
69e37d605eSJim Ingham                                                                                           current_line_cstr,
709a37766eSGreg Clayton                                                                                           s);
71e37d605eSJim Ingham             else
72e37d605eSJim Ingham                 return 0;
73e37d605eSJim Ingham         }
74e37d605eSJim Ingham 
75e37d605eSJim Ingham     private:
76e37d605eSJim Ingham         lldb::DebuggerSP m_debugger_sp;
77e37d605eSJim Ingham         lldb::TargetSP   m_target_sp;
78e37d605eSJim Ingham 
79e37d605eSJim Ingham     };
809a37766eSGreg Clayton }
819a37766eSGreg Clayton 
829a37766eSGreg Clayton using namespace lldb;
839a37766eSGreg Clayton using namespace lldb_private;
84e37d605eSJim Ingham 
85e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBDebugger &debugger)
86e37d605eSJim Ingham {
879a37766eSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (debugger.get_sp()));
88e37d605eSJim Ingham }
89e37d605eSJim Ingham 
90e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBTarget &target)
91e37d605eSJim Ingham {
92*b9556accSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (target.GetSP()));
93e37d605eSJim Ingham }
94e37d605eSJim Ingham 
95e37d605eSJim Ingham SBSourceManager::SBSourceManager (const SBSourceManager &rhs)
96e37d605eSJim Ingham {
97e37d605eSJim Ingham     if (&rhs == this)
98e37d605eSJim Ingham         return;
99e37d605eSJim Ingham 
1009a37766eSGreg Clayton     m_opaque_ap.reset(new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
101e37d605eSJim Ingham }
102e37d605eSJim Ingham 
103e37d605eSJim Ingham const lldb::SBSourceManager &
104e37d605eSJim Ingham SBSourceManager::operator = (const lldb::SBSourceManager &rhs)
105e37d605eSJim Ingham {
1069a37766eSGreg Clayton     m_opaque_ap.reset (new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
107e37d605eSJim Ingham     return *this;
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner SBSourceManager::~SBSourceManager()
11130fdc8d8SChris Lattner {
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
11430fdc8d8SChris Lattner size_t
11530fdc8d8SChris Lattner SBSourceManager::DisplaySourceLinesWithLineNumbers
11630fdc8d8SChris Lattner (
11730fdc8d8SChris Lattner     const SBFileSpec &file,
11830fdc8d8SChris Lattner     uint32_t line,
11930fdc8d8SChris Lattner     uint32_t context_before,
12030fdc8d8SChris Lattner     uint32_t context_after,
12130fdc8d8SChris Lattner     const char *current_line_cstr,
122f6eaba85SJohnny Chen     SBStream &s
12330fdc8d8SChris Lattner )
12430fdc8d8SChris Lattner {
125e37d605eSJim Ingham     if (m_opaque_ap.get() == NULL)
126efabb123SGreg Clayton         return 0;
127efabb123SGreg Clayton 
1289a37766eSGreg Clayton     return m_opaque_ap->DisplaySourceLinesWithLineNumbers (file.ref(),
12930fdc8d8SChris Lattner                                                            line,
13030fdc8d8SChris Lattner                                                            context_before,
13130fdc8d8SChris Lattner                                                            context_after,
13230fdc8d8SChris Lattner                                                            current_line_cstr,
1339a37766eSGreg Clayton                                                            s.get());
13430fdc8d8SChris Lattner }
135