CPPLanguageRuntime.h revision 296b06d325413723f5aac5988eed977b278a7807
1//===-- CPPLanguageRuntime.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_CPPLanguageRuntime_h_
11#define liblldb_CPPLanguageRuntime_h_
12
13// C Includes
14// C++ Includes
15#include <vector>
16// Other libraries and framework includes
17// Project includes
18#include "lldb/Core/PluginInterface.h"
19#include "lldb/lldb-private.h"
20#include "lldb/Target/LanguageRuntime.h"
21
22namespace lldb_private {
23
24class CPPLanguageRuntime :
25    public LanguageRuntime
26{
27public:
28
29    class MethodName
30    {
31    public:
32        enum Type
33        {
34            eTypeInvalid,
35            eTypeUnknownMethod,
36            eTypeClassMethod,
37            eTypeInstanceMethod
38        };
39
40        MethodName () :
41            m_full(),
42            m_basename(),
43            m_context(),
44            m_arguments(),
45            m_qualifiers(),
46            m_type (eTypeInvalid),
47            m_parsed (false),
48            m_parse_error (false)
49        {
50        }
51
52        MethodName (const ConstString &s) :
53            m_full(s),
54            m_basename(),
55            m_context(),
56            m_arguments(),
57            m_qualifiers(),
58            m_type (eTypeInvalid),
59            m_parsed (false),
60            m_parse_error (false)
61        {
62        }
63
64        void
65        Clear();
66
67        bool
68        IsValid () const
69        {
70            if (m_parse_error)
71                return false;
72            if (m_type == eTypeInvalid)
73                return false;
74            return (bool)m_full;
75        }
76
77        Type
78        GetType () const
79        {
80            return m_type;
81        }
82
83        const ConstString &
84        GetFullName () const
85        {
86            return m_full;
87        }
88
89        const ConstString &
90        GetBasename ();
91
92        llvm::StringRef
93        GetContext ();
94
95        llvm::StringRef
96        GetArguments ();
97
98        llvm::StringRef
99        GetQualifiers ();
100
101    protected:
102        void
103        Parse();
104
105        ConstString     m_full;         // Full name:    "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const"
106        ConstString     m_basename;     // Basename:     "GetBreakpointAtIndex"
107        llvm::StringRef m_context;      // Decl context: "lldb::SBTarget"
108        llvm::StringRef m_arguments;    // Arguments:    "(unsigned int)"
109        llvm::StringRef m_qualifiers;   // Qualifiers:   "const"
110        Type m_type;
111        bool m_parsed;
112        bool m_parse_error;
113    };
114
115    virtual
116    ~CPPLanguageRuntime();
117
118    virtual lldb::LanguageType
119    GetLanguageType () const
120    {
121        return lldb::eLanguageTypeC_plus_plus;
122    }
123
124    virtual bool
125    IsVTableName (const char *name) = 0;
126
127    virtual bool
128    GetObjectDescription (Stream &str, ValueObject &object);
129
130    virtual bool
131    GetObjectDescription (Stream &str, Value &value, ExecutionContextScope *exe_scope);
132
133    static bool
134    IsCPPMangledName(const char *name);
135
136    static bool
137    IsPossibleCPPCall (const char *name, const char *&base_name_start, const char *&base_name_end);
138
139    static bool
140    StripNamespacesFromVariableName (const char *name, const char *&base_name_start, const char *&base_name_end);
141
142    // in some cases, compilers will output different names for one same type. when tht happens, it might be impossible
143    // to construct SBType objects for a valid type, because the name that is available is not the same as the name that
144    // can be used as a search key in FindTypes(). the equivalents map here is meant to return possible alternative names
145    // for a type through which a search can be conducted. Currently, this is only enabled for C++ but can be extended
146    // to ObjC or other languages if necessary
147    static uint32_t
148    FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents);
149
150protected:
151    //------------------------------------------------------------------
152    // Classes that inherit from CPPLanguageRuntime can see and modify these
153    //------------------------------------------------------------------
154    CPPLanguageRuntime(Process *process);
155private:
156    DISALLOW_COPY_AND_ASSIGN (CPPLanguageRuntime);
157};
158
159} // namespace lldb_private
160
161#endif  // liblldb_CPPLanguageRuntime_h_
162