1 //===-- ObjCLanguage.h ------------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_OBJCLANGUAGE_H
10 #define LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_OBJCLANGUAGE_H
15 #include "Plugins/Language/ClangCommon/ClangHighlighter.h"
16 #include "lldb/Target/Language.h"
17 #include "lldb/Utility/ConstString.h"
18 #include "lldb/lldb-private.h"
20 namespace lldb_private
{
22 class ObjCLanguage
: public Language
{
23 ClangHighlighter m_highlighter
;
28 /// The static factory method for creating a MethodName.
31 /// The name of the method.
34 /// Control whether or not the name parser is strict about +/- in the
35 /// front of the name.
37 /// \return If the name failed to parse as a valid Objective-C method name,
38 /// returns std::nullopt. Otherwise returns a const MethodName.
39 static std::optional
<const MethodName
> Create(llvm::StringRef name
,
42 /// Determines if this method is a class method
44 /// \return Returns true if the method is a class method. False otherwise.
45 bool IsClassMethod() const { return m_type
== eTypeClassMethod
; }
47 /// Determines if this method is an instance method
49 /// \return Returns true if the method is an instance method. False
51 bool IsInstanceMethod() const { return m_type
== eTypeInstanceMethod
; }
53 /// Returns the full name of the method.
55 /// This includes the class name, the category name (if applicable), and the
58 /// \return The name of the method in the form of a const std::string
60 const std::string
&GetFullName() const { return m_full
; }
62 /// Creates a variation of this method without the category.
63 /// If this method has no category, it returns an empty string.
66 /// Full name: "+[NSString(my_additions) myStringWithCString:]"
67 /// becomes "+[NSString myStringWithCString:]"
69 /// \return The method name without the category or an empty string if there
70 /// was no category to begin with.
71 std::string
GetFullNameWithoutCategory() const;
73 /// Returns a reference to the class name.
76 /// Full name: "+[NSString(my_additions) myStringWithCString:]"
77 /// will give you "NSString"
79 /// \return A StringRef to the class name of this method.
80 llvm::StringRef
GetClassName() const;
82 /// Returns a reference to the class name with the category.
85 /// Full name: "+[NSString(my_additions) myStringWithCString:]"
86 /// will give you "NSString(my_additions)"
88 /// Note: If your method has no category, this will give the same output as
91 /// \return A StringRef to the class name (including the category) of this
92 /// method. If there was no category, returns the same as `GetClassName`.
93 llvm::StringRef
GetClassNameWithCategory() const;
95 /// Returns a reference to the category name.
98 /// Full name: "+[NSString(my_additions) myStringWithCString:]"
99 /// will give you "my_additions"
100 /// \return A StringRef to the category name of this method. If no category
101 /// is present, the StringRef is empty.
102 llvm::StringRef
GetCategory() const;
104 /// Returns a reference to the selector name.
107 /// Full name: "+[NSString(my_additions) myStringWithCString:]"
108 /// will give you "myStringWithCString:"
109 /// \return A StringRef to the selector of this method.
110 llvm::StringRef
GetSelector() const;
113 enum Type
{ eTypeUnspecified
, eTypeClassMethod
, eTypeInstanceMethod
};
115 MethodName(llvm::StringRef name
, Type type
)
116 : m_full(name
.str()), m_type(type
) {}
118 const std::string m_full
;
122 ObjCLanguage() = default;
124 ~ObjCLanguage() override
= default;
126 lldb::LanguageType
GetLanguageType() const override
{
127 return lldb::eLanguageTypeObjC
;
130 llvm::StringRef
GetUserEntryPointName() const override
{ return "main"; }
132 // Get all possible names for a method. Examples:
133 // If method_name is "+[NSString(my_additions) myStringWithCString:]"
134 // variant_names[0] => "+[NSString myStringWithCString:]"
135 // If name is specified without the leading '+' or '-' like
136 // "[NSString(my_additions) myStringWithCString:]"
137 // variant_names[0] => "+[NSString(my_additions) myStringWithCString:]"
138 // variant_names[1] => "-[NSString(my_additions) myStringWithCString:]"
139 // variant_names[2] => "+[NSString myStringWithCString:]"
140 // variant_names[3] => "-[NSString myStringWithCString:]"
141 // Also returns the FunctionNameType of each possible name.
142 std::vector
<Language::MethodNameVariant
>
143 GetMethodNameVariants(ConstString method_name
) const override
;
145 bool SymbolNameFitsToLanguage(Mangled mangled
) const override
;
147 lldb::TypeCategoryImplSP
GetFormatters() override
;
149 std::vector
<FormattersMatchCandidate
>
150 GetPossibleFormattersMatches(ValueObject
&valobj
,
151 lldb::DynamicValueType use_dynamic
) override
;
153 std::unique_ptr
<TypeScavenger
> GetTypeScavenger() override
;
155 std::pair
<llvm::StringRef
, llvm::StringRef
>
156 GetFormatterPrefixSuffix(llvm::StringRef type_hint
) override
;
158 bool IsNilReference(ValueObject
&valobj
) override
;
160 llvm::StringRef
GetNilReferenceSummaryString() override
{ return "nil"; }
162 bool IsSourceFile(llvm::StringRef file_path
) const override
;
164 const Highlighter
*GetHighlighter() const override
{ return &m_highlighter
; }
167 static void Initialize();
169 static void Terminate();
171 static lldb_private::Language
*CreateInstance(lldb::LanguageType language
);
173 static llvm::StringRef
GetPluginNameStatic() { return "objc"; }
175 static bool IsPossibleObjCMethodName(const char *name
) {
178 bool starts_right
= (name
[0] == '+' || name
[0] == '-') && name
[1] == '[';
179 bool ends_right
= (name
[strlen(name
) - 1] == ']');
180 return (starts_right
&& ends_right
);
183 static bool IsPossibleObjCSelector(const char *name
) {
187 if (strchr(name
, ':') == nullptr)
189 else if (name
[strlen(name
) - 1] == ':')
195 llvm::StringRef
GetInstanceVariableName() override
{ return "self"; }
197 // PluginInterface protocol
198 llvm::StringRef
GetPluginName() override
{ return GetPluginNameStatic(); }
201 } // namespace lldb_private
203 #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_OBJCLANGUAGE_H