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 @@
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 @@
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 @@
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 @@