diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2021-07-27 11:31:41 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2021-08-05 17:47:29 +0100 |
commit | 2b6c06da99611fe5821865d0635b83fb85210b67 (patch) | |
tree | 20f53838b5e3ebafdfef4db58fce800c04e20bf4 /giscanner | |
parent | d324947dea03495c659df385fecc9dab1717309f (diff) | |
download | gobject-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.
Diffstat (limited to 'giscanner')
-rw-r--r-- | giscanner/maintransformer.py | 44 |
1 files changed, 30 insertions, 14 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 |