From fd55a5abf246b5a3c6126f24f72bc28833dfb361 Mon Sep 17 00:00:00 2001 From: James Westman Date: Fri, 10 Jun 2022 13:20:44 -0500 Subject: [PATCH] Fix flag values Enums/bitfields have a C identifier, a GLib nick, and a GIR name. The last two are usually the same except the nick uses '-' and the GIR name uses '_'. It is confusing. Blueprint tries to use GIR names for everything, but GTK requires a C identifier or GLib nick for enum and bitfield values. Blueprint was sometimes passing the GIR name through instead of finding one of the other names. Fixed by always emitting the C identifier for enums and bitfields where the GIR type is known. --- blueprintcompiler/decompiler.py | 18 ++++++++++-------- blueprintcompiler/language/values.py | 13 ++++++++++--- tests/samples/accessibility.ui | 2 +- tests/samples/enum.ui | 2 +- tests/samples/flags.blp | 2 +- tests/samples/flags.ui | 4 ++-- tests/samples/property.ui | 2 +- tests/samples/size_group.ui | 2 +- 8 files changed, 27 insertions(+), 18 deletions(-) diff --git a/blueprintcompiler/decompiler.py b/blueprintcompiler/decompiler.py index a8b1c70..d8f505b 100644 --- a/blueprintcompiler/decompiler.py +++ b/blueprintcompiler/decompiler.py @@ -122,6 +122,13 @@ class DecompileCtx: self._blocks_need_end[-1] = _CLOSING[line[-1]] self._indent += 1 + def get_enum_value(self, value, type): + for member in type.members.values(): + if member.nick == value or member.c_ident == value: + return member.name + + return value.replace('-', '_') + def print_attribute(self, name, value, type): if type is None: @@ -142,15 +149,10 @@ class DecompileCtx: elif type.assignable_to(self.gir.namespaces["Gtk"].lookup_type("GObject.Object")): self.print(f"{name}: {value};") elif isinstance(type, Enumeration): - for member in type.members.values(): - if member.nick == value or member.c_ident == value: - self.print(f"{name}: {member.name};") - break - else: - self.print(f"{name}: {value.replace('-', '_')};") + self.print(f"{name}: {self.get_enum_value(value, type)};") elif isinstance(type, Bitfield): - flags = re.sub(r"\s*\|\s*", " | ", value).replace("-", "_") - self.print(f"{name}: {flags};") + flags = [self.get_enum_value(flag, type) for flag in value.split("|")] + self.print(f"{name}: {' | '.join(flags)};") else: self.print(f"{name}: \"{escape_quote(value)}\";") diff --git a/blueprintcompiler/language/values.py b/blueprintcompiler/language/values.py index 29e5d98..5b49166 100644 --- a/blueprintcompiler/language/values.py +++ b/blueprintcompiler/language/values.py @@ -109,6 +109,13 @@ class LiteralValue(Value): class Flag(AstNode): grammar = UseIdent("value") + @property + def c_ident(self): + if isinstance(self.parent.parent.value_type, gir.Bitfield): + return self.parent.parent.value_type.members[self.tokens["value"]].c_ident + else: + return self.tokens["value"] + @docs() def docs(self): type = self.parent.parent.value_type @@ -137,15 +144,15 @@ class FlagsValue(Value): raise CompileError(f"{type.full_name} is not a bitfield type") def emit_xml(self, xml: XmlEmitter): - xml.put_text("|".join([flag.tokens["value"] for flag in self.children[Flag]])) + xml.put_text("|".join([flag.c_ident for flag in self.children[Flag]])) class IdentValue(Value): grammar = UseIdent("value") def emit_xml(self, xml: XmlEmitter): - if isinstance(self.parent.value_type, gir.Enumeration): - xml.put_text(self.parent.value_type.members[self.tokens["value"]].nick) + if isinstance(self.parent.value_type, gir.Enumeration) or isinstance(self.parent.value_type, gir.Bitfield): + xml.put_text(self.parent.value_type.members[self.tokens["value"]].c_ident) else: xml.put_text(self.tokens["value"]) diff --git a/tests/samples/accessibility.ui b/tests/samples/accessibility.ui index 50e98c8..6f53b0b 100644 --- a/tests/samples/accessibility.ui +++ b/tests/samples/accessibility.ui @@ -5,7 +5,7 @@ Hello, world! my_label - true + GTK_ACCESSIBLE_TRISTATE_TRUE diff --git a/tests/samples/enum.ui b/tests/samples/enum.ui index acad161..b3d2a17 100644 --- a/tests/samples/enum.ui +++ b/tests/samples/enum.ui @@ -2,6 +2,6 @@ - top-left + GTK_CORNER_TOP_LEFT diff --git a/tests/samples/flags.blp b/tests/samples/flags.blp index aafda40..453c123 100644 --- a/tests/samples/flags.blp +++ b/tests/samples/flags.blp @@ -6,5 +6,5 @@ Gio.Application { } EventControllerScroll { - flags: vertical; + flags: both_axes; } diff --git a/tests/samples/flags.ui b/tests/samples/flags.ui index d2bac55..244c68a 100644 --- a/tests/samples/flags.ui +++ b/tests/samples/flags.ui @@ -2,9 +2,9 @@ - is_service|handles_open + G_APPLICATION_IS_SERVICE|G_APPLICATION_HANDLES_OPEN - vertical + GTK_EVENT_CONTROLLER_SCROLL_BOTH_AXES diff --git a/tests/samples/property.ui b/tests/samples/property.ui index a2d5a1b..57cd9fc 100644 --- a/tests/samples/property.ui +++ b/tests/samples/property.ui @@ -2,6 +2,6 @@ - vertical + GTK_ORIENTATION_VERTICAL diff --git a/tests/samples/size_group.ui b/tests/samples/size_group.ui index 6d92edd..b518fd6 100644 --- a/tests/samples/size_group.ui +++ b/tests/samples/size_group.ui @@ -2,7 +2,7 @@ - horizontal + GTK_SIZE_GROUP_HORIZONTAL