SourceManager.h revision 102b2c2681c9a830afe25bfea35557421905e42c
1//===-- SourceManager.h -----------------------------------------*- 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#ifndef liblldb_SourceManager_h_
11#define liblldb_SourceManager_h_
12
13// C Includes
14// C++ Includes
15#include <map>
16#include <vector>
17
18// Other libraries and framework includes
19// Project includes
20#include "lldb/lldb-private.h"
21#include "lldb/Host/FileSpec.h"
22
23namespace lldb_private {
24
25class SourceManager
26{
27public:
28#ifndef SWIG
29
30    class File
31    {
32    friend bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs);
33    public:
34
35        File (const FileSpec &file_spec, Target *target);
36        ~File();
37
38        size_t
39        DisplaySourceLines (uint32_t line,
40                            uint32_t context_before,
41                            uint32_t context_after,
42                            Stream *s);
43        void
44        FindLinesMatchingRegex (RegularExpression& regex,
45                                uint32_t start_line,
46                                uint32_t end_line,
47                                std::vector<uint32_t> &match_lines);
48
49        bool
50        GetLine (uint32_t line_no, std::string &buffer);
51
52        uint32_t
53        GetLineOffset (uint32_t line);
54
55        bool
56        LineIsValid (uint32_t line);
57
58        bool
59        FileSpecMatches (const FileSpec &file_spec);
60
61        const FileSpec &
62        GetFileSpec ()
63        {
64            return m_file_spec;
65        }
66
67        uint32_t
68        GetSourceMapModificationID() const
69        {
70            return m_source_map_mod_id;
71        }
72
73    protected:
74
75        bool
76        CalculateLineOffsets (uint32_t line = UINT32_MAX);
77
78        FileSpec m_file_spec_orig;  // The original file spec that was used (can be different from m_file_spec)
79        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)
80        TimeValue m_mod_time;       // Keep the modification time that this file data is valid for
81        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
82        lldb::DataBufferSP m_data_sp;
83        typedef std::vector<uint32_t> LineOffsets;
84        LineOffsets m_offsets;
85    };
86
87#endif // SWIG
88
89    typedef std::shared_ptr<File> FileSP;
90
91#ifndef SWIG
92
93   // The SourceFileCache class separates the source manager from the cache of source files, so the
94   // cache can be stored in the Debugger, but the source managers can be per target.
95    class SourceFileCache
96    {
97    public:
98        SourceFileCache () {}
99        ~SourceFileCache() {}
100
101        void AddSourceFile (const FileSP &file_sp);
102        FileSP FindSourceFile (const FileSpec &file_spec) const;
103
104    protected:
105        typedef std::map <FileSpec, FileSP> FileCache;
106        FileCache m_file_cache;
107    };
108#endif
109
110
111    //------------------------------------------------------------------
112    // Constructors and Destructors
113    //------------------------------------------------------------------
114    // A source manager can be made with a non-null target, in which case it can use the path remappings to find
115    // source files that are not in their build locations.  With no target it won't be able to do this.
116    SourceManager (const lldb::DebuggerSP &debugger_sp);
117    SourceManager (const lldb::TargetSP &target_sp);
118
119    ~SourceManager();
120
121
122    FileSP
123    GetLastFile ()
124    {
125        return m_last_file_sp;
126    }
127
128    size_t
129    DisplaySourceLinesWithLineNumbers (const FileSpec &file,
130                                       uint32_t line,
131                                       uint32_t context_before,
132                                       uint32_t context_after,
133                                       const char* current_line_cstr,
134                                       Stream *s,
135                                       const SymbolContextList *bp_locs = NULL);
136
137    // This variant uses the last file we visited.
138    size_t
139    DisplaySourceLinesWithLineNumbersUsingLastFile (uint32_t start_line,
140                                                    uint32_t count,
141                                                    uint32_t curr_line,
142                                                    const char* current_line_cstr,
143                                                    Stream *s,
144                                                    const SymbolContextList *bp_locs = NULL);
145
146    size_t
147    DisplayMoreWithLineNumbers (Stream *s,
148                                uint32_t count,
149                                bool reverse,
150                                const SymbolContextList *bp_locs = NULL);
151
152    bool
153    SetDefaultFileAndLine (const FileSpec &file_spec, uint32_t line);
154
155    bool
156    GetDefaultFileAndLine (FileSpec &file_spec, uint32_t &line);
157
158    bool
159    DefaultFileAndLineSet ()
160    {
161        return (m_last_file_sp.get() != NULL);
162    }
163
164    void
165    FindLinesMatchingRegex (FileSpec &file_spec,
166                            RegularExpression& regex,
167                            uint32_t start_line,
168                            uint32_t end_line,
169                            std::vector<uint32_t> &match_lines);
170
171protected:
172
173    FileSP
174    GetFile (const FileSpec &file_spec);
175
176    //------------------------------------------------------------------
177    // Classes that inherit from SourceManager can see and modify these
178    //------------------------------------------------------------------
179    FileSP m_last_file_sp;
180    uint32_t m_last_line;
181    uint32_t m_last_count;
182    bool     m_default_set;
183    lldb::TargetWP m_target_wp;
184    lldb::DebuggerWP m_debugger_wp;
185
186private:
187    //------------------------------------------------------------------
188    // For SourceManager only
189    //------------------------------------------------------------------
190    DISALLOW_COPY_AND_ASSIGN (SourceManager);
191};
192
193bool operator== (const SourceManager::File &lhs, const SourceManager::File &rhs);
194} // namespace lldb_private
195
196#endif  // liblldb_SourceManager_h_
197