[Lldb-commits] [lldb] e5fd507 - [NFCI] More TypeCategoryImpl refactoring.

Jorge Gorbe Moya via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 10 15:15:46 PDT 2022


Author: Jorge Gorbe Moya
Date: 2022-10-10T15:14:55-07:00
New Revision: e5fd507f9b6f774c83c7b061fa77c906c882935b

URL: https://github.com/llvm/llvm-project/commit/e5fd507f9b6f774c83c7b061fa77c906c882935b
DIFF: https://github.com/llvm/llvm-project/commit/e5fd507f9b6f774c83c7b061fa77c906c882935b.diff

LOG: [NFCI] More TypeCategoryImpl refactoring.

The main aim of this patch is to delete the remaining instances of code
reaching into the internals of `TypeCategoryImpl`. I made the following
changes:

- Add some more methods to `TieredFormatterContainer` and
  `TypeCategoryImpl` to expose functionality that is implemented in
  `FormattersContainer`.

- Add new overloads of `TypeCategoryImpl::AddTypeXXX` to make it easier
  to add formatters to categories without reaching into the internal
  `FormattersContainer` objects.

- Remove the `GetTypeXXXContainer` and `GetRegexTypeXXXContainer`
  accessors from `TypeCategoryImpl` and update all call sites to use the
  new methods instead.

Differential Revision: https://reviews.llvm.org/D135399

Added: 
    

Modified: 
    lldb/include/lldb/DataFormatters/TypeCategory.h
    lldb/source/Commands/CommandObjectType.cpp
    lldb/source/DataFormatters/FormatManager.cpp
    lldb/source/DataFormatters/FormattersHelpers.cpp
    lldb/source/DataFormatters/TypeCategory.cpp
    lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
    lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/include/lldb/DataFormatters/TypeCategory.h b/lldb/include/lldb/DataFormatters/TypeCategory.h
index edf3f5d6605e4..bad39aa676af3 100644
--- a/lldb/include/lldb/DataFormatters/TypeCategory.h
+++ b/lldb/include/lldb/DataFormatters/TypeCategory.h
@@ -45,14 +45,10 @@ template <typename FormatterImpl> class TieredFormatterContainer {
       sc = std::make_shared<Subcontainer>(change_listener);
   }
 
-  /// Returns the subcontainer containing formatters for exact matching.
-  std::shared_ptr<Subcontainer> GetExactMatch() const {
-    return m_subcontainers[lldb::eFormatterMatchExact];
-  }
-
-  /// Returns the subcontainer containing formatters for regex matching.
-  std::shared_ptr<Subcontainer> GetRegexMatch() const {
-    return m_subcontainers[lldb::eFormatterMatchRegex];
+  /// Clears all subcontainers.
+  void Clear() {
+    for (auto sc : m_subcontainers)
+      sc->Clear();
   }
 
   /// Adds a formatter to the right subcontainer depending on the matching type
@@ -69,6 +65,15 @@ template <typename FormatterImpl> class TieredFormatterContainer {
         TypeMatcher(type_sp));
   }
 
+  /// Deletes all formatters registered with the string `name`, in all
+  /// subcontainers.
+  bool Delete(ConstString name) {
+    bool success = false;
+    for (auto sc : m_subcontainers)
+      success = sc->Delete(name) || success;
+    return success;
+  }
+
   /// Returns the total count of elements across all subcontainers.
   uint32_t GetCount() {
     uint32_t result = 0;
@@ -100,6 +105,15 @@ template <typename FormatterImpl> class TieredFormatterContainer {
     return false;
   }
 
+  bool AnyMatches(ConstString type_name) {
+    std::shared_ptr<FormatterImpl> entry;
+    for (auto sc : m_subcontainers) {
+      if (sc->Get(type_name, entry))
+        return true;
+    }
+    return false;
+  }
+
   /// Returns a formatter that is an exact match for `type_specifier_sp`. It
   /// looks for a formatter with the same matching type that was created from
   /// the same string. This is useful so we can refer to a formatter using the
@@ -140,6 +154,11 @@ template <typename FormatterImpl> class TieredFormatterContainer {
     }
   }
 
+  void AutoComplete(CompletionRequest &request) {
+    for (auto sc: m_subcontainers)
+      sc->AutoComplete(request);
+  }
+
  private:
   std::array<std::shared_ptr<Subcontainer>, lldb::eLastFormatterMatchType + 1>
       m_subcontainers;
@@ -188,36 +207,6 @@ class TypeCategoryImpl {
     m_synth_cont.ForEach(callback.callback);
   }
 
-  FormatContainer::SubcontainerSP GetTypeFormatsContainer() {
-    return m_format_cont.GetExactMatch();
-  }
-
-  FormatContainer::SubcontainerSP GetRegexTypeFormatsContainer() {
-    return m_format_cont.GetRegexMatch();
-  }
-
-  FormatContainer &GetFormatContainer() { return m_format_cont; }
-
-  SummaryContainer::SubcontainerSP GetTypeSummariesContainer() {
-    return m_summary_cont.GetExactMatch();
-  }
-
-  SummaryContainer::SubcontainerSP GetRegexTypeSummariesContainer() {
-    return m_summary_cont.GetRegexMatch();
-  }
-
-  SummaryContainer &GetSummaryContainer() { return m_summary_cont; }
-
-  FilterContainer::SubcontainerSP GetTypeFiltersContainer() {
-    return m_filter_cont.GetExactMatch();
-  }
-
-  FilterContainer::SubcontainerSP GetRegexTypeFiltersContainer() {
-    return m_filter_cont.GetRegexMatch();
-  }
-
-  FilterContainer &GetFilterContainer() { return m_filter_cont; }
-
   FormatContainer::MapValueType
   GetFormatForType(lldb::TypeNameSpecifierImplSP type_sp);
 
@@ -235,21 +224,50 @@ class TypeCategoryImpl {
     m_format_cont.Add(type_sp, format_sp);
   }
 
+  void AddTypeFormat(llvm::StringRef name, lldb::FormatterMatchType match_type,
+                     lldb::TypeFormatImplSP format_sp) {
+    AddTypeFormat(
+        std::make_shared<lldb_private::TypeNameSpecifierImpl>(name, match_type),
+        format_sp);
+  }
+
   void AddTypeSummary(lldb::TypeNameSpecifierImplSP type_sp,
                       lldb::TypeSummaryImplSP summary_sp) {
     m_summary_cont.Add(type_sp, summary_sp);
   }
 
+  void AddTypeSummary(llvm::StringRef name, lldb::FormatterMatchType match_type,
+                      lldb::TypeSummaryImplSP summary_sp) {
+    AddTypeSummary(
+        std::make_shared<lldb_private::TypeNameSpecifierImpl>(name, match_type),
+        summary_sp);
+  }
+
   void AddTypeFilter(lldb::TypeNameSpecifierImplSP type_sp,
                      lldb::TypeFilterImplSP filter_sp) {
     m_filter_cont.Add(type_sp, filter_sp);
   }
 
+  void AddTypeFilter(llvm::StringRef name, lldb::FormatterMatchType match_type,
+                     lldb::TypeFilterImplSP filter_sp) {
+    AddTypeFilter(
+        std::make_shared<lldb_private::TypeNameSpecifierImpl>(name, match_type),
+        filter_sp);
+  }
+
   void AddTypeSynthetic(lldb::TypeNameSpecifierImplSP type_sp,
                         lldb::SyntheticChildrenSP synth_sp) {
     m_synth_cont.Add(type_sp, synth_sp);
   }
 
+  void AddTypeSynthetic(llvm::StringRef name,
+                        lldb::FormatterMatchType match_type,
+                        lldb::SyntheticChildrenSP synth_sp) {
+    AddTypeSynthetic(
+        std::make_shared<lldb_private::TypeNameSpecifierImpl>(name, match_type),
+        synth_sp);
+  }
+
   bool DeleteTypeFormat(lldb::TypeNameSpecifierImplSP type_sp) {
     return m_format_cont.Delete(type_sp);
   }
@@ -294,17 +312,6 @@ class TypeCategoryImpl {
 
   SynthContainer::MapValueType GetSyntheticAtIndex(size_t index);
 
-  SynthContainer::SubcontainerSP GetTypeSyntheticsContainer() {
-    return m_synth_cont.GetExactMatch();
-  }
-
-  SynthContainer::SubcontainerSP GetRegexTypeSyntheticsContainer() {
-    return m_synth_cont.GetRegexMatch();
-  }
-
-  SynthContainer &GetSyntheticsContainer() { return m_synth_cont; }
-
-
   bool IsEnabled() const { return m_enabled; }
 
   uint32_t GetEnabledPosition() {
@@ -345,6 +352,8 @@ class TypeCategoryImpl {
                   const char **matching_category = nullptr,
                   FormatCategoryItems *matching_type = nullptr);
 
+  void AutoComplete(CompletionRequest &request, FormatCategoryItems items);
+
   typedef std::shared_ptr<TypeCategoryImpl> SharedPointer;
 
 private:

diff  --git a/lldb/source/Commands/CommandObjectType.cpp b/lldb/source/Commands/CommandObjectType.cpp
index 01b3ec2fed141..63d3c6979ec31 100644
--- a/lldb/source/Commands/CommandObjectType.cpp
+++ b/lldb/source/Commands/CommandObjectType.cpp
@@ -681,19 +681,17 @@ pointers to floats.  Nor will it change the default display for Afloat and Bfloa
         return false;
       }
 
-      ConstString typeCS(arg_entry.ref());
+      FormatterMatchType match_type = eFormatterMatchExact;
       if (m_command_options.m_regex) {
+        match_type = eFormatterMatchRegex;
         RegularExpression typeRX(arg_entry.ref());
         if (!typeRX.IsValid()) {
           result.AppendError(
               "regex format error (maybe this is not really a regex?)");
           return false;
         }
-        category_sp->GetRegexTypeSummariesContainer()->Delete(typeCS);
-        category_sp->GetRegexTypeFormatsContainer()->Add(std::move(typeRX),
-                                                         entry);
-      } else
-        category_sp->GetTypeFormatsContainer()->Add(std::move(typeCS), entry);
+      }
+      category_sp->AddTypeFormat(arg_entry.ref(), match_type, entry);
     }
 
     result.SetStatus(eReturnStatusSuccessFinishNoResult);
@@ -783,27 +781,7 @@ class CommandObjectTypeFormatterDelete : public CommandObjectParsed {
 
     DataVisualization::Categories::ForEach(
         [this, &request](const lldb::TypeCategoryImplSP &category_sp) {
-          if (CHECK_FORMATTER_KIND_MASK(eFormatCategoryItemFormat)) {
-            category_sp->GetTypeFormatsContainer()->AutoComplete(request);
-            category_sp->GetRegexTypeFormatsContainer()->AutoComplete(request);
-          }
-
-          if (CHECK_FORMATTER_KIND_MASK(eFormatCategoryItemSummary)) {
-            category_sp->GetTypeSummariesContainer()->AutoComplete(request);
-            category_sp->GetRegexTypeSummariesContainer()->AutoComplete(
-                request);
-          }
-
-          if (CHECK_FORMATTER_KIND_MASK(eFormatCategoryItemFilter)) {
-            category_sp->GetTypeFiltersContainer()->AutoComplete(request);
-            category_sp->GetRegexTypeFiltersContainer()->AutoComplete(request);
-          }
-
-          if (CHECK_FORMATTER_KIND_MASK(eFormatCategoryItemSynth)) {
-            category_sp->GetTypeSyntheticsContainer()->AutoComplete(request);
-            category_sp->GetRegexTypeSyntheticsContainer()->AutoComplete(
-                request);
-          }
+          category_sp->AutoComplete(request, m_formatter_kind_mask);
           return true;
         });
   }
@@ -1572,6 +1550,15 @@ bool CommandObjectTypeSummaryAdd::AddSummary(ConstString type_name,
                                              SummaryFormatType type,
                                              std::string category_name,
                                              Status *error) {
+
+  // Named summaries are a special case, they exist in their own map in the
+  // FormatManager, outside of any categories.
+  if (type == eNamedSummary) {
+    // system named summaries do not exist (yet?)
+    DataVisualization::NamedSummaryFormats::Add(type_name, entry);
+    return true;
+  }
+
   lldb::TypeCategoryImplSP category;
   DataVisualization::Categories::GetCategory(ConstString(category_name.c_str()),
                                              category);
@@ -1581,7 +1568,9 @@ bool CommandObjectTypeSummaryAdd::AddSummary(ConstString type_name,
       type = eRegexSummary;
   }
 
+  FormatterMatchType match_type = eFormatterMatchExact;
   if (type == eRegexSummary) {
+    match_type = eFormatterMatchRegex;
     RegularExpression typeRX(type_name.GetStringRef());
     if (!typeRX.IsValid()) {
       if (error)
@@ -1589,19 +1578,9 @@ bool CommandObjectTypeSummaryAdd::AddSummary(ConstString type_name,
             "regex format error (maybe this is not really a regex?)");
       return false;
     }
-
-    category->GetRegexTypeSummariesContainer()->Delete(type_name);
-    category->GetRegexTypeSummariesContainer()->Add(std::move(typeRX), entry);
-
-    return true;
-  } else if (type == eNamedSummary) {
-    // system named summaries do not exist (yet?)
-    DataVisualization::NamedSummaryFormats::Add(type_name, entry);
-    return true;
-  } else {
-    category->GetTypeSummariesContainer()->Add(std::move(type_name), entry);
-    return true;
   }
+  category->AddTypeSummary(type_name.GetStringRef(), match_type, entry);
+  return true;
 }
 
 // CommandObjectTypeSummaryDelete
@@ -2332,7 +2311,9 @@ bool CommandObjectTypeSynthAdd::AddSynth(ConstString type_name,
     }
   }
 
+  FormatterMatchType match_type = eFormatterMatchExact;
   if (type == eRegexSynth) {
+    match_type = eFormatterMatchRegex;
     RegularExpression typeRX(type_name.GetStringRef());
     if (!typeRX.IsValid()) {
       if (error)
@@ -2340,15 +2321,10 @@ bool CommandObjectTypeSynthAdd::AddSynth(ConstString type_name,
             "regex format error (maybe this is not really a regex?)");
       return false;
     }
-
-    category->GetRegexTypeSyntheticsContainer()->Delete(type_name);
-    category->GetRegexTypeSyntheticsContainer()->Add(std::move(typeRX), entry);
-
-    return true;
-  } else {
-    category->GetTypeSyntheticsContainer()->Add(std::move(type_name), entry);
-    return true;
   }
+
+  category->AddTypeSynthetic(type_name.GetStringRef(), match_type, entry);
+  return true;
 }
 
 #endif
@@ -2461,7 +2437,9 @@ class CommandObjectTypeFilterAdd : public CommandObjectParsed {
       }
     }
 
+    FormatterMatchType match_type = eFormatterMatchExact;
     if (type == eRegexFilter) {
+      match_type = eFormatterMatchRegex;
       RegularExpression typeRX(type_name.GetStringRef());
       if (!typeRX.IsValid()) {
         if (error)
@@ -2469,15 +2447,9 @@ class CommandObjectTypeFilterAdd : public CommandObjectParsed {
               "regex format error (maybe this is not really a regex?)");
         return false;
       }
-
-      category->GetRegexTypeFiltersContainer()->Delete(type_name);
-      category->GetRegexTypeFiltersContainer()->Add(std::move(typeRX), entry);
-
-      return true;
-    } else {
-      category->GetTypeFiltersContainer()->Add(std::move(type_name), entry);
-      return true;
     }
+    category->AddTypeFilter(type_name.GetStringRef(), match_type, entry);
+    return true;
   }
 
 public:

diff  --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp
index 70600a3cf8c38..db9f6057e8429 100644
--- a/lldb/source/DataFormatters/FormatManager.cpp
+++ b/lldb/source/DataFormatters/FormatManager.cpp
@@ -707,16 +707,14 @@ void FormatManager::LoadSystemFormatters() {
   lldb::TypeSummaryImplSP string_array_format(
       new StringSummaryFormat(string_array_flags, "${var%char[]}"));
 
-  RegularExpression any_size_char_arr(R"(^((un)?signed )?char ?\[[0-9]+\]$)");
-
   TypeCategoryImpl::SharedPointer sys_category_sp =
       GetCategory(m_system_category_name);
 
-  sys_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression(R"(^(unsigned )?char ?(\*|\[\])$)"), string_format);
+  sys_category_sp->AddTypeSummary(R"(^(unsigned )?char ?(\*|\[\])$)",
+                                  eFormatterMatchRegex, string_format);
 
-  sys_category_sp->GetRegexTypeSummariesContainer()->Add(
-      std::move(any_size_char_arr), string_array_format);
+  sys_category_sp->AddTypeSummary(R"(^((un)?signed )?char ?\[[0-9]+\]$)",
+                                  eFormatterMatchRegex, string_array_format);
 
   lldb::TypeSummaryImplSP ostype_summary(
       new StringSummaryFormat(TypeSummaryImpl::Flags()
@@ -729,8 +727,8 @@ void FormatManager::LoadSystemFormatters() {
                                   .SetHideItemNames(false),
                               "${var%O}"));
 
-  sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("OSType"),
-                                                    ostype_summary);
+  sys_category_sp->AddTypeSummary("OSType", eFormatterMatchExact,
+                                  ostype_summary);
 
   TypeFormatImpl::Flags fourchar_flags;
   fourchar_flags.SetCascades(true).SetSkipPointers(true).SetSkipReferences(

diff  --git a/lldb/source/DataFormatters/FormattersHelpers.cpp b/lldb/source/DataFormatters/FormattersHelpers.cpp
index b9c6b017e2939..1f10166d1bc9a 100644
--- a/lldb/source/DataFormatters/FormattersHelpers.cpp
+++ b/lldb/source/DataFormatters/FormattersHelpers.cpp
@@ -26,23 +26,17 @@ void lldb_private::formatters::AddFormat(
     ConstString type_name, TypeFormatImpl::Flags flags, bool regex) {
   lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags));
 
-  if (regex)
-    category_sp->GetRegexTypeFormatsContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), format_sp);
-  else
-    category_sp->GetTypeFormatsContainer()->Add(std::move(type_name),
-                                                format_sp);
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeFormat(type_name.GetStringRef(), match_type, format_sp);
 }
 
 void lldb_private::formatters::AddSummary(
     TypeCategoryImpl::SharedPointer category_sp, TypeSummaryImplSP summary_sp,
     ConstString type_name, bool regex) {
-  if (regex)
-    category_sp->GetRegexTypeSummariesContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), summary_sp);
-  else
-    category_sp->GetTypeSummariesContainer()->Add(std::move(type_name),
-                                                  summary_sp);
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
 }
 
 void lldb_private::formatters::AddStringSummary(
@@ -50,12 +44,9 @@ void lldb_private::formatters::AddStringSummary(
     ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) {
   lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, string));
 
-  if (regex)
-    category_sp->GetRegexTypeSummariesContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), summary_sp);
-  else
-    category_sp->GetTypeSummariesContainer()->Add(std::move(type_name),
-                                                  summary_sp);
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
 }
 
 void lldb_private::formatters::AddOneLineSummary(
@@ -64,12 +55,9 @@ void lldb_private::formatters::AddOneLineSummary(
   flags.SetShowMembersOneLiner(true);
   lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, ""));
 
-  if (regex)
-    category_sp->GetRegexTypeSummariesContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), summary_sp);
-  else
-    category_sp->GetTypeSummariesContainer()->Add(std::move(type_name),
-                                                  summary_sp);
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
 }
 
 void lldb_private::formatters::AddCXXSummary(
@@ -78,12 +66,10 @@ void lldb_private::formatters::AddCXXSummary(
     ConstString type_name, TypeSummaryImpl::Flags flags, bool regex) {
   lldb::TypeSummaryImplSP summary_sp(
       new CXXFunctionSummaryFormat(flags, funct, description));
-  if (regex)
-    category_sp->GetRegexTypeSummariesContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), summary_sp);
-  else
-    category_sp->GetTypeSummariesContainer()->Add(std::move(type_name),
-                                                  summary_sp);
+
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeSummary(type_name.GetStringRef(), match_type, summary_sp);
 }
 
 void lldb_private::formatters::AddCXXSynthetic(
@@ -93,12 +79,9 @@ void lldb_private::formatters::AddCXXSynthetic(
     ScriptedSyntheticChildren::Flags flags, bool regex) {
   lldb::SyntheticChildrenSP synth_sp(
       new CXXSyntheticChildren(flags, description, generator));
-  if (regex)
-    category_sp->GetRegexTypeSyntheticsContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), synth_sp);
-  else
-    category_sp->GetTypeSyntheticsContainer()->Add(std::move(type_name),
-                                                   synth_sp);
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeSynthetic(type_name.GetStringRef(), match_type, synth_sp);
 }
 
 void lldb_private::formatters::AddFilter(
@@ -108,12 +91,9 @@ void lldb_private::formatters::AddFilter(
   TypeFilterImplSP filter_sp(new TypeFilterImpl(flags));
   for (auto child : children)
     filter_sp->AddExpressionPath(child);
-  if (regex)
-    category_sp->GetRegexTypeFiltersContainer()->Add(
-        RegularExpression(type_name.GetStringRef()), filter_sp);
-  else
-    category_sp->GetTypeFiltersContainer()->Add(std::move(type_name),
-                                                filter_sp);
+  FormatterMatchType match_type =
+      regex ? eFormatterMatchRegex : eFormatterMatchExact;
+  category_sp->AddTypeFilter(type_name.GetStringRef(), match_type, filter_sp);
 }
 
 size_t lldb_private::formatters::ExtractIndexFromString(const char *item_name) {

diff  --git a/lldb/source/DataFormatters/TypeCategory.cpp b/lldb/source/DataFormatters/TypeCategory.cpp
index 0a80806e17e87..1d56749682455 100644
--- a/lldb/source/DataFormatters/TypeCategory.cpp
+++ b/lldb/source/DataFormatters/TypeCategory.cpp
@@ -135,49 +135,33 @@ bool TypeCategoryImpl::Get(lldb::LanguageType lang,
 }
 
 void TypeCategoryImpl::Clear(FormatCategoryItems items) {
-  if (items & eFormatCategoryItemFormat) {
-    GetTypeFormatsContainer()->Clear();
-    GetRegexTypeFormatsContainer()->Clear();
-  }
+  if (items & eFormatCategoryItemFormat)
+    m_format_cont.Clear();
 
-  if (items & eFormatCategoryItemSummary) {
-    GetTypeSummariesContainer()->Clear();
-    GetRegexTypeSummariesContainer()->Clear();
-  }
+  if (items & eFormatCategoryItemSummary)
+    m_summary_cont.Clear();
 
-  if (items & eFormatCategoryItemFilter) {
-    GetTypeFiltersContainer()->Clear();
-    GetRegexTypeFiltersContainer()->Clear();
-  }
+  if (items & eFormatCategoryItemFilter)
+    m_filter_cont.Clear();
 
-  if (items & eFormatCategoryItemSynth) {
-    GetTypeSyntheticsContainer()->Clear();
-    GetRegexTypeSyntheticsContainer()->Clear();
-  }
+  if (items & eFormatCategoryItemSynth)
+    m_synth_cont.Clear();
 }
 
 bool TypeCategoryImpl::Delete(ConstString name, FormatCategoryItems items) {
   bool success = false;
 
-  if (items & eFormatCategoryItemFormat) {
-    success = GetTypeFormatsContainer()->Delete(name) || success;
-    success = GetRegexTypeFormatsContainer()->Delete(name) || success;
-  }
+  if (items & eFormatCategoryItemFormat)
+    success = m_format_cont.Delete(name) || success;
 
-  if (items & eFormatCategoryItemSummary) {
-    success = GetTypeSummariesContainer()->Delete(name) || success;
-    success = GetRegexTypeSummariesContainer()->Delete(name) || success;
-  }
+  if (items & eFormatCategoryItemSummary)
+    success = m_summary_cont.Delete(name) || success;
 
-  if (items & eFormatCategoryItemFilter) {
-    success = GetTypeFiltersContainer()->Delete(name) || success;
-    success = GetRegexTypeFiltersContainer()->Delete(name) || success;
-  }
+  if (items & eFormatCategoryItemFilter)
+    success = m_filter_cont.Delete(name) || success;
 
-  if (items & eFormatCategoryItemSynth) {
-    success = GetTypeSyntheticsContainer()->Delete(name) || success;
-    success = GetRegexTypeSyntheticsContainer()->Delete(name) || success;
-  }
+  if (items & eFormatCategoryItemSynth)
+    success = m_synth_cont.Delete(name) || success;
 
   return success;
 }
@@ -185,25 +169,17 @@ bool TypeCategoryImpl::Delete(ConstString name, FormatCategoryItems items) {
 uint32_t TypeCategoryImpl::GetCount(FormatCategoryItems items) {
   uint32_t count = 0;
 
-  if (items & eFormatCategoryItemFormat) {
-    count += GetTypeFormatsContainer()->GetCount();
-    count += GetRegexTypeFormatsContainer()->GetCount();
-  }
+  if (items & eFormatCategoryItemFormat)
+    count += m_format_cont.GetCount();
 
-  if (items & eFormatCategoryItemSummary) {
-    count += GetTypeSummariesContainer()->GetCount();
-    count += GetRegexTypeSummariesContainer()->GetCount();
-  }
+  if (items & eFormatCategoryItemSummary)
+    count += m_summary_cont.GetCount();
 
-  if (items & eFormatCategoryItemFilter) {
-    count += GetTypeFiltersContainer()->GetCount();
-    count += GetRegexTypeFiltersContainer()->GetCount();
-  }
+  if (items & eFormatCategoryItemFilter)
+    count += m_filter_cont.GetCount();
 
-  if (items & eFormatCategoryItemSynth) {
-    count += GetTypeSyntheticsContainer()->GetCount();
-    count += GetRegexTypeSyntheticsContainer()->GetCount();
-  }
+  if (items & eFormatCategoryItemSynth)
+    count += m_synth_cont.GetCount();
 
   return count;
 }
@@ -221,8 +197,7 @@ bool TypeCategoryImpl::AnyMatches(ConstString type_name,
   ScriptedSyntheticChildren::SharedPointer synth_sp;
 
   if (items & eFormatCategoryItemFormat) {
-    if (GetTypeFormatsContainer()->Get(type_name, format_sp) ||
-        GetRegexTypeFormatsContainer()->Get(type_name, format_sp)) {
+    if (m_format_cont.AnyMatches(type_name)) {
       if (matching_category)
         *matching_category = m_name.GetCString();
       if (matching_type)
@@ -232,8 +207,7 @@ bool TypeCategoryImpl::AnyMatches(ConstString type_name,
   }
 
   if (items & eFormatCategoryItemSummary) {
-    if (GetTypeSummariesContainer()->Get(type_name, summary_sp) ||
-        GetRegexTypeSummariesContainer()->Get(type_name, summary_sp)) {
+    if (m_summary_cont.AnyMatches(type_name)) {
       if (matching_category)
         *matching_category = m_name.GetCString();
       if (matching_type)
@@ -243,8 +217,7 @@ bool TypeCategoryImpl::AnyMatches(ConstString type_name,
   }
 
   if (items & eFormatCategoryItemFilter) {
-    if (GetTypeFiltersContainer()->Get(type_name, filter_sp) ||
-        GetRegexTypeFiltersContainer()->Get(type_name, filter_sp)) {
+    if (m_filter_cont.AnyMatches(type_name)) {
       if (matching_category)
         *matching_category = m_name.GetCString();
       if (matching_type)
@@ -254,8 +227,7 @@ bool TypeCategoryImpl::AnyMatches(ConstString type_name,
   }
 
   if (items & eFormatCategoryItemSynth) {
-    if (GetTypeSyntheticsContainer()->Get(type_name, synth_sp) ||
-        GetRegexTypeSyntheticsContainer()->Get(type_name, synth_sp)) {
+    if (m_synth_cont.AnyMatches(type_name)) {
       if (matching_category)
         *matching_category = m_name.GetCString();
       if (matching_type)
@@ -267,6 +239,18 @@ bool TypeCategoryImpl::AnyMatches(ConstString type_name,
   return false;
 }
 
+void TypeCategoryImpl::AutoComplete(CompletionRequest &request,
+                                    FormatCategoryItems items) {
+  if (items & eFormatCategoryItemFormat)
+    m_format_cont.AutoComplete(request);
+  if (items & eFormatCategoryItemSummary)
+    m_summary_cont.AutoComplete(request);
+  if (items & eFormatCategoryItemFilter)
+    m_filter_cont.AutoComplete(request);
+  if (items & eFormatCategoryItemSynth)
+    m_synth_cont.AutoComplete(request);
+}
+
 TypeCategoryImpl::FormatContainer::MapValueType
 TypeCategoryImpl::GetFormatForType(lldb::TypeNameSpecifierImplSP type_sp) {
   return m_format_cont.GetForTypeNameSpecifier(type_sp);

diff  --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
index e2b8bc641fba3..0339d38904759 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -764,8 +764,8 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
       ConstString("^std::__[[:alnum:]]+::span<.+>(( )?&)?$"), stl_deref_flags,
       true);
 
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^(std::__[[:alnum:]]+::)deque<.+>(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^(std::__[[:alnum:]]+::)deque<.+>(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_synth_flags,
           "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
@@ -958,55 +958,52 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
       stl_summary_flags, LibStdcppWStringSummaryProvider,
       "libstdc++ c++11 std::wstring summary provider"));
 
-  cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"),
-                                                    std_string_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::basic_string<char>"), std_string_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::basic_string<char,std::char_traits<char>,std::"
-                  "allocator<char> >"),
-      std_string_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::basic_string<char, std::char_traits<char>, "
-                  "std::allocator<char> >"),
-      std_string_summary_sp);
-
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::__cxx11::string"), cxx11_string_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, "
-                  "std::allocator<char> >"),
-      cxx11_string_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::__cxx11::basic_string<unsigned char, "
-                  "std::char_traits<unsigned char>, "
-                  "std::allocator<unsigned char> >"),
-      cxx11_string_summary_sp);
+  cpp_category_sp->AddTypeSummary("std::string", eFormatterMatchExact,
+                                  std_string_summary_sp);
+  cpp_category_sp->AddTypeSummary("std::basic_string<char>",
+                                  eFormatterMatchRegex, std_string_summary_sp);
+  cpp_category_sp->AddTypeSummary(
+      "std::basic_string<char,std::char_traits<char>,std::allocator<char> >",
+      eFormatterMatchExact, std_string_summary_sp);
+  cpp_category_sp->AddTypeSummary(
+      "std::basic_string<char, std::char_traits<char>, std::allocator<char> >",
+      eFormatterMatchExact, std_string_summary_sp);
+
+  cpp_category_sp->AddTypeSummary("std::__cxx11::string", eFormatterMatchExact,
+                                  cxx11_string_summary_sp);
+  cpp_category_sp->AddTypeSummary(
+      "std::__cxx11::basic_string<char, std::char_traits<char>, "
+      "std::allocator<char> >",
+      eFormatterMatchExact, cxx11_string_summary_sp);
+  cpp_category_sp->AddTypeSummary("std::__cxx11::basic_string<unsigned char, "
+                                  "std::char_traits<unsigned char>, "
+                                  "std::allocator<unsigned char> >",
+                                  eFormatterMatchExact,
+                                  cxx11_string_summary_sp);
 
   // making sure we force-pick the summary for printing wstring (_M_p is a
   // wchar_t*)
   lldb::TypeSummaryImplSP std_wstring_summary_sp(
       new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}"));
 
-  cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"),
-                                                    std_wstring_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::basic_string<wchar_t>"), std_wstring_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::"
-                  "allocator<wchar_t> >"),
-      std_wstring_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, "
-                  "std::allocator<wchar_t> >"),
-      std_wstring_summary_sp);
-
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::__cxx11::wstring"), cxx11_wstring_summary_sp);
-  cpp_category_sp->GetTypeSummariesContainer()->Add(
-      ConstString("std::__cxx11::basic_string<wchar_t, "
-                  "std::char_traits<wchar_t>, std::allocator<wchar_t> >"),
-      cxx11_wstring_summary_sp);
+  cpp_category_sp->AddTypeSummary("std::wstring", eFormatterMatchExact,
+                                  std_wstring_summary_sp);
+  cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t>",
+                                  eFormatterMatchExact, std_wstring_summary_sp);
+  cpp_category_sp->AddTypeSummary("std::basic_string<wchar_t,std::char_traits<"
+                                  "wchar_t>,std::allocator<wchar_t> >",
+                                  eFormatterMatchExact, std_wstring_summary_sp);
+  cpp_category_sp->AddTypeSummary(
+      "std::basic_string<wchar_t, std::char_traits<wchar_t>, "
+      "std::allocator<wchar_t> >",
+      eFormatterMatchExact, std_wstring_summary_sp);
+
+  cpp_category_sp->AddTypeSummary("std::__cxx11::wstring", eFormatterMatchExact,
+                                  cxx11_wstring_summary_sp);
+  cpp_category_sp->AddTypeSummary(
+      "std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, "
+      "std::allocator<wchar_t> >",
+      eFormatterMatchExact, cxx11_wstring_summary_sp);
 
   SyntheticChildren::Flags stl_synth_flags;
   stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
@@ -1014,94 +1011,95 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
   SyntheticChildren::Flags stl_deref_flags = stl_synth_flags;
   stl_deref_flags.SetFrontEndWantsDereference();
 
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::vector<.+>(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::vector<.+>(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_synth_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::map<.+> >(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::map<.+> >(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_synth_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::deque<.+>(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::deque<.+>(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdDequeSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::set<.+> >(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::set<.+> >(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::multimap<.+> >(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::multimap<.+> >(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::multiset<.+> >(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::multiset<.+> >(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::unordered_(multi)?(map|set)<.+> >$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::unordered_(multi)?(map|set)<.+> >$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdUnorderedMapSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::(__cxx11::)?list<.+>(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
-  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
-      RegularExpression("^std::(__cxx11::)?forward_list<.+>(( )?&)?$"),
+  cpp_category_sp->AddTypeSynthetic(
+      "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_synth_flags,
           "lldb.formatters.cpp.gnu_libstdcpp.StdForwardListSynthProvider")));
 
   stl_summary_flags.SetDontShowChildren(false);
   stl_summary_flags.SetSkipPointers(false);
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::bitset<.+>(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::vector<.+>(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::map<.+> >(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::set<.+> >(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::deque<.+>(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::multimap<.+> >(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::multiset<.+> >(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::unordered_(multi)?(map|set)<.+> >$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
-      TypeSummaryImplSP(
-          new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
-  cpp_category_sp->GetRegexTypeSummariesContainer()->Add(
-      RegularExpression("^std::(__cxx11::)?forward_list<.+>(( )?&)?$"),
-      TypeSummaryImplSP(
-          new ScriptSummaryFormat(stl_summary_flags, "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
+  cpp_category_sp->AddTypeSummary("^std::bitset<.+>(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::vector<.+>(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::map<.+> >(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::set<.+> >(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::deque<.+>(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::multimap<.+> >(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::multiset<.+> >(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::unordered_(multi)?(map|set)<.+> >$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary("^std::(__cxx11::)?list<.+>(( )?&)?$",
+                                  eFormatterMatchRegex,
+                                  TypeSummaryImplSP(new StringSummaryFormat(
+                                      stl_summary_flags, "size=${svar%#}")));
+  cpp_category_sp->AddTypeSummary(
+      "^std::(__cxx11::)?forward_list<.+>(( )?&)?$", eFormatterMatchRegex,
+      TypeSummaryImplSP(new ScriptSummaryFormat(
+          stl_summary_flags,
+          "lldb.formatters.cpp.gnu_libstdcpp.ForwardListSummaryProvider")));
 
   AddCXXSynthetic(
       cpp_category_sp,

diff  --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
index 99ce389bb53ec..11d5b0813b586 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -284,12 +284,12 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
 
   lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(
       objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider, ""));
-  objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"),
-                                                     ObjC_BOOL_summary);
-  objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"),
-                                                     ObjC_BOOL_summary);
-  objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"),
-                                                     ObjC_BOOL_summary);
+  objc_category_sp->AddTypeSummary("BOOL", eFormatterMatchExact,
+                                   ObjC_BOOL_summary);
+  objc_category_sp->AddTypeSummary("BOOL &", eFormatterMatchExact,
+                                   ObjC_BOOL_summary);
+  objc_category_sp->AddTypeSummary("BOOL *", eFormatterMatchExact,
+                                   ObjC_BOOL_summary);
 
   // we need to skip pointers here since we are special casing a SEL* when
   // retrieving its value


        


More information about the lldb-commits mailing list