From 1053187779726413926676bad585780e4ac13ec0 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Tue, 30 Aug 2022 23:45:50 +0100 Subject: Add an optional attribute for the property default value The default-value attribute for a property element is fundamentally meant for documentation generators. We only care about the GIR data, as the conversion from the default value to a string is lossy by definition, and may very well not roundtrip. --- docs/gir-1.2.rnc | 2 + giscanner/ast.py | 1 + giscanner/gdumpparser.py | 7 ++- giscanner/girparser.py | 1 + giscanner/girwriter.py | 2 + tests/scanner/Regress-1.0-expected.gir | 87 +++++++++++++++++++++++++--------- 6 files changed, 75 insertions(+), 25 deletions(-) diff --git a/docs/gir-1.2.rnc b/docs/gir-1.2.rnc index 7c398be0..5182f7cb 100644 --- a/docs/gir-1.2.rnc +++ b/docs/gir-1.2.rnc @@ -350,6 +350,8 @@ grammar { attribute setter { xsd:string }?, ## The getter function for this property attribute getter { xsd:string }?, + ## The default value of the property, as a string; if missing, the default value is zero for integer types, and null for pointer types + attribute default-value { xsd:string }?, # Define the transfer of ownership of the property element TransferOwnership?, diff --git a/giscanner/ast.py b/giscanner/ast.py index 2cfd81fc..dac326cb 100644 --- a/giscanner/ast.py +++ b/giscanner/ast.py @@ -1304,6 +1304,7 @@ class Property(Node): self.transfer = transfer self.setter = None self.getter = None + self.default_value = None self.parent = None # A Class or Interface diff --git a/giscanner/gdumpparser.py b/giscanner/gdumpparser.py index 1a0794d4..21fbadf4 100644 --- a/giscanner/gdumpparser.py +++ b/giscanner/gdumpparser.py @@ -414,10 +414,13 @@ different --identifier-prefix.""" % (xmlnode.attrib['name'], self._namespace.ide writable = (flags & G_PARAM_WRITABLE) != 0 construct = (flags & G_PARAM_CONSTRUCT) != 0 construct_only = (flags & G_PARAM_CONSTRUCT_ONLY) != 0 - node.properties.append(ast.Property( + default_value = pspec.attrib['default-value'] + prop = ast.Property( pspec.attrib['name'], ast.Type.create_from_gtype_name(ctype), - readable, writable, construct, construct_only)) + readable, writable, construct, construct_only) + prop.default_value = default_value + node.properties.append(prop) node.properties = node.properties def _introspect_signals(self, node, xmlnode): diff --git a/giscanner/girparser.py b/giscanner/girparser.py index edaaa992..5fc22899 100644 --- a/giscanner/girparser.py +++ b/giscanner/girparser.py @@ -609,6 +609,7 @@ class GIRParser(object): node.attrib.get('transfer-ownership')) prop.setter = node.attrib.get('setter') prop.getter = node.attrib.get('getter') + prop.default_value = node.attrib.get('default-value') prop.parent = parent self._parse_generic_attribs(node, prop) return prop diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py index 9ff10d31..a3b3bc3e 100644 --- a/giscanner/girwriter.py +++ b/giscanner/girwriter.py @@ -560,6 +560,8 @@ class GIRWriter(XMLWriter): attrs.append(('setter', prop.setter)) if prop.getter: attrs.append(('getter', prop.getter)) + if prop.default_value: + attrs.append(('default-value', prop.default_value)) with self.tagcontext('property', attrs): self._write_generic(prop) self._write_type(prop.type) diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir index 079405d2..42db6105 100644 --- a/tests/scanner/Regress-1.0-expected.gir +++ b/tests/scanner/Regress-1.0-expected.gir @@ -1088,7 +1088,8 @@ regress_annotation_object_watch_full(). + transfer-ownership="none" + default-value="NULL"> deprecated-version="1.2" writable="1" construct="1" - transfer-ownership="none"> + transfer-ownership="none" + default-value="NULL"> This is a property which is a string @@ -1108,7 +1110,8 @@ regress_annotation_object_watch_full(). version="1.2" writable="1" construct="1" - transfer-ownership="none"> + transfer-ownership="none" + default-value="NULL"> This is a property annotation intentionally indented with a mix @@ -2144,13 +2147,15 @@ uses a C sugar return type. introspectable="0" writable="1" construct-only="1" - transfer-ownership="none"> + transfer-ownership="none" + default-value="NULL"> + transfer-ownership="none" + default-value="NULL"> @@ -3918,7 +3923,8 @@ use it should be. + transfer-ownership="none" + default-value="0"> @@ -4840,30 +4846,47 @@ raise an error. + setter="set_bare" + default-value="NULL"> - + + transfer-ownership="none" + default-value="NULL"> - + - + - + - + @@ -4871,21 +4894,31 @@ raise an error. + transfer-ownership="container" + default-value="NULL"> - + - + - + @@ -4893,10 +4926,14 @@ raise an error. + transfer-ownership="none" + default-value="42"> - + @@ -4905,13 +4942,15 @@ raise an error. writable="1" transfer-ownership="none" setter="set_string" - getter="get_string"> + getter="get_string" + default-value="NULL"> + transfer-ownership="none" + default-value="FALSE"> @@ -5715,7 +5754,8 @@ the introspection client langage. + transfer-ownership="none" + default-value="TRUE"> @@ -5795,7 +5835,8 @@ the introspection client langage. writable="1" transfer-ownership="none" setter="set_testbool" - getter="get_testbool"> + getter="get_testbool" + default-value="TRUE"> -- cgit v1.2.1