[formatters] Add a libstdcpp formatter for multimap and unify modify tests across...
authorDanil Stefaniuc <danilashtefan@gmail.com>
Sat, 30 Oct 2021 19:53:19 +0000 (12:53 -0700)
committerWalter Erquinigo <wallace@fb.com>
Sat, 30 Oct 2021 19:53:32 +0000 (12:53 -0700)
This diff adds a data formatter for libstdcpp's multimap. Besides, it improves and unifies the tests for multimap for libcxx and libstdcpp for maintainability.

Reviewed By: wallace

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

lldb/examples/synthetic/gnu_libstdcpp.py
lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/Makefile [moved from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/Makefile with 54% similarity]
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/TestDataFormatterGenericMultiMap.py [moved from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/TestDataFormatterLibccMultiMap.py with 88% similarity]
lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/multimap/main.cpp [moved from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/multimap/main.cpp with 100% similarity]

index 21c8975..dd07195 100644 (file)
@@ -315,10 +315,10 @@ class StdVectorSynthProvider:
         return True
 
     """
-    Set and Map have the same underlying data structure,
-    therefore we can use exactly the same implementation for the formatter.
+     This formatter can be applied to all
+     map-like structures (map, multimap, set, multiset)
     """
-class StdSetOrMapSynthProvider:
+class StdMapLikeSynthProvider:
 
     def __init__(self, valobj, dict):
         logger = lldb.formatters.Logger.Logger()
index 626c5a5..7b64faa 100644 (file)
@@ -902,12 +902,17 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
       RegularExpression("^std::map<.+> >(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_synth_flags,
-          "lldb.formatters.cpp.gnu_libstdcpp.StdSetOrMapSynthProvider")));
+          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
       RegularExpression("^std::set<.+> >(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
           stl_deref_flags,
-          "lldb.formatters.cpp.gnu_libstdcpp.StdSetOrMapSynthProvider")));
+          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
+  cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
+      RegularExpression("^std::multimap<.+> >(( )?&)?$"),
+      SyntheticChildrenSP(new ScriptedSyntheticChildren(
+          stl_deref_flags,
+          "lldb.formatters.cpp.gnu_libstdcpp.StdMapLikeSynthProvider")));
   cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(
       RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$"),
       SyntheticChildrenSP(new ScriptedSyntheticChildren(
@@ -932,6 +937,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
       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::(__cxx11::)?list<.+>(( )?&)?$"),
       TypeSummaryImplSP(
           new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
@@ -10,19 +10,38 @@ from lldbsuite.test.decorators import *
 from lldbsuite.test.lldbtest import *
 from lldbsuite.test import lldbutil
 
+USE_LIBSTDCPP = "USE_LIBSTDCPP"
+USE_LIBCPP = "USE_LIBCPP"
 
-class LibcxxMultiMapDataFormatterTestCase(TestBase):
+class GenericMultiMapDataFormatterTestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
     def setUp(self):
         TestBase.setUp(self)
         self.namespace = 'std'
-
-    @add_test_categories(["libc++"])
-    def test_with_run_command(self):
+    
+    def findVariable(self, name):
+        var = self.frame().FindVariable(name)
+        self.assertTrue(var.IsValid())
+        return var
+
+    def getVariableType(self, name):
+        var = self.findVariable(name)
+        return var.GetType().GetDisplayTypeName()
+
+    def check(self, var_name, size):
+        var = self.findVariable(var_name)
+        self.assertEqual(var.GetNumChildren(), size)
+        children = []
+        for i in range(size):
+            child = var.GetChildAtIndex(i)
+            children.append(ValueCheck(value=child.GetValue()))
+        self.expect_var_path(var_name, type=self.getVariableType(var_name), children=children)
+
+    def do_test_with_run_command(self, stdlib_type):
         """Test that that file and class static variables display correctly."""
-        self.build()
+        self.build(dictionary={stdlib_type: "1"})
         self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
 
         bkpt = self.target().FindBreakpointByID(
@@ -65,6 +84,8 @@ class LibcxxMultiMapDataFormatterTestCase(TestBase):
                 '[0] = (first = 0, second = 0)',
                 '[1] = (first = 1, second = 1)',
             ])
+        
+        self.check("ii", 2)
 
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
@@ -76,6 +97,8 @@ class LibcxxMultiMapDataFormatterTestCase(TestBase):
                              '[3] = ',
                              'first = 3',
                              'second = 1'])
+        
+        self.check("ii", 4)
 
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
@@ -88,6 +111,8 @@ class LibcxxMultiMapDataFormatterTestCase(TestBase):
                              'first = 7',
                              'second = 1'])
 
+        self.check("ii", 8)
+
         self.expect("p ii",
                     substrs=[multimap, 'size=8',
                              '[5] = ',
@@ -235,12 +260,16 @@ class LibcxxMultiMapDataFormatterTestCase(TestBase):
                     substrs=[multimap, 'size=0',
                              '{}'])
 
+        self.check("is", 0)
+
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
         self.expect('frame variable ss',
                     substrs=[multimap, 'size=0',
                              '{}'])
 
+        self.check("ss", 0)
+
         lldbutil.continue_to_breakpoint(self.process(), bkpt)
 
         self.expect(
@@ -253,6 +282,8 @@ class LibcxxMultiMapDataFormatterTestCase(TestBase):
                 '[2] = (first = "gatto", second = "cat")',
             ])
 
+        self.check("ss", 3)
+
         self.expect(
             "p ss",
             substrs=[
@@ -285,3 +316,14 @@ class LibcxxMultiMapDataFormatterTestCase(TestBase):
         self.expect('frame variable ss',
                     substrs=[multimap, 'size=0',
                              '{}'])
+
+        self.check("ss", 0)
+
+    @add_test_categories(["libstdcxx"])
+    def test_with_run_command_libstdcpp(self):
+        self.do_test_with_run_command(USE_LIBSTDCPP)
+
+    @add_test_categories(["libc++"])
+    def test_with_run_command_libcpp(self):
+        self.do_test_with_run_command(USE_LIBCPP)
+