1254721Semaste//===-- CPPLanguageRuntime.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_CPPLanguageRuntime_h_
11254721Semaste#define liblldb_CPPLanguageRuntime_h_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste#include <vector>
16254721Semaste// Other libraries and framework includes
17254721Semaste// Project includes
18254721Semaste#include "lldb/Core/PluginInterface.h"
19254721Semaste#include "lldb/lldb-private.h"
20254721Semaste#include "lldb/Target/LanguageRuntime.h"
21254721Semaste
22254721Semastenamespace lldb_private {
23254721Semaste
24254721Semasteclass CPPLanguageRuntime :
25254721Semaste    public LanguageRuntime
26254721Semaste{
27254721Semastepublic:
28254721Semaste
29254721Semaste    class MethodName
30254721Semaste    {
31254721Semaste    public:
32254721Semaste        enum Type
33254721Semaste        {
34254721Semaste            eTypeInvalid,
35254721Semaste            eTypeUnknownMethod,
36254721Semaste            eTypeClassMethod,
37254721Semaste            eTypeInstanceMethod
38254721Semaste        };
39254721Semaste
40254721Semaste        MethodName () :
41254721Semaste            m_full(),
42254721Semaste            m_basename(),
43254721Semaste            m_context(),
44254721Semaste            m_arguments(),
45254721Semaste            m_qualifiers(),
46254721Semaste            m_type (eTypeInvalid),
47254721Semaste            m_parsed (false),
48254721Semaste            m_parse_error (false)
49254721Semaste        {
50254721Semaste        }
51254721Semaste
52254721Semaste        MethodName (const ConstString &s) :
53254721Semaste            m_full(s),
54254721Semaste            m_basename(),
55254721Semaste            m_context(),
56254721Semaste            m_arguments(),
57254721Semaste            m_qualifiers(),
58254721Semaste            m_type (eTypeInvalid),
59254721Semaste            m_parsed (false),
60254721Semaste            m_parse_error (false)
61254721Semaste        {
62254721Semaste        }
63254721Semaste
64254721Semaste        void
65254721Semaste        Clear();
66254721Semaste
67254721Semaste        bool
68254721Semaste        IsValid () const
69254721Semaste        {
70254721Semaste            if (m_parse_error)
71254721Semaste                return false;
72254721Semaste            if (m_type == eTypeInvalid)
73254721Semaste                return false;
74254721Semaste            return (bool)m_full;
75254721Semaste        }
76254721Semaste
77254721Semaste        Type
78254721Semaste        GetType () const
79254721Semaste        {
80254721Semaste            return m_type;
81254721Semaste        }
82254721Semaste
83254721Semaste        const ConstString &
84254721Semaste        GetFullName () const
85254721Semaste        {
86254721Semaste            return m_full;
87254721Semaste        }
88254721Semaste
89254721Semaste        llvm::StringRef
90254721Semaste        GetBasename ();
91254721Semaste
92254721Semaste        llvm::StringRef
93254721Semaste        GetContext ();
94254721Semaste
95254721Semaste        llvm::StringRef
96254721Semaste        GetArguments ();
97254721Semaste
98254721Semaste        llvm::StringRef
99254721Semaste        GetQualifiers ();
100254721Semaste
101254721Semaste    protected:
102254721Semaste        void
103254721Semaste        Parse();
104254721Semaste
105254721Semaste        ConstString     m_full;         // Full name:    "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const"
106254721Semaste        llvm::StringRef m_basename;     // Basename:     "GetBreakpointAtIndex"
107254721Semaste        llvm::StringRef m_context;      // Decl context: "lldb::SBTarget"
108254721Semaste        llvm::StringRef m_arguments;    // Arguments:    "(unsigned int)"
109254721Semaste        llvm::StringRef m_qualifiers;   // Qualifiers:   "const"
110254721Semaste        Type m_type;
111254721Semaste        bool m_parsed;
112254721Semaste        bool m_parse_error;
113254721Semaste    };
114254721Semaste
115254721Semaste    virtual
116254721Semaste    ~CPPLanguageRuntime();
117254721Semaste
118254721Semaste    virtual lldb::LanguageType
119254721Semaste    GetLanguageType () const
120254721Semaste    {
121254721Semaste        return lldb::eLanguageTypeC_plus_plus;
122254721Semaste    }
123254721Semaste
124254721Semaste    virtual bool
125254721Semaste    IsVTableName (const char *name) = 0;
126254721Semaste
127254721Semaste    virtual bool
128254721Semaste    GetObjectDescription (Stream &str, ValueObject &object);
129254721Semaste
130254721Semaste    virtual bool
131254721Semaste    GetObjectDescription (Stream &str, Value &value, ExecutionContextScope *exe_scope);
132254721Semaste
133254721Semaste    static bool
134254721Semaste    IsCPPMangledName(const char *name);
135254721Semaste
136254721Semaste    static bool
137254721Semaste    StripNamespacesFromVariableName (const char *name, const char *&base_name_start, const char *&base_name_end);
138254721Semaste
139254721Semaste    // in some cases, compilers will output different names for one same type. when tht happens, it might be impossible
140254721Semaste    // to construct SBType objects for a valid type, because the name that is available is not the same as the name that
141254721Semaste    // can be used as a search key in FindTypes(). the equivalents map here is meant to return possible alternative names
142254721Semaste    // for a type through which a search can be conducted. Currently, this is only enabled for C++ but can be extended
143254721Semaste    // to ObjC or other languages if necessary
144254721Semaste    static uint32_t
145254721Semaste    FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents);
146254721Semaste
147254721Semasteprotected:
148254721Semaste    //------------------------------------------------------------------
149254721Semaste    // Classes that inherit from CPPLanguageRuntime can see and modify these
150254721Semaste    //------------------------------------------------------------------
151254721Semaste    CPPLanguageRuntime(Process *process);
152254721Semasteprivate:
153254721Semaste    DISALLOW_COPY_AND_ASSIGN (CPPLanguageRuntime);
154254721Semaste};
155254721Semaste
156254721Semaste} // namespace lldb_private
157254721Semaste
158254721Semaste#endif  // liblldb_CPPLanguageRuntime_h_
159