diff options
-rw-r--r-- | lldb/source/Plugins/Language/ObjC/NSDictionary.cpp | 44 | ||||
-rw-r--r-- | lldb/source/Plugins/Language/ObjC/NSDictionary.h | 48 |
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 |