forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			166 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- ObjCLanguage.h ------------------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef liblldb_ObjCLanguage_h_
 | |
| #define liblldb_ObjCLanguage_h_
 | |
| 
 | |
| // C Includes
 | |
| // C++ Includes
 | |
| #include <cstring>
 | |
| #include <vector>
 | |
| 
 | |
| // Other libraries and framework includes
 | |
| // Project includes
 | |
| #include "lldb/Target/Language.h"
 | |
| #include "lldb/Utility/ConstString.h"
 | |
| #include "lldb/lldb-private.h"
 | |
| 
 | |
| namespace lldb_private {
 | |
| 
 | |
| class ObjCLanguage : public Language {
 | |
| public:
 | |
|   class MethodName {
 | |
|   public:
 | |
|     enum Type { eTypeUnspecified, eTypeClassMethod, eTypeInstanceMethod };
 | |
| 
 | |
|     MethodName()
 | |
|         : m_full(), m_class(), m_category(), m_selector(),
 | |
|           m_type(eTypeUnspecified), m_category_is_valid(false) {}
 | |
| 
 | |
|     MethodName(const char *name, bool strict)
 | |
|         : m_full(), m_class(), m_category(), m_selector(),
 | |
|           m_type(eTypeUnspecified), m_category_is_valid(false) {
 | |
|       SetName(name, strict);
 | |
|     }
 | |
|     MethodName(llvm::StringRef name, bool strict)
 | |
|         : m_full(), m_class(), m_category(), m_selector(),
 | |
|           m_type(eTypeUnspecified), m_category_is_valid(false) {
 | |
|       SetName(name, strict);
 | |
|     }
 | |
| 
 | |
|     void Clear();
 | |
| 
 | |
|     bool IsValid(bool strict) const {
 | |
|       // If "strict" is true, the name must have everything specified including
 | |
|       // the leading "+" or "-" on the method name
 | |
|       if (strict && m_type == eTypeUnspecified)
 | |
|         return false;
 | |
|       // Other than that, m_full will only be filled in if the objective C
 | |
|       // name is valid.
 | |
|       return (bool)m_full;
 | |
|     }
 | |
| 
 | |
|     bool HasCategory() { return !GetCategory().IsEmpty(); }
 | |
| 
 | |
|     Type GetType() const { return m_type; }
 | |
| 
 | |
|     const ConstString &GetFullName() const { return m_full; }
 | |
| 
 | |
|     ConstString GetFullNameWithoutCategory(bool empty_if_no_category);
 | |
| 
 | |
|     bool SetName(const char *name, bool strict);
 | |
|     bool SetName(llvm::StringRef name, bool strict);
 | |
| 
 | |
|     const ConstString &GetClassName();
 | |
| 
 | |
|     const ConstString &GetClassNameWithCategory();
 | |
| 
 | |
|     const ConstString &GetCategory();
 | |
| 
 | |
|     const ConstString &GetSelector();
 | |
| 
 | |
|     // Get all possible names for a method. Examples:
 | |
|     // If name is "+[NSString(my_additions) myStringWithCString:]"
 | |
|     //  names[0] => "+[NSString(my_additions) myStringWithCString:]"
 | |
|     //  names[1] => "+[NSString myStringWithCString:]"
 | |
|     // If name is specified without the leading '+' or '-' like
 | |
|     // "[NSString(my_additions) myStringWithCString:]"
 | |
|     //  names[0] => "+[NSString(my_additions) myStringWithCString:]"
 | |
|     //  names[1] => "-[NSString(my_additions) myStringWithCString:]"
 | |
|     //  names[2] => "+[NSString myStringWithCString:]"
 | |
|     //  names[3] => "-[NSString myStringWithCString:]"
 | |
|     size_t GetFullNames(std::vector<ConstString> &names, bool append);
 | |
| 
 | |
|   protected:
 | |
|     ConstString
 | |
|         m_full; // Full name:   "+[NSString(my_additions) myStringWithCString:]"
 | |
|     ConstString m_class; // Class name:  "NSString"
 | |
|     ConstString
 | |
|         m_class_category;   // Class with category: "NSString(my_additions)"
 | |
|     ConstString m_category; // Category:    "my_additions"
 | |
|     ConstString m_selector; // Selector:    "myStringWithCString:"
 | |
|     Type m_type;
 | |
|     bool m_category_is_valid;
 | |
|   };
 | |
| 
 | |
|   ObjCLanguage() = default;
 | |
| 
 | |
|   ~ObjCLanguage() override = default;
 | |
| 
 | |
|   lldb::LanguageType GetLanguageType() const override {
 | |
|     return lldb::eLanguageTypeObjC;
 | |
|   }
 | |
| 
 | |
|   lldb::TypeCategoryImplSP GetFormatters() override;
 | |
| 
 | |
|   std::vector<ConstString>
 | |
|   GetPossibleFormattersMatches(ValueObject &valobj,
 | |
|                                lldb::DynamicValueType use_dynamic) override;
 | |
| 
 | |
|   std::unique_ptr<TypeScavenger> GetTypeScavenger() override;
 | |
| 
 | |
|   bool GetFormatterPrefixSuffix(ValueObject &valobj, ConstString type_hint,
 | |
|                                 std::string &prefix,
 | |
|                                 std::string &suffix) override;
 | |
| 
 | |
|   bool IsNilReference(ValueObject &valobj) override;
 | |
| 
 | |
|   //------------------------------------------------------------------
 | |
|   // Static Functions
 | |
|   //------------------------------------------------------------------
 | |
|   static void Initialize();
 | |
| 
 | |
|   static void Terminate();
 | |
| 
 | |
|   static lldb_private::Language *CreateInstance(lldb::LanguageType language);
 | |
| 
 | |
|   static lldb_private::ConstString GetPluginNameStatic();
 | |
| 
 | |
|   static bool IsPossibleObjCMethodName(const char *name) {
 | |
|     if (!name)
 | |
|       return false;
 | |
|     bool starts_right = (name[0] == '+' || name[0] == '-') && name[1] == '[';
 | |
|     bool ends_right = (name[strlen(name) - 1] == ']');
 | |
|     return (starts_right && ends_right);
 | |
|   }
 | |
| 
 | |
|   static bool IsPossibleObjCSelector(const char *name) {
 | |
|     if (!name)
 | |
|       return false;
 | |
| 
 | |
|     if (strchr(name, ':') == nullptr)
 | |
|       return true;
 | |
|     else if (name[strlen(name) - 1] == ':')
 | |
|       return true;
 | |
|     else
 | |
|       return false;
 | |
|   }
 | |
| 
 | |
|   //------------------------------------------------------------------
 | |
|   // PluginInterface protocol
 | |
|   //------------------------------------------------------------------
 | |
|   ConstString GetPluginName() override;
 | |
| 
 | |
|   uint32_t GetPluginVersion() override;
 | |
| };
 | |
| 
 | |
| } // namespace lldb_private
 | |
| 
 | |
| #endif // liblldb_ObjCLanguage_h_
 |