diff options
-rw-r--r-- | giscanner/introspectablepass.py | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/giscanner/introspectablepass.py b/giscanner/introspectablepass.py index 305e192e..9681d9b7 100644 --- a/giscanner/introspectablepass.py +++ b/giscanner/introspectablepass.py @@ -40,6 +40,7 @@ class IntrospectablePass(object): self._namespace.walk(self._introspectable_property_analysis) self._namespace.walk(self._introspectable_pass3) self._namespace.walk(self._remove_non_reachable_backcompat_copies) + self._namespace.walk(self._introspectable_symbol_collisions) def _parameter_warning(self, parent, param, text, position=None): # Suppress VFunctions and Callbacks warnings for now @@ -260,3 +261,43 @@ class IntrospectablePass(object): if not obj.introspectable: obj.internal_skipped = True return True + + def _property_warning(self, parent, prop, text, position=None): + context = "property %s:%s: " % (parent.name, prop.name, ) + message.warn_node(parent, context + text, positions=position) + + def _property_signal_collision(self, obj, prop): + for s in obj.signals: + if s.skip or not s.introspectable: + continue + if s.name.replace('-', '_') == prop.name.replace('-', '_'): + self._property_warning(obj, prop, "Properties cannot have the same name as signals") + return False + + def _property_method_collision(self, obj, prop): + for m in obj.methods: + if m.skip or not m.introspectable: + continue + if m.name == prop.name.replace('-', '_'): + self._property_warning(obj, prop, "Properties cannot have the same name as methods") + return False + + def _property_vfunc_collision(self, obj, prop): + for vfunc in obj.virtual_methods: + if vfunc.skip or not vfunc.introspectable: + continue + if vfunc.name == prop.name.replace('-', '_'): + self._property_warning(obj, prop, "Properties cannot have the same name as virtual methods") + return False + + def _introspectable_symbol_collisions(self, obj, stack): + if obj.skip: + return False + if isinstance(obj, (ast.Class, ast.Interface)): + for prop in obj.properties: + if prop.skip or not prop.introspectable: + continue + self._property_signal_collision(obj, prop) + self._property_method_collision(obj, prop) + self._property_vfunc_collision(obj, prop) + return True |