xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1061da546Spatrick //===-- ObjCLanguage.h ------------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_OBJCLANGUAGE_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_OBJCLANGUAGE_H
11061da546Spatrick 
12061da546Spatrick #include <cstring>
13061da546Spatrick #include <vector>
14061da546Spatrick 
15061da546Spatrick #include "Plugins/Language/ClangCommon/ClangHighlighter.h"
16061da546Spatrick #include "lldb/Target/Language.h"
17061da546Spatrick #include "lldb/Utility/ConstString.h"
18061da546Spatrick #include "lldb/lldb-private.h"
19061da546Spatrick 
20061da546Spatrick namespace lldb_private {
21061da546Spatrick 
22061da546Spatrick class ObjCLanguage : public Language {
23061da546Spatrick   ClangHighlighter m_highlighter;
24061da546Spatrick 
25061da546Spatrick public:
26061da546Spatrick   class MethodName {
27061da546Spatrick   public:
28061da546Spatrick     enum Type { eTypeUnspecified, eTypeClassMethod, eTypeInstanceMethod };
29061da546Spatrick 
MethodName()30be691f3bSpatrick     MethodName() : m_full(), m_class(), m_category(), m_selector() {}
31061da546Spatrick 
MethodName(const char * name,bool strict)32061da546Spatrick     MethodName(const char *name, bool strict)
33061da546Spatrick         : m_full(), m_class(), m_category(), m_selector(),
34061da546Spatrick           m_type(eTypeUnspecified), m_category_is_valid(false) {
35061da546Spatrick       SetName(name, strict);
36061da546Spatrick     }
MethodName(llvm::StringRef name,bool strict)37061da546Spatrick     MethodName(llvm::StringRef name, bool strict)
38061da546Spatrick         : m_full(), m_class(), m_category(), m_selector(),
39061da546Spatrick           m_type(eTypeUnspecified), m_category_is_valid(false) {
40061da546Spatrick       SetName(name, strict);
41061da546Spatrick     }
42061da546Spatrick 
43061da546Spatrick     void Clear();
44061da546Spatrick 
IsValid(bool strict)45061da546Spatrick     bool IsValid(bool strict) const {
46061da546Spatrick       // If "strict" is true, the name must have everything specified including
47061da546Spatrick       // the leading "+" or "-" on the method name
48061da546Spatrick       if (strict && m_type == eTypeUnspecified)
49061da546Spatrick         return false;
50061da546Spatrick       // Other than that, m_full will only be filled in if the objective C
51061da546Spatrick       // name is valid.
52061da546Spatrick       return (bool)m_full;
53061da546Spatrick     }
54061da546Spatrick 
HasCategory()55061da546Spatrick     bool HasCategory() { return !GetCategory().IsEmpty(); }
56061da546Spatrick 
GetType()57061da546Spatrick     Type GetType() const { return m_type; }
58061da546Spatrick 
GetFullName()59061da546Spatrick     ConstString GetFullName() const { return m_full; }
60061da546Spatrick 
61061da546Spatrick     ConstString GetFullNameWithoutCategory(bool empty_if_no_category);
62061da546Spatrick 
63061da546Spatrick     bool SetName(const char *name, bool strict);
64061da546Spatrick     bool SetName(llvm::StringRef name, bool strict);
65061da546Spatrick 
66061da546Spatrick     ConstString GetClassName();
67061da546Spatrick 
68061da546Spatrick     ConstString GetClassNameWithCategory();
69061da546Spatrick 
70061da546Spatrick     ConstString GetCategory();
71061da546Spatrick 
72061da546Spatrick     ConstString GetSelector();
73061da546Spatrick 
74061da546Spatrick   protected:
75061da546Spatrick     ConstString
76061da546Spatrick         m_full; // Full name:   "+[NSString(my_additions) myStringWithCString:]"
77061da546Spatrick     ConstString m_class; // Class name:  "NSString"
78061da546Spatrick     ConstString
79061da546Spatrick         m_class_category;   // Class with category: "NSString(my_additions)"
80061da546Spatrick     ConstString m_category; // Category:    "my_additions"
81061da546Spatrick     ConstString m_selector; // Selector:    "myStringWithCString:"
82be691f3bSpatrick     Type m_type = eTypeUnspecified;
83be691f3bSpatrick     bool m_category_is_valid = false;
84061da546Spatrick   };
85061da546Spatrick 
86061da546Spatrick   ObjCLanguage() = default;
87061da546Spatrick 
88061da546Spatrick   ~ObjCLanguage() override = default;
89061da546Spatrick 
GetLanguageType()90061da546Spatrick   lldb::LanguageType GetLanguageType() const override {
91061da546Spatrick     return lldb::eLanguageTypeObjC;
92061da546Spatrick   }
93061da546Spatrick 
94061da546Spatrick   // Get all possible names for a method. Examples:
95061da546Spatrick   // If method_name is "+[NSString(my_additions) myStringWithCString:]"
96061da546Spatrick   //   variant_names[0] => "+[NSString myStringWithCString:]"
97061da546Spatrick   // If name is specified without the leading '+' or '-' like
98061da546Spatrick   // "[NSString(my_additions) myStringWithCString:]"
99061da546Spatrick   //  variant_names[0] => "+[NSString(my_additions) myStringWithCString:]"
100061da546Spatrick   //  variant_names[1] => "-[NSString(my_additions) myStringWithCString:]"
101061da546Spatrick   //  variant_names[2] => "+[NSString myStringWithCString:]"
102061da546Spatrick   //  variant_names[3] => "-[NSString myStringWithCString:]"
103be691f3bSpatrick   // Also returns the FunctionNameType of each possible name.
104be691f3bSpatrick   std::vector<Language::MethodNameVariant>
105061da546Spatrick   GetMethodNameVariants(ConstString method_name) const override;
106061da546Spatrick 
107be691f3bSpatrick   bool SymbolNameFitsToLanguage(Mangled mangled) const override;
108be691f3bSpatrick 
109061da546Spatrick   lldb::TypeCategoryImplSP GetFormatters() override;
110061da546Spatrick 
111*f6aab3d8Srobert   std::vector<FormattersMatchCandidate>
112061da546Spatrick   GetPossibleFormattersMatches(ValueObject &valobj,
113061da546Spatrick                                lldb::DynamicValueType use_dynamic) override;
114061da546Spatrick 
115061da546Spatrick   std::unique_ptr<TypeScavenger> GetTypeScavenger() override;
116061da546Spatrick 
117061da546Spatrick   bool GetFormatterPrefixSuffix(ValueObject &valobj, ConstString type_hint,
118061da546Spatrick                                 std::string &prefix,
119061da546Spatrick                                 std::string &suffix) override;
120061da546Spatrick 
121061da546Spatrick   bool IsNilReference(ValueObject &valobj) override;
122061da546Spatrick 
GetNilReferenceSummaryString()123be691f3bSpatrick   llvm::StringRef GetNilReferenceSummaryString() override { return "nil"; }
124be691f3bSpatrick 
125061da546Spatrick   bool IsSourceFile(llvm::StringRef file_path) const override;
126061da546Spatrick 
GetHighlighter()127061da546Spatrick   const Highlighter *GetHighlighter() const override { return &m_highlighter; }
128061da546Spatrick 
129061da546Spatrick   // Static Functions
130061da546Spatrick   static void Initialize();
131061da546Spatrick 
132061da546Spatrick   static void Terminate();
133061da546Spatrick 
134061da546Spatrick   static lldb_private::Language *CreateInstance(lldb::LanguageType language);
135061da546Spatrick 
GetPluginNameStatic()136*f6aab3d8Srobert   static llvm::StringRef GetPluginNameStatic() { return "objc"; }
137061da546Spatrick 
IsPossibleObjCMethodName(const char * name)138061da546Spatrick   static bool IsPossibleObjCMethodName(const char *name) {
139061da546Spatrick     if (!name)
140061da546Spatrick       return false;
141061da546Spatrick     bool starts_right = (name[0] == '+' || name[0] == '-') && name[1] == '[';
142061da546Spatrick     bool ends_right = (name[strlen(name) - 1] == ']');
143061da546Spatrick     return (starts_right && ends_right);
144061da546Spatrick   }
145061da546Spatrick 
IsPossibleObjCSelector(const char * name)146061da546Spatrick   static bool IsPossibleObjCSelector(const char *name) {
147061da546Spatrick     if (!name)
148061da546Spatrick       return false;
149061da546Spatrick 
150061da546Spatrick     if (strchr(name, ':') == nullptr)
151061da546Spatrick       return true;
152061da546Spatrick     else if (name[strlen(name) - 1] == ':')
153061da546Spatrick       return true;
154061da546Spatrick     else
155061da546Spatrick       return false;
156061da546Spatrick   }
157061da546Spatrick 
158061da546Spatrick   // PluginInterface protocol
GetPluginName()159*f6aab3d8Srobert   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
160061da546Spatrick };
161061da546Spatrick 
162061da546Spatrick } // namespace lldb_private
163061da546Spatrick 
164dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_OBJCLANGUAGE_H
165