summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/source/Plugins/Language/ObjC/NSDictionary.cpp44
-rw-r--r--lldb/source/Plugins/Language/ObjC/NSDictionary.h48
2 files changed, 78 insertions, 14 deletions
diff --git a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp
index e1fa67319ee..341f09830e8 100644
--- a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp
+++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp
@@ -34,15 +34,34 @@ using namespace lldb;
using namespace lldb_private;
using namespace lldb_private::formatters;
-std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
+NSDictionary_Additionals::AdditionalFormatterMatching::Prefix::Prefix(
+ ConstString p)
+ : m_prefix(p) {}
+
+bool NSDictionary_Additionals::AdditionalFormatterMatching::Prefix::Match(
+ ConstString class_name) {
+ return class_name.GetStringRef().startswith(m_prefix.GetStringRef());
+}
+
+NSDictionary_Additionals::AdditionalFormatterMatching::Full::Full(ConstString n)
+ : m_name(n) {}
+
+bool NSDictionary_Additionals::AdditionalFormatterMatching::Full::Match(
+ ConstString class_name) {
+ return (class_name == m_name);
+}
+
+NSDictionary_Additionals::AdditionalFormatters<
+ CXXFunctionSummaryFormat::Callback> &
NSDictionary_Additionals::GetAdditionalSummaries() {
- static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map;
+ static AdditionalFormatters<CXXFunctionSummaryFormat::Callback> g_map;
return g_map;
}
-std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
+NSDictionary_Additionals::AdditionalFormatters<
+ CXXSyntheticChildren::CreateFrontEndCallback> &
NSDictionary_Additionals::GetAdditionalSynthetics() {
- static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>
+ static AdditionalFormatters<CXXSyntheticChildren::CreateFrontEndCallback>
g_map;
return g_map;
}
@@ -265,11 +284,11 @@ bool lldb_private::formatters::NSDictionarySummaryProvider(
}*/
else {
auto &map(NSDictionary_Additionals::GetAdditionalSummaries());
- auto iter = map.find(class_name), end = map.end();
- if (iter != end)
- return iter->second(valobj, stream, options);
- else
- return false;
+ for (auto &candidate : map) {
+ if (candidate.first && candidate.first->Match(class_name))
+ return candidate.second(valobj, stream, options);
+ }
+ return false;
}
std::string prefix, suffix;
@@ -331,9 +350,10 @@ lldb_private::formatters::NSDictionarySyntheticFrontEndCreator(
return (new NSDictionary1SyntheticFrontEnd(valobj_sp));
} else {
auto &map(NSDictionary_Additionals::GetAdditionalSynthetics());
- auto iter = map.find(class_name), end = map.end();
- if (iter != end)
- return iter->second(synth, valobj_sp);
+ for (auto &candidate : map) {
+ if (candidate.first && candidate.first->Match((class_name)))
+ return candidate.second(synth, valobj_sp);
+ }
}
return nullptr;
diff --git a/lldb/source/Plugins/Language/ObjC/NSDictionary.h b/lldb/source/Plugins/Language/ObjC/NSDictionary.h
index cbb484a661f..10318a5bf62 100644
--- a/lldb/source/Plugins/Language/ObjC/NSDictionary.h
+++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.h
@@ -18,6 +18,7 @@
#include "lldb/DataFormatters/TypeSynthetic.h"
#include <map>
+#include <memory>
namespace lldb_private {
namespace formatters {
@@ -39,10 +40,53 @@ NSDictionarySyntheticFrontEndCreator(CXXSyntheticChildren *,
class NSDictionary_Additionals {
public:
- static std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
+ class AdditionalFormatterMatching {
+ public:
+ class Matcher {
+ public:
+ virtual ~Matcher() = default;
+ virtual bool Match(ConstString class_name) = 0;
+
+ typedef std::unique_ptr<Matcher> UP;
+ };
+ class Prefix : public Matcher {
+ public:
+ Prefix(ConstString p);
+ virtual ~Prefix() = default;
+ virtual bool Match(ConstString class_name) override;
+
+ private:
+ ConstString m_prefix;
+ };
+ class Full : public Matcher {
+ public:
+ Full(ConstString n);
+ virtual ~Full() = default;
+ virtual bool Match(ConstString class_name) override;
+
+ private:
+ ConstString m_name;
+ };
+ typedef Matcher::UP MatcherUP;
+
+ MatcherUP GetFullMatch(ConstString n) { return llvm::make_unique<Full>(n); }
+
+ MatcherUP GetPrefixMatch(ConstString p) {
+ return llvm::make_unique<Prefix>(p);
+ }
+ };
+
+ template <typename FormatterType>
+ using AdditionalFormatter =
+ std::pair<AdditionalFormatterMatching::MatcherUP, FormatterType>;
+
+ template <typename FormatterType>
+ using AdditionalFormatters = std::vector<AdditionalFormatter<FormatterType>>;
+
+ static AdditionalFormatters<CXXFunctionSummaryFormat::Callback> &
GetAdditionalSummaries();
- static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
+ static AdditionalFormatters<CXXSyntheticChildren::CreateFrontEndCallback> &
GetAdditionalSynthetics();
};
} // namespace formatters
OpenPOWER on IntegriCloud