1*99451b44SJordan Rupprechtimport lldb
2*99451b44SJordan Rupprecht
3*99451b44SJordan Rupprecht
4*99451b44SJordan Rupprechtclass jasSynthProvider:
5*99451b44SJordan Rupprecht
6*99451b44SJordan Rupprecht    def __init__(self, valobj, dict):
7*99451b44SJordan Rupprecht        self.valobj = valobj
8*99451b44SJordan Rupprecht
9*99451b44SJordan Rupprecht    def num_children(self):
10*99451b44SJordan Rupprecht        return 2
11*99451b44SJordan Rupprecht
12*99451b44SJordan Rupprecht    def get_child_at_index(self, index):
13*99451b44SJordan Rupprecht        child = None
14*99451b44SJordan Rupprecht        if index == 0:
15*99451b44SJordan Rupprecht            child = self.valobj.GetChildMemberWithName('A')
16*99451b44SJordan Rupprecht        if index == 1:
17*99451b44SJordan Rupprecht            child = self.valobj.CreateValueFromExpression('X', '(int)1')
18*99451b44SJordan Rupprecht        return child
19*99451b44SJordan Rupprecht
20*99451b44SJordan Rupprecht    def get_child_index(self, name):
21*99451b44SJordan Rupprecht        if name == 'A':
22*99451b44SJordan Rupprecht            return 0
23*99451b44SJordan Rupprecht        if name == 'X':
24*99451b44SJordan Rupprecht            return 1
25*99451b44SJordan Rupprecht        return None
26*99451b44SJordan Rupprecht
27*99451b44SJordan Rupprecht
28*99451b44SJordan Rupprechtdef ccc_summary(sbvalue, internal_dict):
29*99451b44SJordan Rupprecht    sbvalue = sbvalue.GetNonSyntheticValue()
30*99451b44SJordan Rupprecht    # This tests that the SBValue.GetNonSyntheticValue() actually returns a
31*99451b44SJordan Rupprecht    # non-synthetic value. If it does not, then sbvalue.GetChildMemberWithName("a")
32*99451b44SJordan Rupprecht    # in the following statement will call the 'get_child_index' method of the
33*99451b44SJordan Rupprecht    # synthetic child provider CCCSynthProvider below (which raises an
34*99451b44SJordan Rupprecht    # exception).
35*99451b44SJordan Rupprecht    return "CCC object with leading value " + \
36*99451b44SJordan Rupprecht        str(sbvalue.GetChildMemberWithName("a"))
37*99451b44SJordan Rupprecht
38*99451b44SJordan Rupprecht
39*99451b44SJordan Rupprechtclass CCCSynthProvider(object):
40*99451b44SJordan Rupprecht
41*99451b44SJordan Rupprecht    def __init__(self, sbvalue, internal_dict):
42*99451b44SJordan Rupprecht        self._sbvalue = sbvalue
43*99451b44SJordan Rupprecht
44*99451b44SJordan Rupprecht    def num_children(self):
45*99451b44SJordan Rupprecht        return 3
46*99451b44SJordan Rupprecht
47*99451b44SJordan Rupprecht    def get_child_index(self, name):
48*99451b44SJordan Rupprecht        raise RuntimeError("I don't want to be called!")
49*99451b44SJordan Rupprecht
50*99451b44SJordan Rupprecht    def get_child_at_index(self, index):
51*99451b44SJordan Rupprecht        if index == 0:
52*99451b44SJordan Rupprecht            return self._sbvalue.GetChildMemberWithName("a")
53*99451b44SJordan Rupprecht        if index == 1:
54*99451b44SJordan Rupprecht            return self._sbvalue.GetChildMemberWithName("b")
55*99451b44SJordan Rupprecht        if index == 2:
56*99451b44SJordan Rupprecht            return self._sbvalue.GetChildMemberWithName("c")
57*99451b44SJordan Rupprecht
58*99451b44SJordan Rupprecht
59*99451b44SJordan Rupprechtdef empty1_summary(sbvalue, internal_dict):
60*99451b44SJordan Rupprecht    return "I am an empty Empty1"
61*99451b44SJordan Rupprecht
62*99451b44SJordan Rupprecht
63*99451b44SJordan Rupprechtclass Empty1SynthProvider(object):
64*99451b44SJordan Rupprecht
65*99451b44SJordan Rupprecht    def __init__(self, sbvalue, internal_dict):
66*99451b44SJordan Rupprecht        self._sbvalue = sbvalue
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht    def num_children(self):
69*99451b44SJordan Rupprecht        return 0
70*99451b44SJordan Rupprecht
71*99451b44SJordan Rupprecht    def get_child_at_index(self, index):
72*99451b44SJordan Rupprecht        return None
73*99451b44SJordan Rupprecht
74*99451b44SJordan Rupprecht
75*99451b44SJordan Rupprechtdef empty2_summary(sbvalue, internal_dict):
76*99451b44SJordan Rupprecht    return "I am an empty Empty2"
77*99451b44SJordan Rupprecht
78*99451b44SJordan Rupprecht
79*99451b44SJordan Rupprechtclass Empty2SynthProvider(object):
80*99451b44SJordan Rupprecht
81*99451b44SJordan Rupprecht    def __init__(self, sbvalue, internal_dict):
82*99451b44SJordan Rupprecht        self._sbvalue = sbvalue
83*99451b44SJordan Rupprecht
84*99451b44SJordan Rupprecht    def num_children(self):
85*99451b44SJordan Rupprecht        return 0
86*99451b44SJordan Rupprecht
87*99451b44SJordan Rupprecht    def get_child_at_index(self, index):
88*99451b44SJordan Rupprecht        return None
89*99451b44SJordan Rupprecht
90*99451b44SJordan Rupprecht
91*99451b44SJordan Rupprechtdef __lldb_init_module(debugger, dict):
92*99451b44SJordan Rupprecht    debugger.CreateCategory("JASSynth").AddTypeSynthetic(
93*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("JustAStruct"),
94*99451b44SJordan Rupprecht        lldb.SBTypeSynthetic.CreateWithClassName("synth.jasSynthProvider"))
95*99451b44SJordan Rupprecht    cat = debugger.CreateCategory("CCCSynth")
96*99451b44SJordan Rupprecht    cat.AddTypeSynthetic(
97*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("CCC"),
98*99451b44SJordan Rupprecht        lldb.SBTypeSynthetic.CreateWithClassName("synth.CCCSynthProvider",
99*99451b44SJordan Rupprecht                                                 lldb.eTypeOptionCascade))
100*99451b44SJordan Rupprecht    cat.AddTypeSummary(
101*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("CCC"),
102*99451b44SJordan Rupprecht        lldb.SBTypeSummary.CreateWithFunctionName("synth.ccc_summary",
103*99451b44SJordan Rupprecht                                                  lldb.eTypeOptionCascade))
104*99451b44SJordan Rupprecht    cat.AddTypeSynthetic(
105*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("Empty1"),
106*99451b44SJordan Rupprecht        lldb.SBTypeSynthetic.CreateWithClassName("synth.Empty1SynthProvider"))
107*99451b44SJordan Rupprecht    cat.AddTypeSummary(
108*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("Empty1"),
109*99451b44SJordan Rupprecht        lldb.SBTypeSummary.CreateWithFunctionName("synth.empty1_summary"))
110*99451b44SJordan Rupprecht    cat.AddTypeSynthetic(
111*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("Empty2"),
112*99451b44SJordan Rupprecht        lldb.SBTypeSynthetic.CreateWithClassName("synth.Empty2SynthProvider"))
113*99451b44SJordan Rupprecht    cat.AddTypeSummary(
114*99451b44SJordan Rupprecht        lldb.SBTypeNameSpecifier("Empty2"),
115*99451b44SJordan Rupprecht        lldb.SBTypeSummary.CreateWithFunctionName(
116*99451b44SJordan Rupprecht            "synth.empty2_summary",
117*99451b44SJordan Rupprecht            lldb.eTypeOptionHideEmptyAggregates))
118