SBSourceManager.cpp revision 288943
1//===-- SBSourceManager.cpp -------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBDebugger.h"
11#include "lldb/API/SBSourceManager.h"
12#include "lldb/API/SBTarget.h"
13#include "lldb/API/SBStream.h"
14
15#include "lldb/API/SBFileSpec.h"
16#include "lldb/Core/Debugger.h"
17#include "lldb/Core/Stream.h"
18#include "lldb/Core/StreamFile.h"
19#include "lldb/Core/SourceManager.h"
20
21#include "lldb/Target/Target.h"
22
23namespace lldb_private
24{
25    class SourceManagerImpl
26    {
27    public:
28        SourceManagerImpl (const lldb::DebuggerSP &debugger_sp) :
29            m_debugger_wp (debugger_sp),
30            m_target_wp ()
31        {
32        }
33
34        SourceManagerImpl (const lldb::TargetSP &target_sp) :
35            m_debugger_wp (),
36            m_target_wp (target_sp)
37        {
38        }
39
40        SourceManagerImpl (const SourceManagerImpl &rhs)
41        {
42            if (&rhs == this)
43                return;
44            m_debugger_wp = rhs.m_debugger_wp;
45            m_target_wp   = rhs.m_target_wp;
46        }
47
48        size_t
49        DisplaySourceLinesWithLineNumbers (const lldb_private::FileSpec &file,
50                                           uint32_t line,
51                                           uint32_t context_before,
52                                           uint32_t context_after,
53                                           const char *current_line_cstr,
54                                           lldb_private::Stream *s)
55        {
56            if (!file)
57                return 0;
58
59            lldb::TargetSP target_sp (m_target_wp.lock());
60            if (target_sp)
61            {
62                return target_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
63                                                                                        line,
64                                                                                        context_before,
65                                                                                        context_after,
66                                                                                        current_line_cstr,
67                                                                                        s);
68            }
69            else
70            {
71                lldb::DebuggerSP debugger_sp (m_debugger_wp.lock());
72                if (debugger_sp)
73                {
74                    return debugger_sp->GetSourceManager().DisplaySourceLinesWithLineNumbers (file,
75                                                                                              line,
76                                                                                              context_before,
77                                                                                              context_after,
78                                                                                              current_line_cstr,
79                                                                                              s);
80                }
81            }
82            return 0;
83        }
84
85    private:
86        lldb::DebuggerWP m_debugger_wp;
87        lldb::TargetWP   m_target_wp;
88
89    };
90}
91
92using namespace lldb;
93using namespace lldb_private;
94
95SBSourceManager::SBSourceManager (const SBDebugger &debugger)
96{
97    m_opaque_ap.reset(new SourceManagerImpl (debugger.get_sp()));
98}
99
100SBSourceManager::SBSourceManager (const SBTarget &target)
101{
102    m_opaque_ap.reset(new SourceManagerImpl (target.GetSP()));
103}
104
105SBSourceManager::SBSourceManager (const SBSourceManager &rhs)
106{
107    if (&rhs == this)
108        return;
109
110    m_opaque_ap.reset(new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
111}
112
113const lldb::SBSourceManager &
114SBSourceManager::operator = (const lldb::SBSourceManager &rhs)
115{
116    m_opaque_ap.reset (new SourceManagerImpl (*(rhs.m_opaque_ap.get())));
117    return *this;
118}
119
120SBSourceManager::~SBSourceManager()
121{
122}
123
124size_t
125SBSourceManager::DisplaySourceLinesWithLineNumbers
126(
127    const SBFileSpec &file,
128    uint32_t line,
129    uint32_t context_before,
130    uint32_t context_after,
131    const char *current_line_cstr,
132    SBStream &s
133)
134{
135    if (m_opaque_ap.get() == NULL)
136        return 0;
137
138    return m_opaque_ap->DisplaySourceLinesWithLineNumbers (file.ref(),
139                                                           line,
140                                                           context_before,
141                                                           context_after,
142                                                           current_line_cstr,
143                                                           s.get());
144}
145