tree-sitter/lib/lldb_pretty_printers/ts_tree.py

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