From 4d3dc9244883985b29da005560b5406f1d8df68b Mon Sep 17 00:00:00 2001 From: James Westman Date: Fri, 23 Aug 2024 18:16:02 -0500 Subject: [PATCH] decompiler: Support list accessibility properties --- blueprintcompiler/decompiler.py | 23 ++++++----- blueprintcompiler/language/gtk_a11y.py | 40 +++++++++++++------ tests/samples/accessibility_dec.blp | 6 ++- .../accessibility_multiple_labelled_by.blp | 8 +++- tests/test_samples.py | 2 - 5 files changed, 54 insertions(+), 25 deletions(-) diff --git a/blueprintcompiler/decompiler.py b/blueprintcompiler/decompiler.py index 3048d32..f5c45fb 100644 --- a/blueprintcompiler/decompiler.py +++ b/blueprintcompiler/decompiler.py @@ -192,18 +192,21 @@ def decompile_element( decompiler = decompilers[0] - args: T.Dict[str, T.Optional[str]] = { - canon(name): value for name, value in xml.attrs.items() - } - if decompiler._cdata: - if len(xml.children): - args["cdata"] = None - else: - args["cdata"] = xml.cdata + if decompiler._element: + args = [ctx, gir, xml] + kwargs: T.Dict[str, T.Optional[str]] = {} + else: + args = [ctx, gir] + kwargs = {canon(name): value for name, value in xml.attrs.items()} + if decompiler._cdata: + if len(xml.children): + kwargs["cdata"] = None + else: + kwargs["cdata"] = xml.cdata ctx._node_stack.append(xml) ctx.start_block() - gir = decompiler(ctx, gir, **args) + gir = decompiler(*args, **kwargs) if not decompiler._skip_children: for child in xml.children: @@ -264,10 +267,12 @@ def decompiler( parent_type: T.Optional[str] = None, parent_tag: T.Optional[str] = None, skip_children=False, + element=False, ): def decorator(func): func._cdata = cdata func._skip_children = skip_children + func._element = element def filter(ctx): if parent_type is not None: diff --git a/blueprintcompiler/language/gtk_a11y.py b/blueprintcompiler/language/gtk_a11y.py index c4438cb..ec49002 100644 --- a/blueprintcompiler/language/gtk_a11y.py +++ b/blueprintcompiler/language/gtk_a11y.py @@ -249,19 +249,35 @@ def a11y_name_completer(lsp, ast_node, match_variables): ) -@decompiler("relation", cdata=True) -def decompile_relation(ctx, gir, name, cdata): - ctx.print_attribute(name, cdata, get_types(ctx.gir).get(name)) - - -@decompiler("state", cdata=True) -def decompile_state(ctx, gir, name, cdata, translatable="false"): - if decompile.truthy(translatable): - ctx.print(f"{name}: _({escape_quote(cdata)});") +def decompile_attr(ctx: DecompileCtx, attr): + if attr["translatable"] is not None and decompile.truthy(attr["translatable"]): + ctx.print(f"_({escape_quote(attr.cdata)})") else: - ctx.print_attribute(name, cdata, get_types(ctx.gir).get(name)) + ctx.print_value(attr.cdata, get_types(ctx.gir).get(attr["name"])) -@decompiler("accessibility") -def decompile_accessibility(ctx, gir): +@decompiler("accessibility", skip_children=True, element=True) +def decompile_accessibility(ctx: DecompileCtx, _gir, element): ctx.print("accessibility {") + already_printed = set() + for child in element.children: + name = child["name"] + + if name in allow_duplicates: + if name in already_printed: + continue + + ctx.print(f"{name}: [") + for value in element.children: + if value["name"] == name: + decompile_attr(ctx, value) + ctx.print(", ") + ctx.print("];") + else: + ctx.print(f"{name}:") + decompile_attr(ctx, child) + ctx.print(";") + + already_printed.add(name) + ctx.print("}") + ctx.end_block_with("") diff --git a/tests/samples/accessibility_dec.blp b/tests/samples/accessibility_dec.blp index 9a2643c..30f7ec2 100644 --- a/tests/samples/accessibility_dec.blp +++ b/tests/samples/accessibility_dec.blp @@ -3,7 +3,11 @@ using Gtk 4.0; Box { accessibility { label: _("Hello, world!"); - labelled-by: my_label; + + labelled-by: [ + my_label, + ]; + checked: true; } } diff --git a/tests/samples/accessibility_multiple_labelled_by.blp b/tests/samples/accessibility_multiple_labelled_by.blp index 78e8b74..188592e 100644 --- a/tests/samples/accessibility_multiple_labelled_by.blp +++ b/tests/samples/accessibility_multiple_labelled_by.blp @@ -3,7 +3,13 @@ using Gtk 4.0; Box { accessibility { label: _("Hello, world!"); - labelled-by: [my_label1, my_label2, my_label3]; + + labelled-by: [ + my_label1, + my_label2, + my_label3, + ]; + checked: true; } } diff --git a/tests/test_samples.py b/tests/test_samples.py index b8a3812..41d572f 100644 --- a/tests/test_samples.py +++ b/tests/test_samples.py @@ -221,8 +221,6 @@ class TestSamples(unittest.TestCase): "list_factory", # Not implemented yet "subscope", - # Not implemented yet - "accessibility_multiple_labelled_by", ] if sample in REQUIRE_ADW_1_4 and not self.have_adw_1_4: