From 6c67e1fc5afcc3f4fb10e00234526121edcb12a7 Mon Sep 17 00:00:00 2001 From: James Westman Date: Mon, 19 Dec 2022 15:07:31 -0600 Subject: [PATCH] xml: Fix flags and enums GtkBuilder XML uses enum nicknames, full names, or integer values, but we accept GIR names, so passing those through doesn't work if the name has an underscore (which traditionally turns into a dash in the nickname). Avoid the problem by always writing the integer value of the enum member. --- .gitlab-ci.yml | 2 +- blueprintcompiler/decompiler.py | 6 +++++- blueprintcompiler/gir.py | 6 +++--- blueprintcompiler/language/values.py | 14 ++++++++++++++ blueprintcompiler/outputs/xml/__init__.py | 6 ++++-- tests/samples/accessibility.ui | 2 +- tests/samples/enum.ui | 2 +- tests/samples/flags.ui | 4 ++-- tests/samples/property.ui | 2 +- tests/samples/size_group.ui | 2 +- tests/test_samples.py | 2 +- 11 files changed, 34 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 380f288..f7d8a39 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,7 +19,7 @@ build: - ninja -C _build docs/en - git clone https://gitlab.gnome.org/jwestman/blueprint-regression-tests.git - cd blueprint-regression-tests - - git checkout e1a2b04ce13838794eec9678deff95802fa278d1 + - git checkout 58fda9381dac4a9c42c18a4b06149ed59ee702dc - ./test.sh - cd .. coverage: '/TOTAL.*\s([.\d]+)%/' diff --git a/blueprintcompiler/decompiler.py b/blueprintcompiler/decompiler.py index 145e4be..565d420 100644 --- a/blueprintcompiler/decompiler.py +++ b/blueprintcompiler/decompiler.py @@ -127,7 +127,11 @@ class DecompileCtx: def print_attribute(self, name, value, type): def get_enum_name(value): for member in type.members.values(): - if member.nick == value or member.c_ident == value: + if ( + member.nick == value + or member.c_ident == value + or str(member.value) == value + ): return member.name return value.replace("-", "_") diff --git a/blueprintcompiler/gir.py b/blueprintcompiler/gir.py index a1bb419..12c9772 100644 --- a/blueprintcompiler/gir.py +++ b/blueprintcompiler/gir.py @@ -462,11 +462,11 @@ class EnumMember(GirNode): super().__init__(ns, tl) @property - def value(self): + def value(self) -> int: return self.tl.VALUE_VALUE @cached_property - def name(self): + def name(self) -> str: return self.tl.VALUE_NAME @cached_property @@ -487,7 +487,7 @@ class Enumeration(GirNode, GirType): super().__init__(ns, tl) @cached_property - def members(self): + def members(self) -> T.Dict[str, EnumMember]: members = {} n_values = self.tl.ENUM_N_VALUES values = self.tl.ENUM_VALUES diff --git a/blueprintcompiler/language/values.py b/blueprintcompiler/language/values.py index db28490..4a71247 100644 --- a/blueprintcompiler/language/values.py +++ b/blueprintcompiler/language/values.py @@ -168,6 +168,20 @@ class NumberValue(Value): class Flag(AstNode): grammar = UseIdent("value") + @property + def name(self) -> str: + return self.tokens["value"] + + @property + def value(self) -> T.Optional[int]: + type = self.parent.parent.value_type + if not isinstance(type, Enumeration): + return None + elif member := type.members.get(self.tokens["value"]): + return member.value + else: + return None + @docs() def docs(self): type = self.parent.parent.value_type diff --git a/blueprintcompiler/outputs/xml/__init__.py b/blueprintcompiler/outputs/xml/__init__.py index e7e33d9..79f24f3 100644 --- a/blueprintcompiler/outputs/xml/__init__.py +++ b/blueprintcompiler/outputs/xml/__init__.py @@ -159,14 +159,16 @@ class XmlOutput(OutputFormat): if isinstance(value, IdentValue): if isinstance(value.parent.value_type, gir.Enumeration): xml.put_text( - value.parent.value_type.members[value.tokens["value"]].nick + str(value.parent.value_type.members[value.tokens["value"]].value) ) else: xml.put_text(value.tokens["value"]) elif isinstance(value, QuotedValue) or isinstance(value, NumberValue): xml.put_text(value.value) elif isinstance(value, FlagsValue): - xml.put_text("|".join([flag.tokens["value"] for flag in value.children])) + xml.put_text( + "|".join([str(flag.value or flag.name) for flag in value.children]) + ) elif isinstance(value, TranslatedStringValue): raise CompilerBugError("translated values must be handled in the parent") elif isinstance(value, TypeValue): diff --git a/tests/samples/accessibility.ui b/tests/samples/accessibility.ui index 50e98c8..321f20f 100644 --- a/tests/samples/accessibility.ui +++ b/tests/samples/accessibility.ui @@ -5,7 +5,7 @@ Hello, world! my_label - true + 1 diff --git a/tests/samples/enum.ui b/tests/samples/enum.ui index acad161..d2cda1e 100644 --- a/tests/samples/enum.ui +++ b/tests/samples/enum.ui @@ -2,6 +2,6 @@ - top-left + 0 diff --git a/tests/samples/flags.ui b/tests/samples/flags.ui index d2bac55..56fbf31 100644 --- a/tests/samples/flags.ui +++ b/tests/samples/flags.ui @@ -2,9 +2,9 @@ - is_service|handles_open + 1|4 - vertical + 1 diff --git a/tests/samples/property.ui b/tests/samples/property.ui index a2d5a1b..ba8089d 100644 --- a/tests/samples/property.ui +++ b/tests/samples/property.ui @@ -2,6 +2,6 @@ - vertical + 1 diff --git a/tests/samples/size_group.ui b/tests/samples/size_group.ui index 6d92edd..218b023 100644 --- a/tests/samples/size_group.ui +++ b/tests/samples/size_group.ui @@ -2,7 +2,7 @@ - horizontal + 1 diff --git a/tests/test_samples.py b/tests/test_samples.py index 279ceb6..f038b60 100644 --- a/tests/test_samples.py +++ b/tests/test_samples.py @@ -153,7 +153,7 @@ class TestSamples(unittest.TestCase): self.assert_sample("enum") self.assert_sample("expr_lookup", skip_run=True) # TODO: Fix self.assert_sample("file_filter") - self.assert_sample("flags", skip_run=True) # TODO: Fix + self.assert_sample("flags") self.assert_sample("id_prop") self.assert_sample("layout") self.assert_sample("menu")