[formatters] Add a libstdcpp formatter for multimap and unify modify tests across stdlibs

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
This commit is contained in:
Danil Stefaniuc 2021-10-30 12:53:19 -07:00 committed by Walter Erquinigo
parent 025f549240
commit f869e0be44
5 changed files with 60 additions and 12 deletions

View 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()

View 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(
@ -931,6 +936,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
RegularExpression("^std::set<.+> >(( )?&)?$"),
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(

View File

@ -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'
def findVariable(self, name):
var = self.frame().FindVariable(name)
self.assertTrue(var.IsValid())
return var
@add_test_categories(["libc++"])
def test_with_run_command(self):
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)