summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2021-07-27 11:31:41 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2021-08-05 17:47:29 +0100
commit2b6c06da99611fe5821865d0635b83fb85210b67 (patch)
tree20f53838b5e3ebafdfef4db58fce800c04e20bf4
parentd324947dea03495c659df385fecc9dab1717309f (diff)
downloadgobject-introspection-2b6c06da99611fe5821865d0635b83fb85210b67.tar.gz
scanner: Warn if property annotations are mismatched
If the (set-property) and (get-property) annotations on methods do not round trip with the (setter) and (getter) annotations on the corresponding property, we want to emit a warning.
-rw-r--r--giscanner/maintransformer.py44
-rw-r--r--tests/scanner/Regress-1.0-expected.gir10
2 files changed, 37 insertions, 17 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index bca69697..b4d44d52 100644
--- a/giscanner/maintransformer.py
+++ b/giscanner/maintransformer.py
@@ -1466,25 +1466,41 @@ method or constructor of some type."""
def _pair_property_accessors(self, node):
"""Look for accessor methods for class properties"""
for prop in node.properties:
- normalized_name = prop.name.replace('-', '_')
- if prop.writable and not prop.construct_only:
- setter = 'set_' + normalized_name
- else:
- setter = None
- if prop.readable:
- # Heuristic: read-only properties can have getters that are
- # just the property name, like: gtk_widget_has_focus()
- if not prop.writable and prop.type.is_equiv(ast.TYPE_BOOLEAN):
- getter = normalized_name
- else:
- getter = 'get_' + normalized_name
- else:
- getter = None
+ setter = prop.setter
+ if setter is None:
+ normalized_name = prop.name.replace('-', '_')
+ if prop.writable and not prop.construct_only:
+ setter = 'set_' + normalized_name
+ getter = prop.getter
+ if getter is None:
+ if prop.readable:
+ # Heuristic: read-only properties can have getters that are
+ # just the property name, like: gtk_widget_has_focus()
+ if not prop.writable and prop.type.is_equiv(ast.TYPE_BOOLEAN):
+ getter = normalized_name
+ else:
+ getter = 'get_' + normalized_name
for method in node.methods:
if setter is not None and method.name == setter:
+ if method.set_property is None:
+ method.set_property = prop.name
+ elif method.set_property != prop.name:
+ message.warn_node(method,
+ "Setter method '%s' for property '%s' has a "
+ "mismatched '(set-property %s)' annotation" %
+ (method.symbol, prop.name, method.set_property))
+ method.set_property = prop.name
prop.setter = method.name
continue
if getter is not None and method.name == getter:
+ if method.get_property is None:
+ method.get_property = prop.name
+ elif method.get_property != prop.name:
+ message.warn_node(method,
+ "Getter method '%s' for property '%s' has a "
+ "mismatched '(get-property %s)' annotation" %
+ (method.symbol, prop.name, method.get_property))
+ method.get_property = prop.name
prop.getter = method.name
continue
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 4786080e..65a6a83d 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -4286,7 +4286,9 @@ case.</doc>
</parameter>
</parameters>
</method>
- <method name="set_bare" c:identifier="regress_test_obj_set_bare">
+ <method name="set_bare"
+ c:identifier="regress_test_obj_set_bare"
+ glib:set-property="bare">
<source-position filename="regress.h" line="828"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
@@ -5656,7 +5658,8 @@ the introspection client langage.</doc>
</parameters>
</function>
<method name="get_testbool"
- c:identifier="regress_test_wi_802_1x_get_testbool">
+ c:identifier="regress_test_wi_802_1x_get_testbool"
+ glib:get-property="testbool">
<source-position filename="regress.h" line="1256"/>
<return-value transfer-ownership="none">
<type name="gboolean" c:type="gboolean"/>
@@ -5668,7 +5671,8 @@ the introspection client langage.</doc>
</parameters>
</method>
<method name="set_testbool"
- c:identifier="regress_test_wi_802_1x_set_testbool">
+ c:identifier="regress_test_wi_802_1x_set_testbool"
+ glib:set-property="testbool">
<source-position filename="regress.h" line="1259"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>