mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-04 15:59:08 -04:00
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:
parent
51d8969ced
commit
6c67e1fc5a
11 changed files with 34 additions and 14 deletions
|
@ -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]+)%/'
|
||||
|
|
|
@ -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("-", "_")
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue