bulbazord created this revision.
bulbazord added a reviewer: teemperor.
bulbazord requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
There are several instances where one may want to ask questions about
the name of a method/function/whatever. Classes like
CPlusPlusLanguage::MethodName and ObjCLanguage::MethodName fulfill this
purpose right now, but users of these have to have knowledge on these
classes (from plugins) to function. I propose a new class
`Language::MethodNameInfo` to abstract this away so that lldb's Core
libraries can ask questions about a method name without knowing the
details of a plugin.
Currently the class only has one method to override, `GetSelector`, but
I imagine it will have more in the future. I only added the one method
needed to replace the use of `ObjCLanguage` in Symtab.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D103210
Files:
lldb/include/lldb/Target/Language.h
lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
lldb/source/Symbol/Symtab.cpp
lldb/source/Target/Language.cpp
Index: lldb/source/Target/Language.cpp
===================================================================
--- lldb/source/Target/Language.cpp
+++ lldb/source/Target/Language.cpp
@@ -356,6 +356,11 @@
return PluginManager::GetREPLAllTypeSystemSupportedLanguages();
}
+std::unique_ptr<Language::MethodNameInfo>
+Language::GetMethodNameInfo(llvm::StringRef name) {
+ return nullptr;
+}
+
std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
return nullptr;
}
Index: lldb/source/Symbol/Symtab.cpp
===================================================================
--- lldb/source/Symbol/Symtab.cpp
+++ lldb/source/Symbol/Symtab.cpp
@@ -9,8 +9,6 @@
#include <map>
#include <set>
-#include "Plugins/Language/ObjC/ObjCLanguage.h"
-
#include "lldb/Core/Module.h"
#include "lldb/Core/RichManglingContext.h"
#include "lldb/Core/Section.h"
@@ -18,6 +16,7 @@
#include "lldb/Symbol/Symbol.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Symbol/Symtab.h"
+#include "lldb/Target/Language.h"
#include "lldb/Utility/RegularExpression.h"
#include "lldb/Utility/Stream.h"
#include "lldb/Utility/Timer.h"
@@ -311,13 +310,16 @@
// If the demangled name turns out to be an ObjC name, and is a category
// name, add the version without categories to the index too.
- ObjCLanguage::MethodName objc_method(name.GetStringRef(), true);
- if (objc_method.IsValid(true)) {
- m_selector_to_index.Append(objc_method.GetSelector(), value);
-
- if (ConstString objc_method_no_category =
- objc_method.GetFullNameWithoutCategory(true))
- m_name_to_index.Append(objc_method_no_category, value);
+ if (auto *objc_lang = Language::FindPlugin(lldb::eLanguageTypeObjC)) {
+ if (std::unique_ptr<Language::MethodNameInfo> method_name_info =
+ objc_lang->GetMethodNameInfo(name.GetStringRef())) {
+ m_selector_to_index.Append(
+ method_name_info->GetSelector().getValue(), value);
+ for (ConstString objc_method_variant :
+ objc_lang->GetMethodNameVariants(name)) {
+ m_name_to_index.Append(objc_method_variant, value);
+ }
+ }
}
}
}
Index: lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
===================================================================
--- lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
+++ lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
@@ -85,6 +85,18 @@
bool m_category_is_valid;
};
+ class ObjCMethodNameInfo : public Language::MethodNameInfo {
+ ObjCLanguage::MethodName m_method_name;
+
+ public:
+ ObjCMethodNameInfo(llvm::StringRef name) : m_method_name(name, true) {}
+
+ bool IsValid() { return m_method_name.IsValid(true); }
+ llvm::Optional<ConstString> GetSelector() override {
+ return m_method_name.GetSelector();
+ }
+ };
+
ObjCLanguage() = default;
~ObjCLanguage() override = default;
@@ -111,6 +123,9 @@
GetPossibleFormattersMatches(ValueObject &valobj,
lldb::DynamicValueType use_dynamic) override;
+ std::unique_ptr<Language::MethodNameInfo>
+ GetMethodNameInfo(llvm::StringRef name) override;
+
std::unique_ptr<TypeScavenger> GetTypeScavenger() override;
bool GetFormatterPrefixSuffix(ValueObject &valobj, ConstString type_hint,
Index: lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
===================================================================
--- lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -935,6 +935,16 @@
return result;
}
+std::unique_ptr<Language::MethodNameInfo>
+ObjCLanguage::GetMethodNameInfo(llvm::StringRef name) {
+ if (auto ret = std::make_unique<ObjCMethodNameInfo>(name)) {
+ if (ret->IsValid()) {
+ return ret;
+ }
+ }
+ return nullptr;
+}
+
std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() {
class ObjCScavengerResult : public Language::TypeScavenger::Result {
public:
Index: lldb/include/lldb/Target/Language.h
===================================================================
--- lldb/include/lldb/Target/Language.h
+++ lldb/include/lldb/Target/Language.h
@@ -28,6 +28,12 @@
class Language : public PluginInterface {
public:
+ class MethodNameInfo {
+ public:
+ virtual llvm::Optional<ConstString> GetSelector() = 0;
+ virtual ~MethodNameInfo() = default;
+ };
+
class TypeScavenger {
public:
class Result {
@@ -180,6 +186,9 @@
GetPossibleFormattersMatches(ValueObject &valobj,
lldb::DynamicValueType use_dynamic);
+ virtual std::unique_ptr<MethodNameInfo>
+ GetMethodNameInfo(llvm::StringRef name);
+
virtual std::unique_ptr<TypeScavenger> GetTypeScavenger();
virtual const char *GetLanguageSpecificTypeLookupHelp();
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits