101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
from lldb import SBType, SBValue
|
|
|
|
# struct TSTree {
|
|
# Subtree root;
|
|
# const TSLanguage *language;
|
|
# TSRange *included_ranges;
|
|
# unsigned included_range_count;
|
|
# };
|
|
|
|
# TODO: Ideally, we'd display the elements of `included_ranges` as
|
|
# children of `included_ranges` rather than separate items, i.e.:
|
|
|
|
# (TSTree) {
|
|
# root = ...
|
|
# language = ...
|
|
# included_range_count = ...
|
|
# included_ranges = {
|
|
# [0] = {
|
|
# ...
|
|
# }
|
|
# [1] = {
|
|
# ...
|
|
# }
|
|
# ...
|
|
# }
|
|
# }
|
|
#
|
|
# instead of the current behavior:
|
|
#
|
|
# (TSTree) {
|
|
# root = ...
|
|
# language = ...
|
|
# included_range_count = ...
|
|
# included_ranges[0] = {
|
|
# ...
|
|
# }
|
|
# included_ranges[1] = {
|
|
# ...
|
|
# }
|
|
# }
|
|
#
|
|
|
|
|
|
class TSTreeSyntheticProvider:
|
|
def __init__(self, valobj: SBValue, _dict):
|
|
self.valobj: SBValue = valobj
|
|
self.update()
|
|
|
|
def num_children(self) -> int:
|
|
# root, language, included_range_count, included_ranges
|
|
return 3 + self.included_range_count.GetValueAsUnsigned()
|
|
|
|
def get_child_index(self, name: str) -> int:
|
|
if name == "root":
|
|
return 0
|
|
elif name == "language":
|
|
return 1
|
|
elif name == "included_range_count":
|
|
return 2
|
|
else:
|
|
if self.included_range_count.GetValueAsUnsigned() == 0:
|
|
return 3
|
|
index = name.lstrip("included_ranges[").rstrip("]")
|
|
if index.isdigit():
|
|
return int(index)
|
|
else:
|
|
return -1
|
|
|
|
def get_child_at_index(self, index: int) -> SBValue:
|
|
if index == 0:
|
|
return self.root
|
|
elif index == 1:
|
|
return self.language
|
|
elif index == 2:
|
|
return self.included_range_count
|
|
else:
|
|
if self.included_range_count.GetValueAsUnsigned() == 0:
|
|
return self.included_ranges
|
|
offset: int = index - 3
|
|
start: int = self.included_ranges.GetValueAsUnsigned()
|
|
address: int = start + offset * self.element_type_size
|
|
element: SBValue = self.included_ranges.CreateValueFromAddress(
|
|
"included_ranges[%s]" % (offset), address, self.element_type
|
|
)
|
|
return element
|
|
|
|
def update(self):
|
|
self.root: SBValue = self.valobj.GetChildMemberWithName("root")
|
|
self.language: SBValue = self.valobj.GetChildMemberWithName("language")
|
|
self.included_range_count: SBValue = self.valobj.GetChildMemberWithName(
|
|
"included_range_count"
|
|
)
|
|
self.included_ranges: SBValue = self.valobj.GetChildMemberWithName(
|
|
"included_ranges"
|
|
)
|
|
|
|
self.element_type: SBType = self.included_ranges.GetType().GetPointeeType()
|
|
self.element_type_size: int = self.element_type.GetByteSize()
|
|
|
|
def has_children(self) -> bool:
|
|
return True
|