summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2021-06-24 18:00:02 +0100
committerEmmanuele Bassi <ebassi@gmail.com>2022-02-12 15:27:38 +0000
commite9956657be16c102a57443e474a5206756e40548 (patch)
treeaee58f2251a3fecee0d80de1a726934669ce4625
parent59a77cc7a96e34aa0d49b8c82f647115a8286a56 (diff)
downloadgobject-introspection-e9956657be16c102a57443e474a5206756e40548.tar.gz
scanner: Validate emitter methods
Follow the same semantics as Vala: 1. emitters should have the same return value as the signal 2. emitters should have the same parameters as the signal they emit (minus the instance parameter, which is implied in signals)
-rw-r--r--giscanner/introspectablepass.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/giscanner/introspectablepass.py b/giscanner/introspectablepass.py
index 3bb6429a..419c3d7e 100644
--- a/giscanner/introspectablepass.py
+++ b/giscanner/introspectablepass.py
@@ -209,6 +209,41 @@ class IntrospectablePass(object):
if not self._type_is_introspectable(obj.retval.type):
obj.introspectable = False
return True
+ if isinstance(obj, ast.Signal):
+ if obj.emitter is None:
+ return False
+ parent = stack[0]
+ for method in parent.methods:
+ if method.name != obj.emitter:
+ continue
+ if not obj.retval.type.is_equiv(method.retval.type):
+ self._parameter_warning(
+ parent,
+ obj,
+ "Emitter method %s for signal %s::%s does not have the "
+ "same return value type" % (method.symbol, parent.name, obj.name))
+ obj.emitter = None
+ return False
+ n_emitter_params = len(method.parameters)
+ n_signal_params = len(obj.parameters)
+ if n_emitter_params != n_signal_params:
+ self._parameter_warning(
+ parent,
+ obj,
+ "Emitter method %s for signal %s::%s does not have the "
+ "same number of arguments (expected: %d)" % (method.symbol, parent.name, obj.name, n_signal_params))
+ obj.emitter = None
+ return False
+ for idx, signal_param in enumerate(obj.parameters):
+ method_param = method.parameters[idx + 1]
+ if signal_param.type.is_equiv(method_param.type):
+ self._parameter_warning(
+ parent,
+ obj,
+ "Emitter method %s for signal %s::%s does not have the "
+ "same type of arguments" % (method.symbol, parent.name, obj.name))
+ obj.emitter = None
+ return False
return True
def _introspectable_property_analysis(self, obj, stack):