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.
This commit is contained in:
James Westman 2022-12-19 15:07:31 -06:00
parent 51d8969ced
commit 6c67e1fc5a
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
11 changed files with 34 additions and 14 deletions

View file

@ -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]+)%/'

View file

@ -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("-", "_")

View file

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

View file

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

View file

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

View file

@ -5,7 +5,7 @@
<accessibility>
<property name="label" translatable="true">Hello, world!</property>
<relation name="labelled-by">my_label</relation>
<state name="checked">true</state>
<state name="checked">1</state>
</accessibility>
</object>
<object class="GtkLabel" id="my_label"></object>

View file

@ -2,6 +2,6 @@
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkScrolledWindow">
<property name="window-placement">top-left</property>
<property name="window-placement">0</property>
</object>
</interface>

View file

@ -2,9 +2,9 @@
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GApplication">
<property name="flags">is_service|handles_open</property>
<property name="flags">1|4</property>
</object>
<object class="GtkEventControllerScroll">
<property name="flags">vertical</property>
<property name="flags">1</property>
</object>
</interface>

View file

@ -2,6 +2,6 @@
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="orientation">1</property>
</object>
</interface>

View file

@ -2,7 +2,7 @@
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkSizeGroup">
<property name="mode">horizontal</property>
<property name="mode">1</property>
<widgets>
<widget name="label"/>
<widget name="button"/>

View file

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