xref: /llvm-project/lldb/examples/synthetic/recognizer_function/example.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1868186cfSJorge Gorbe Moya# Formatters for classes that derive from Message.
2868186cfSJorge Gorbe Moya#
3868186cfSJorge Gorbe Moya# Usage:
4868186cfSJorge Gorbe Moya#   command script import ./example.py
5868186cfSJorge Gorbe Moya#   type summary add --expand --recognizer-function --python-function example.message_summary example.is_message_type
6868186cfSJorge Gorbe Moya#   type synth add --recognizer-function --python-class example.MessageChildProvider example.is_message_type
7868186cfSJorge Gorbe Moya
8868186cfSJorge Gorbe Moyaimport sys
9868186cfSJorge Gorbe Moya
10*2238dcc3SJonas Devlieghere
11868186cfSJorge Gorbe Moyadef is_message_type(t, internal_dict):
12868186cfSJorge Gorbe Moya    for base in t.get_bases_array():
13868186cfSJorge Gorbe Moya        if base.GetName() == "Message":
14868186cfSJorge Gorbe Moya            return True
15868186cfSJorge Gorbe Moya    return False
16868186cfSJorge Gorbe Moya
17*2238dcc3SJonas Devlieghere
18868186cfSJorge Gorbe Moyadef message_summary(value, internal_dict):
19868186cfSJorge Gorbe Moya    # Could have used a summary string as well. All the work is done by the child
20868186cfSJorge Gorbe Moya    # provider.
21868186cfSJorge Gorbe Moya    return "Message"
22868186cfSJorge Gorbe Moya
23*2238dcc3SJonas Devlieghere
24868186cfSJorge Gorbe Moyaclass MessageChildProvider:
25868186cfSJorge Gorbe Moya    def __init__(self, value, internal_dict):
26868186cfSJorge Gorbe Moya        self.value = value
27868186cfSJorge Gorbe Moya        self.synthetic_children = self._analyze_children(value)
28868186cfSJorge Gorbe Moya
29868186cfSJorge Gorbe Moya    def has_children(self):
30868186cfSJorge Gorbe Moya        return self.num_children() > 0
31868186cfSJorge Gorbe Moya
32868186cfSJorge Gorbe Moya    def num_children(self):
33868186cfSJorge Gorbe Moya        return len(self.synthetic_children)
34868186cfSJorge Gorbe Moya
35868186cfSJorge Gorbe Moya    def get_child_index(self, name):
36868186cfSJorge Gorbe Moya        for index, child in enumerate(self.synthetic_children):
37868186cfSJorge Gorbe Moya            if child.GetName() == name:
38868186cfSJorge Gorbe Moya                return index
39868186cfSJorge Gorbe Moya        return None
40868186cfSJorge Gorbe Moya
41868186cfSJorge Gorbe Moya    def get_child_at_index(self, index):
42868186cfSJorge Gorbe Moya        return self.synthetic_children[index]
43868186cfSJorge Gorbe Moya
44868186cfSJorge Gorbe Moya    def _rename_sbvalue(self, value):
45868186cfSJorge Gorbe Moya        # We want to display the field with its original name without a trailing
46868186cfSJorge Gorbe Moya        # underscore. So we create a new SBValue with the same type and address but
47868186cfSJorge Gorbe Moya        # a different name.
48868186cfSJorge Gorbe Moya        name = value.GetName()
49868186cfSJorge Gorbe Moya        assert name.endswith("_")
50868186cfSJorge Gorbe Moya        new_name = name[:-1]
51*2238dcc3SJonas Devlieghere        return value.CreateValueFromAddress(
52*2238dcc3SJonas Devlieghere            new_name, value.GetLoadAddress(), value.GetType()
53*2238dcc3SJonas Devlieghere        )
54868186cfSJorge Gorbe Moya
55868186cfSJorge Gorbe Moya    def _analyze_children(self, value):
56868186cfSJorge Gorbe Moya        result = []
57868186cfSJorge Gorbe Moya        for i in range(value.GetNumChildren()):
58868186cfSJorge Gorbe Moya            child = value.GetChildAtIndex(i)
59868186cfSJorge Gorbe Moya            child_name = child.GetName()
60868186cfSJorge Gorbe Moya            if child_name.startswith("_"):
61868186cfSJorge Gorbe Moya                continue  # Internal field, skip
62868186cfSJorge Gorbe Moya            # Normal field. Check presence bit.
63868186cfSJorge Gorbe Moya            presence_bit = value.GetChildMemberWithName("_has_" + child_name)
64868186cfSJorge Gorbe Moya            if presence_bit.GetValueAsUnsigned() != 0:
65868186cfSJorge Gorbe Moya                result.append(self._rename_sbvalue(child))
66868186cfSJorge Gorbe Moya        return result
67