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