decompiler: Support action widgets

This commit is contained in:
James Westman 2024-08-24 13:24:27 -05:00
parent 21d5ce86e9
commit 65d4612b51
3 changed files with 39 additions and 7 deletions

View file

@ -22,7 +22,7 @@ from functools import cached_property
from .common import *
from .gobject_object import Object
from .response_id import ExtResponse
from .response_id import ExtResponse, decompile_response_type
ALLOWED_PARENTS: T.List[T.Tuple[str, str]] = [
("Gtk", "Buildable"),
@ -127,10 +127,15 @@ class Child(AstNode):
)
@decompiler("child")
def decompile_child(ctx, gir, type=None, internal_child=None):
if type is not None:
@decompiler("child", element=True)
def decompile_child(ctx, gir, element):
if type := element["type"]:
if type == "action":
if decompiled := decompile_response_type(ctx.parent_node, element):
ctx.print(decompiled)
return
ctx.print(f"[{type}]")
elif internal_child is not None:
elif internal_child := element["internal-child"]:
ctx.print(f"[internal-child {internal_child}]")
return gir

View file

@ -123,3 +123,32 @@ class ExtResponse(AstNode):
object = self.parent_by_type(Child).object
return object.id
def decompile_response_type(parent_element, child_element):
obj_id = None
for obj in child_element.children:
if obj.tag == "object":
obj_id = obj["id"]
break
if obj_id is None:
return None
for child in parent_element.children:
if child.tag == "action-widgets":
for action_widget in child.children:
if action_widget.cdata == obj_id:
response_id = action_widget["response"]
is_default = (
" default" if decompile.truthy(action_widget["default"]) else ""
)
return f"[action response={response_id}{is_default}]"
return None
@decompiler("action-widgets", skip_children=True)
def decompile_action_widgets(ctx, gir):
# This is handled in the <child> decompiler and decompile_response_type above
pass

View file

@ -210,8 +210,6 @@ class TestSamples(unittest.TestCase):
SKIP_COMPILE = ["translator_comments"]
SKIP_DECOMPILE = [
# Not implemented yet
"action_widgets",
# Comments are not preserved in either direction
"comments",
]