[Lldb-commits] [lldb] r281993 - Make it so that one can register prefix matches as well as identical matches as extra cases for NSDictionary data formatting

Enrico Granata via lldb-commits lldb-commits at lists.llvm.org
Tue Sep 20 11:26:31 PDT 2016


Author: enrico
Date: Tue Sep 20 13:26:30 2016
New Revision: 281993

URL: http://llvm.org/viewvc/llvm-project?rev=281993&view=rev
Log:
Make it so that one can register prefix matches as well as identical matches as extra cases for NSDictionary data formatting


Modified:
    lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp
    lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.h

Modified: lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp?rev=281993&r1=281992&r2=281993&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.cpp Tue Sep 20 13:26:30 2016
@@ -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::NSDiction
    }*/
   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::NSDictionarySy
     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;

Modified: lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.h?rev=281993&r1=281992&r2=281993&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.h (original)
+++ lldb/trunk/source/Plugins/Language/ObjC/NSDictionary.h Tue Sep 20 13:26:30 2016
@@ -18,6 +18,7 @@
 #include "lldb/DataFormatters/TypeSynthetic.h"
 
 #include <map>
+#include <memory>
 
 namespace lldb_private {
 namespace formatters {
@@ -39,10 +40,53 @@ NSDictionarySyntheticFrontEndCreator(CXX
 
 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




More information about the lldb-commits mailing list