forked from OSchip/llvm-project
[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:
parent
025f549240
commit
f869e0be44
|
@ -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()
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
CXX_SOURCES := main.cpp
|
||||
|
||||
USE_LIBCPP := 1
|
||||
|
||||
CXXFLAGS_EXTRAS := -O0
|
||||
include Makefile.rules
|
|
@ -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)
|
||||
|
Loading…
Reference in New Issue