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")