1254721Semaste//===-- SourceManager.h -----------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_SourceManager_h_
11254721Semaste#define liblldb_SourceManager_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste#include <map>
16254721Semaste#include <vector>
17254721Semaste
18254721Semaste// Other libraries and framework includes
19254721Semaste// Project includes
20254721Semaste#include "lldb/lldb-private.h"
21254721Semaste#include "lldb/Host/FileSpec.h"
22254721Semaste
23254721Semastenamespace lldb_private {
24254721Semaste
25254721Semasteclass SourceManager
26254721Semaste{
27254721Semastepublic:
28254721Semaste#ifndef SWIG
29254721Semaste
30254721Semaste    class File
31254721Semaste    {
32254721Semaste    friend bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs);
33254721Semaste    public:
34254721Semaste
35254721Semaste        File (const FileSpec &file_spec, Target *target);
36254721Semaste        ~File();
37254721Semaste
38254721Semaste        size_t
39254721Semaste        DisplaySourceLines (uint32_t line,
40254721Semaste                            uint32_t context_before,
41254721Semaste                            uint32_t context_after,
42254721Semaste                            Stream *s);
43254721Semaste        void
44254721Semaste        FindLinesMatchingRegex (RegularExpression& regex,
45254721Semaste                                uint32_t start_line,
46254721Semaste                                uint32_t end_line,
47254721Semaste                                std::vector<uint32_t> &match_lines);
48254721Semaste
49254721Semaste        bool
50254721Semaste        GetLine (uint32_t line_no, std::string &buffer);
51254721Semaste
52254721Semaste        uint32_t
53254721Semaste        GetLineOffset (uint32_t line);
54254721Semaste
55254721Semaste        bool
56254721Semaste        LineIsValid (uint32_t line);
57254721Semaste
58254721Semaste        bool
59254721Semaste        FileSpecMatches (const FileSpec &file_spec);
60254721Semaste
61254721Semaste        const FileSpec &
62254721Semaste        GetFileSpec ()
63254721Semaste        {
64254721Semaste            return m_file_spec;
65254721Semaste        }
66254721Semaste
67254721Semaste        uint32_t
68254721Semaste        GetSourceMapModificationID() const
69254721Semaste        {
70254721Semaste            return m_source_map_mod_id;
71254721Semaste        }
72254721Semaste
73269024Semaste        const char *
74269024Semaste        PeekLineData (uint32_t line);
75269024Semaste
76269024Semaste        uint32_t
77269024Semaste        GetLineLength (uint32_t line, bool include_newline_chars);
78269024Semaste
79269024Semaste        uint32_t
80269024Semaste        GetNumLines ();
81269024Semaste
82254721Semaste    protected:
83254721Semaste
84254721Semaste        bool
85254721Semaste        CalculateLineOffsets (uint32_t line = UINT32_MAX);
86254721Semaste
87254721Semaste        FileSpec m_file_spec_orig;  // The original file spec that was used (can be different from m_file_spec)
88254721Semaste        FileSpec m_file_spec;       // The actualy file spec being used (if the target has source mappings, this might be different from m_file_spec_orig)
89254721Semaste        TimeValue m_mod_time;       // Keep the modification time that this file data is valid for
90254721Semaste        uint32_t m_source_map_mod_id; // If the target uses path remappings, be sure to clear our notion of a source file if the path modification ID changes
91254721Semaste        lldb::DataBufferSP m_data_sp;
92254721Semaste        typedef std::vector<uint32_t> LineOffsets;
93254721Semaste        LineOffsets m_offsets;
94254721Semaste    };
95254721Semaste
96254721Semaste#endif // SWIG
97254721Semaste
98254721Semaste    typedef std::shared_ptr<File> FileSP;
99254721Semaste
100254721Semaste#ifndef SWIG
101254721Semaste
102254721Semaste   // The SourceFileCache class separates the source manager from the cache of source files, so the
103254721Semaste   // cache can be stored in the Debugger, but the source managers can be per target.
104254721Semaste    class SourceFileCache
105254721Semaste    {
106254721Semaste    public:
107254721Semaste        SourceFileCache () {}
108254721Semaste        ~SourceFileCache() {}
109254721Semaste
110254721Semaste        void AddSourceFile (const FileSP &file_sp);
111254721Semaste        FileSP FindSourceFile (const FileSpec &file_spec) const;
112254721Semaste
113254721Semaste    protected:
114254721Semaste        typedef std::map <FileSpec, FileSP> FileCache;
115254721Semaste        FileCache m_file_cache;
116254721Semaste    };
117254721Semaste#endif
118254721Semaste
119254721Semaste
120254721Semaste    //------------------------------------------------------------------
121254721Semaste    // Constructors and Destructors
122254721Semaste    //------------------------------------------------------------------
123254721Semaste    // A source manager can be made with a non-null target, in which case it can use the path remappings to find
124254721Semaste    // source files that are not in their build locations.  With no target it won't be able to do this.
125254721Semaste    SourceManager (const lldb::DebuggerSP &debugger_sp);
126254721Semaste    SourceManager (const lldb::TargetSP &target_sp);
127254721Semaste
128254721Semaste    ~SourceManager();
129254721Semaste
130254721Semaste
131254721Semaste    FileSP
132254721Semaste    GetLastFile ()
133254721Semaste    {
134254721Semaste        return m_last_file_sp;
135254721Semaste    }
136254721Semaste
137254721Semaste    size_t
138254721Semaste    DisplaySourceLinesWithLineNumbers (const FileSpec &file,
139254721Semaste                                       uint32_t line,
140254721Semaste                                       uint32_t context_before,
141254721Semaste                                       uint32_t context_after,
142254721Semaste                                       const char* current_line_cstr,
143254721Semaste                                       Stream *s,
144254721Semaste                                       const SymbolContextList *bp_locs = NULL);
145254721Semaste
146254721Semaste    // This variant uses the last file we visited.
147254721Semaste    size_t
148254721Semaste    DisplaySourceLinesWithLineNumbersUsingLastFile (uint32_t start_line,
149254721Semaste                                                    uint32_t count,
150254721Semaste                                                    uint32_t curr_line,
151254721Semaste                                                    const char* current_line_cstr,
152254721Semaste                                                    Stream *s,
153254721Semaste                                                    const SymbolContextList *bp_locs = NULL);
154254721Semaste
155254721Semaste    size_t
156254721Semaste    DisplayMoreWithLineNumbers (Stream *s,
157254721Semaste                                uint32_t count,
158254721Semaste                                bool reverse,
159254721Semaste                                const SymbolContextList *bp_locs = NULL);
160254721Semaste
161254721Semaste    bool
162254721Semaste    SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line);
163254721Semaste
164254721Semaste    bool
165254721Semaste    GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line);
166254721Semaste
167254721Semaste    bool
168254721Semaste    DefaultFileAndLineSet ()
169254721Semaste    {
170254721Semaste        return (m_last_file_sp.get() != NULL);
171254721Semaste    }
172254721Semaste
173254721Semaste    void
174254721Semaste    FindLinesMatchingRegex (FileSpec &file_spec,
175254721Semaste                            RegularExpression& regex,
176254721Semaste                            uint32_t start_line,
177254721Semaste                            uint32_t end_line,
178254721Semaste                            std::vector<uint32_t> &match_lines);
179269024Semaste
180269024Semaste    FileSP
181269024Semaste    GetFile (const FileSpec &file_spec);
182254721Semaste
183254721Semasteprotected:
184254721Semaste
185254721Semaste    //------------------------------------------------------------------
186254721Semaste    // Classes that inherit from SourceManager can see and modify these
187254721Semaste    //------------------------------------------------------------------
188254721Semaste    FileSP m_last_file_sp;
189254721Semaste    uint32_t m_last_line;
190254721Semaste    uint32_t m_last_count;
191254721Semaste    bool     m_default_set;
192254721Semaste    lldb::TargetWP m_target_wp;
193254721Semaste    lldb::DebuggerWP m_debugger_wp;
194254721Semaste
195254721Semasteprivate:
196254721Semaste    //------------------------------------------------------------------
197254721Semaste    // For SourceManager only
198254721Semaste    //------------------------------------------------------------------
199254721Semaste    DISALLOW_COPY_AND_ASSIGN (SourceManager);
200254721Semaste};
201254721Semaste
202254721Semastebool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs);
203254721Semaste} // namespace lldb_private
204254721Semaste
205254721Semaste#endif  // liblldb_SourceManager_h_
206