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
|
- ninja -C _build docs/en
|
||||||
- git clone https://gitlab.gnome.org/jwestman/blueprint-regression-tests.git
|
- git clone https://gitlab.gnome.org/jwestman/blueprint-regression-tests.git
|
||||||
- cd blueprint-regression-tests
|
- cd blueprint-regression-tests
|
||||||
- git checkout e1a2b04ce13838794eec9678deff95802fa278d1
|
- git checkout 58fda9381dac4a9c42c18a4b06149ed59ee702dc
|
||||||
- ./test.sh
|
- ./test.sh
|
||||||
- cd ..
|
- cd ..
|
||||||
coverage: '/TOTAL.*\s([.\d]+)%/'
|
coverage: '/TOTAL.*\s([.\d]+)%/'
|
||||||
|
|
|
@ -127,7 +127,11 @@ class DecompileCtx:
|
||||||
def print_attribute(self, name, value, type):
|
def print_attribute(self, name, value, type):
|
||||||
def get_enum_name(value):
|
def get_enum_name(value):
|
||||||
for member in type.members.values():
|
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 member.name
|
||||||
return value.replace("-", "_")
|
return value.replace("-", "_")
|
||||||
|
|
||||||
|
|
|
@ -462,11 +462,11 @@ class EnumMember(GirNode):
|
||||||
super().__init__(ns, tl)
|
super().__init__(ns, tl)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def value(self):
|
def value(self) -> int:
|
||||||
return self.tl.VALUE_VALUE
|
return self.tl.VALUE_VALUE
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def name(self):
|
def name(self) -> str:
|
||||||
return self.tl.VALUE_NAME
|
return self.tl.VALUE_NAME
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
|
@ -487,7 +487,7 @@ class Enumeration(GirNode, GirType):
|
||||||
super().__init__(ns, tl)
|
super().__init__(ns, tl)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def members(self):
|
def members(self) -> T.Dict[str, EnumMember]:
|
||||||
members = {}
|
members = {}
|
||||||
n_values = self.tl.ENUM_N_VALUES
|
n_values = self.tl.ENUM_N_VALUES
|
||||||
values = self.tl.ENUM_VALUES
|
values = self.tl.ENUM_VALUES
|
||||||
|
|
|
@ -168,6 +168,20 @@ class NumberValue(Value):
|
||||||
class Flag(AstNode):
|
class Flag(AstNode):
|
||||||
grammar = UseIdent("value")
|
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()
|
@docs()
|
||||||
def docs(self):
|
def docs(self):
|
||||||
type = self.parent.parent.value_type
|
type = self.parent.parent.value_type
|
||||||
|
|
|
@ -159,14 +159,16 @@ class XmlOutput(OutputFormat):
|
||||||
if isinstance(value, IdentValue):
|
if isinstance(value, IdentValue):
|
||||||
if isinstance(value.parent.value_type, gir.Enumeration):
|
if isinstance(value.parent.value_type, gir.Enumeration):
|
||||||
xml.put_text(
|
xml.put_text(
|
||||||
value.parent.value_type.members[value.tokens["value"]].nick
|
str(value.parent.value_type.members[value.tokens["value"]].value)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
xml.put_text(value.tokens["value"])
|
xml.put_text(value.tokens["value"])
|
||||||
elif isinstance(value, QuotedValue) or isinstance(value, NumberValue):
|
elif isinstance(value, QuotedValue) or isinstance(value, NumberValue):
|
||||||
xml.put_text(value.value)
|
xml.put_text(value.value)
|
||||||
elif isinstance(value, FlagsValue):
|
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):
|
elif isinstance(value, TranslatedStringValue):
|
||||||
raise CompilerBugError("translated values must be handled in the parent")
|
raise CompilerBugError("translated values must be handled in the parent")
|
||||||
elif isinstance(value, TypeValue):
|
elif isinstance(value, TypeValue):
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<accessibility>
|
<accessibility>
|
||||||
<property name="label" translatable="true">Hello, world!</property>
|
<property name="label" translatable="true">Hello, world!</property>
|
||||||
<relation name="labelled-by">my_label</relation>
|
<relation name="labelled-by">my_label</relation>
|
||||||
<state name="checked">true</state>
|
<state name="checked">1</state>
|
||||||
</accessibility>
|
</accessibility>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkLabel" id="my_label"></object>
|
<object class="GtkLabel" id="my_label"></object>
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.0"/>
|
<requires lib="gtk" version="4.0"/>
|
||||||
<object class="GtkScrolledWindow">
|
<object class="GtkScrolledWindow">
|
||||||
<property name="window-placement">top-left</property>
|
<property name="window-placement">0</property>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.0"/>
|
<requires lib="gtk" version="4.0"/>
|
||||||
<object class="GApplication">
|
<object class="GApplication">
|
||||||
<property name="flags">is_service|handles_open</property>
|
<property name="flags">1|4</property>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkEventControllerScroll">
|
<object class="GtkEventControllerScroll">
|
||||||
<property name="flags">vertical</property>
|
<property name="flags">1</property>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.0"/>
|
<requires lib="gtk" version="4.0"/>
|
||||||
<object class="GtkBox">
|
<object class="GtkBox">
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">1</property>
|
||||||
</object>
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk" version="4.0"/>
|
<requires lib="gtk" version="4.0"/>
|
||||||
<object class="GtkSizeGroup">
|
<object class="GtkSizeGroup">
|
||||||
<property name="mode">horizontal</property>
|
<property name="mode">1</property>
|
||||||
<widgets>
|
<widgets>
|
||||||
<widget name="label"/>
|
<widget name="label"/>
|
||||||
<widget name="button"/>
|
<widget name="button"/>
|
||||||
|
|
|
@ -153,7 +153,7 @@ class TestSamples(unittest.TestCase):
|
||||||
self.assert_sample("enum")
|
self.assert_sample("enum")
|
||||||
self.assert_sample("expr_lookup", skip_run=True) # TODO: Fix
|
self.assert_sample("expr_lookup", skip_run=True) # TODO: Fix
|
||||||
self.assert_sample("file_filter")
|
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("id_prop")
|
||||||
self.assert_sample("layout")
|
self.assert_sample("layout")
|
||||||
self.assert_sample("menu")
|
self.assert_sample("menu")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue