blob: 8705c02ad566f68bf8ae93490927ce17811395b3 [file] [edit]
from abc import ABCMeta, abstractmethod
from typing import Optional
import lldb
class ScriptedSyntheticChildren(metaclass=ABCMeta):
"""
The base class for a scripted synthetic children provider.
A synthetic children provider allows you to customize how a value is
expanded into children when displayed (e.g. `frame variable`, `bt`).
Register it with `type synthetic add -l <ClassName> ...`.
Most of the base class methods are `@abstractmethod` that need to be
overwritten by the inheriting class.
"""
valobj: lldb.SBValue
def __init__(self, valobj: lldb.SBValue):
"""Construct a scripted synthetic children provider.
Args:
valobj (lldb.SBValue): The value this provider generates children
for.
"""
self.valobj = valobj
@abstractmethod
def num_children(self) -> int:
"""The number of children this value has.
This can optionally take a second `max_count` parameter (i.e.
`def num_children(self, max_count)`) if computing the exact count is
expensive; in that case return `max_count` once at least that many
children are known to exist.
Returns:
int: The number of children.
"""
pass
@abstractmethod
def get_child_at_index(self, index: int) -> Optional[lldb.SBValue]:
"""Get the child at the given index.
Args:
index (int): The index of the child to return.
Returns:
lldb.SBValue: The value for the child at this index, or `None` if
there is no child at this index.
"""
pass
def get_child_index(self, name: str) -> Optional[int]:
"""Get the index of the child with the given name.
Args:
name (str): The name of the child to look up.
Returns:
int: The index of the child with this name, or `None`/a negative
value if no such child exists. Defaults to a linear search over
`get_child_at_index`/`num_children`.
"""
pass
def update(self) -> bool:
"""Called when the value backing this provider may have changed
(e.g. after a `continue`), giving the provider a chance to refresh
any cached state.
Returns:
bool: `True` if the previously computed children can be reused,
`False` if they should be recomputed. Defaults to `False`.
"""
return False
def has_children(self) -> bool:
"""Whether this value might have children, without necessarily
computing them. Used as a cheap check to decide whether to show an
expansion arrow in graphical frontends, for example.
Returns:
bool: `True` if this value might have children, `False`
otherwise. Defaults to `True`.
"""
return True
def get_value(self) -> Optional[lldb.SBValue]:
"""Make this a value-providing synthetic children provider: the
value returned here becomes the value for this `SBValue`, in place
of the value backing it. None of the other methods on this class
(`num_children`, `get_child_at_index`, `get_child_index`) are
consulted, and the children of the original value are not shown.
Returns:
lldb.SBValue: The value to use instead of this value's own,
or `None` to leave this value unaffected. Defaults to `None`.
"""
return None
def get_type_name(self) -> Optional[str]:
"""Override the type name shown for this synthetic value.
Returns:
str: The type name to display, or `None`/empty to keep the
default. Defaults to `None`.
"""
pass