blob: 0f96ff8601dc185653d57a66ea141dc7973cbe63 [file] [log] [blame]
Eugene Zelenko8d15f332015-10-20 01:10:59 +00001//===-- ObjCLanguage.h ------------------------------------------*- C++ -*-===//
Enrico Granata5f9d3102015-08-27 21:33:50 +00002//
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_ObjCLanguage_h_
11#define liblldb_ObjCLanguage_h_
12
13// C Includes
14// C++ Includes
Jim Inghamaa816b82015-09-02 01:59:14 +000015#include <vector>
16
Enrico Granata5f9d3102015-08-27 21:33:50 +000017// Other libraries and framework includes
18// Project includes
19#include "lldb/lldb-private.h"
Jim Inghamaa816b82015-09-02 01:59:14 +000020#include "lldb/Core/ConstString.h"
Enrico Granata5f9d3102015-08-27 21:33:50 +000021#include "lldb/Target/Language.h"
22
23namespace lldb_private {
24
25class ObjCLanguage :
26 public Language
27{
28public:
Jim Inghamaa816b82015-09-02 01:59:14 +000029 class MethodName
30 {
31 public:
32 enum Type
33 {
34 eTypeUnspecified,
35 eTypeClassMethod,
36 eTypeInstanceMethod
37 };
38
39 MethodName () :
40 m_full(),
41 m_class(),
42 m_category(),
43 m_selector(),
44 m_type (eTypeUnspecified),
45 m_category_is_valid (false)
46 {
47 }
48
49 MethodName (const char *name, bool strict) :
50 m_full(),
51 m_class(),
52 m_category(),
53 m_selector(),
54 m_type (eTypeUnspecified),
55 m_category_is_valid (false)
56 {
57 SetName (name, strict);
58 }
59
60 void
61 Clear();
62
63 bool
64 IsValid (bool strict) const
65 {
66 // If "strict" is true, the name must have everything specified including
67 // the leading "+" or "-" on the method name
68 if (strict && m_type == eTypeUnspecified)
69 return false;
70 // Other than that, m_full will only be filled in if the objective C
71 // name is valid.
72 return (bool)m_full;
73 }
74
75 bool
76 HasCategory()
77 {
Jim Inghame90dc822015-09-03 00:03:13 +000078 return !GetCategory().IsEmpty();
Jim Inghamaa816b82015-09-02 01:59:14 +000079 }
80
81 Type
82 GetType () const
83 {
84 return m_type;
85 }
86
87 const ConstString &
88 GetFullName () const
89 {
90 return m_full;
91 }
92
93 ConstString
94 GetFullNameWithoutCategory (bool empty_if_no_category);
95
96 bool
97 SetName (const char *name, bool strict);
98
99 const ConstString &
100 GetClassName ();
101
102 const ConstString &
103 GetClassNameWithCategory ();
104
105 const ConstString &
106 GetCategory ();
107
108 const ConstString &
109 GetSelector ();
110
111 // Get all possible names for a method. Examples:
112 // If name is "+[NSString(my_additions) myStringWithCString:]"
113 // names[0] => "+[NSString(my_additions) myStringWithCString:]"
114 // names[1] => "+[NSString myStringWithCString:]"
115 // If name is specified without the leading '+' or '-' like "[NSString(my_additions) myStringWithCString:]"
116 // names[0] => "+[NSString(my_additions) myStringWithCString:]"
117 // names[1] => "-[NSString(my_additions) myStringWithCString:]"
118 // names[2] => "+[NSString myStringWithCString:]"
119 // names[3] => "-[NSString myStringWithCString:]"
120 size_t
121 GetFullNames (std::vector<ConstString> &names, bool append);
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000122
Jim Inghamaa816b82015-09-02 01:59:14 +0000123 protected:
124 ConstString m_full; // Full name: "+[NSString(my_additions) myStringWithCString:]"
125 ConstString m_class; // Class name: "NSString"
126 ConstString m_class_category; // Class with category: "NSString(my_additions)"
127 ConstString m_category; // Category: "my_additions"
128 ConstString m_selector; // Selector: "myStringWithCString:"
129 Type m_type;
130 bool m_category_is_valid;
Jim Inghamaa816b82015-09-02 01:59:14 +0000131 };
132
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000133 ObjCLanguage() = default;
134
135 ~ObjCLanguage() override = default;
136
Enrico Granata5f9d3102015-08-27 21:33:50 +0000137 lldb::LanguageType
Enrico Granatad3233c12015-09-09 01:10:46 +0000138 GetLanguageType () const override
Enrico Granata5f9d3102015-08-27 21:33:50 +0000139 {
140 return lldb::eLanguageTypeObjC;
141 }
142
Enrico Granata170c3952015-09-14 22:18:32 +0000143 lldb::TypeCategoryImplSP
144 GetFormatters () override;
145
Enrico Granatad3233c12015-09-09 01:10:46 +0000146 std::vector<ConstString>
147 GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic) override;
148
Enrico Granata9b0af1b2015-10-01 18:16:18 +0000149 std::unique_ptr<TypeScavenger>
150 GetTypeScavenger () override;
151
Enrico Granata675f49b2015-10-07 18:36:53 +0000152 bool
153 GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint,
154 std::string& prefix, std::string& suffix) override;
155
Enrico Granata5f9d3102015-08-27 21:33:50 +0000156 //------------------------------------------------------------------
157 // Static Functions
158 //------------------------------------------------------------------
159 static void
160 Initialize();
161
162 static void
163 Terminate();
164
165 static lldb_private::Language *
166 CreateInstance (lldb::LanguageType language);
167
168 static lldb_private::ConstString
169 GetPluginNameStatic();
170
Jim Inghamaa816b82015-09-02 01:59:14 +0000171 static bool
172 IsPossibleObjCMethodName (const char *name)
173 {
174 if (!name)
175 return false;
176 bool starts_right = (name[0] == '+' || name[0] == '-') && name[1] == '[';
177 bool ends_right = (name[strlen(name) - 1] == ']');
178 return (starts_right && ends_right);
179 }
180
181 static bool
182 IsPossibleObjCSelector (const char *name)
183 {
184 if (!name)
185 return false;
186
187 if (strchr(name, ':') == NULL)
188 return true;
189 else if (name[strlen(name) - 1] == ':')
190 return true;
191 else
192 return false;
193 }
194
Enrico Granata5f9d3102015-08-27 21:33:50 +0000195 //------------------------------------------------------------------
196 // PluginInterface protocol
197 //------------------------------------------------------------------
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000198 ConstString
Enrico Granatad3233c12015-09-09 01:10:46 +0000199 GetPluginName() override;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000200
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000201 uint32_t
Enrico Granatad3233c12015-09-09 01:10:46 +0000202 GetPluginVersion() override;
Enrico Granata5f9d3102015-08-27 21:33:50 +0000203};
204
205} // namespace lldb_private
206
Eugene Zelenko8d15f332015-10-20 01:10:59 +0000207#endif // liblldb_ObjCLanguage_h_