Declaration.h revision fb81642e03567a3413d94cdb632b6005a0ad4273
1//===-- Declaration.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_Declaration_h_
11#define liblldb_Declaration_h_
12
13#include "lldb/lldb-private.h"
14#include "lldb/Host/FileSpec.h"
15
16namespace lldb_private {
17
18//----------------------------------------------------------------------
19/// @class Declaration Declaration.h "lldb/Symbol/Declaration.h"
20/// @brief A class that describes the declaration location of a
21///        lldb object.
22///
23/// The declarations include the file specification, line number, and
24/// the column info and can help track where functions, blocks, inlined
25/// functions, types, variables, any many other debug core objects were
26/// declared.
27//----------------------------------------------------------------------
28class Declaration
29{
30public:
31    //------------------------------------------------------------------
32    /// Default constructor.
33    //------------------------------------------------------------------
34    Declaration () :
35        m_file (),
36        m_line (0)
37#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
38        ,m_column (0)
39#endif
40    {
41    }
42
43
44    //------------------------------------------------------------------
45    /// Construct with file specification, and optional line and column.
46    ///
47    /// @param[in] file_spec
48    ///     The file specification that describes where this was
49    ///     declared.
50    ///
51    /// @param[in] line
52    ///     The line number that describes where this was declared. Set
53    ///     to zero if there is no line number information.
54    ///
55    /// @param[in] column
56    ///     The column number that describes where this was declared.
57    ///     Set to zero if there is no column number information.
58    //------------------------------------------------------------------
59    Declaration (const FileSpec& file_spec, uint32_t line = 0, uint32_t column = 0) :
60        m_file (file_spec),
61        m_line (line)
62#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
63        ,m_column (column)
64#endif
65    {
66    }
67
68    //------------------------------------------------------------------
69    /// Construct with a reference to another Declaration object.
70    //------------------------------------------------------------------
71    Declaration (const Declaration& rhs) :
72        m_file (rhs.m_file),
73        m_line (rhs.m_line)
74#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
75        ,m_column (rhs.m_column)
76#endif
77    {
78
79    }
80
81    //------------------------------------------------------------------
82    /// Construct with a pointer to another Declaration object.
83    //------------------------------------------------------------------
84    Declaration(const Declaration* decl_ptr) :
85        m_file(),
86        m_line(0)
87#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
88        ,m_column(0)
89#endif
90    {
91        if (decl_ptr)
92            *this = *decl_ptr;
93    }
94
95    //------------------------------------------------------------------
96    /// Clear the object's state.
97    ///
98    /// Sets the file specification to be empty, and the line and column
99    /// to zero.
100    //------------------------------------------------------------------
101    void
102    Clear ()
103    {
104        m_file.Clear();
105        m_line= 0;
106#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
107        m_column = 0;
108#endif
109    }
110
111    //------------------------------------------------------------------
112    /// Compare two declaration objects.
113    ///
114    /// Compares the two file specifications from \a lhs and \a rhs. If
115    /// the file specifications are equal, then continue to compare the
116    /// line number and column numbers respectively.
117    ///
118    /// @param[in] lhs
119    ///     The Left Hand Side const Declaration object reference.
120    ///
121    /// @param[in] rhs
122    ///     The Right Hand Side const Declaration object reference.
123    ///
124    /// @return
125    ///     @li -1 if lhs < rhs
126    ///     @li 0 if lhs == rhs
127    ///     @li 1 if lhs > rhs
128    //------------------------------------------------------------------
129    static int
130    Compare (const Declaration& lhs, const Declaration& rhs);
131
132    //------------------------------------------------------------------
133    /// Dump a description of this object to a Stream.
134    ///
135    /// Dump a description of the contents of this object to the
136    /// supplied stream \a s.
137    ///
138    /// @param[in] s
139    ///     The stream to which to dump the object descripton.
140    //------------------------------------------------------------------
141    void
142    Dump (Stream *s, bool show_fullpaths) const;
143
144    bool
145    DumpStopContext (Stream *s, bool show_fullpaths) const;
146    //------------------------------------------------------------------
147    /// Get accessor for the declaration column number.
148    ///
149    /// @return
150    ///     Non-zero indicates a valid column number, zero indicates no
151    ///     column information is available.
152    //------------------------------------------------------------------
153    uint32_t
154    GetColumn () const
155    {
156#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
157        return m_column;
158#else
159        return 0;
160#endif
161    }
162
163    //------------------------------------------------------------------
164    /// Get accessor for file specification.
165    ///
166    /// @return
167    ///     A reference to the file specification object.
168    //------------------------------------------------------------------
169    FileSpec&
170    GetFile ()
171    {
172        return m_file;
173    }
174
175    //------------------------------------------------------------------
176    /// Get const accessor for file specification.
177    ///
178    /// @return
179    ///     A const reference to the file specification object.
180    //------------------------------------------------------------------
181    const FileSpec&
182    GetFile () const
183    {
184        return m_file;
185    }
186
187    //------------------------------------------------------------------
188    /// Get accessor for the declaration line number.
189    ///
190    /// @return
191    ///     Non-zero indicates a valid line number, zero indicates no
192    ///     line information is available.
193    //------------------------------------------------------------------
194    uint32_t
195    GetLine () const
196    {
197        return m_line;
198    }
199
200
201    bool
202    IsValid() const
203    {
204        return m_file && m_line != 0;
205    }
206
207    //------------------------------------------------------------------
208    /// Get the memory cost of this object.
209    ///
210    /// @return
211    ///     The number of bytes that this object occupies in memory.
212    ///     The returned value does not include the bytes for any
213    ///     shared string values.
214    ///
215    /// @see ConstString::StaticMemorySize ()
216    //------------------------------------------------------------------
217    size_t
218    MemorySize () const;
219
220    //------------------------------------------------------------------
221    /// Set accessor for the declaration column number.
222    ///
223    /// @param[in] column
224    ///     Non-zero indicates a valid column number, zero indicates no
225    ///     column information is available.
226    //------------------------------------------------------------------
227    void
228    SetColumn (uint32_t column)
229    {
230#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
231        m_column = col;
232#endif
233    }
234
235    //------------------------------------------------------------------
236    /// Set accessor for the declaration file specification.
237    ///
238    /// @param[in] file_spec
239    ///     The new declaration file specifciation.
240    //------------------------------------------------------------------
241    void
242    SetFile (const FileSpec& file_spec)
243    {
244        m_file = file_spec;
245    }
246
247    //------------------------------------------------------------------
248    /// Set accessor for the declaration line number.
249    ///
250    /// @param[in] line
251    ///     Non-zero indicates a valid line number, zero indicates no
252    ///     line information is available.
253    //------------------------------------------------------------------
254    void
255    SetLine (uint32_t line)
256    {
257        m_line = line;
258    }
259protected:
260    //------------------------------------------------------------------
261    /// Member variables.
262    //------------------------------------------------------------------
263    FileSpec m_file;    ///< The file specification that points to the
264                        ///< source file where the declaration occurred.
265    uint32_t m_line;    ///< Non-zero values indicates a valid line number,
266                        ///< zero indicates no line number information is available.
267#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
268    uint32_t m_column;  ///< Non-zero values indicates a valid column number,
269                        ///< zero indicates no column information is available.
270#endif
271};
272
273bool
274operator == (const Declaration &lhs, const Declaration &rhs);
275
276} // namespace lldb_private
277
278#endif  // liblldb_Declaration_h_
279