diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-02-09 15:43:23 -0500 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2012-02-09 16:00:20 -0500 |
commit | 9b4185f88aa321b5160b100597d83d295b0af76e (patch) | |
tree | addf51fee9cc497391d9e54e919fcf5147575171 | |
parent | 9e56835f5ebb601aa0cb22130555a8a4ef15b11b (diff) | |
download | gobject-introspection-9b4185f88aa321b5160b100597d83d295b0af76e.tar.gz |
scanner: Allow adding annotations to vfuncs directly
Some vfuncs may not have public invokers. In these cases, annotations
may still be needed to correctly implement or chain up to a virtual
method from a subclass's implementation.
-rw-r--r-- | giscanner/maintransformer.py | 4 | ||||
-rw-r--r-- | tests/scanner/Regress-1.0-expected.gir | 27 | ||||
-rw-r--r-- | tests/scanner/regress.h | 6 |
3 files changed, 37 insertions, 0 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index a9eea8a1..ad04bffd 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -1224,6 +1224,10 @@ method or constructor of some type.""" vfunc = ast.VFunction.from_callback(callback) vfunc.instance_parameter = callback.parameters[0] vfunc.inherit_file_positions(callback) + + prefix = self._get_annotation_name(class_struct) + block = self._blocks.get('%s::%s' % (prefix, vfunc.name)) + self._apply_annotations_callable(vfunc, [node], block) node.virtual_methods.append(vfunc) # Take the set of virtual methods we found, and try diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir index 10f86dd1..24e8d050 100644 --- a/tests/scanner/Regress-1.0-expected.gir +++ b/tests/scanner/Regress-1.0-expected.gir @@ -582,6 +582,17 @@ use it should be.</doc> </parameter> </parameters> </function> + <virtual-method name="allow_none_vfunc"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="two" transfer-ownership="none" allow-none="1"> + <doc xml:whitespace="preserve">Another object</doc> + <type name="TestObj" c:type="RegressTestObj*"/> + </parameter> + </parameters> + </virtual-method> <virtual-method name="matrix" invoker="do_matrix"> <doc xml:whitespace="preserve">This method is virtual. Notably its name differs from the virtual slot name, which makes it useful for testing bindings handle this @@ -1125,6 +1136,22 @@ Use with regress_test_obj_emit_sig_with_obj</doc> </parameters> </callback> </field> + <field name="allow_none_vfunc"> + <callback name="allow_none_vfunc"> + <return-value transfer-ownership="none"> + <type name="none" c:type="void"/> + </return-value> + <parameters> + <parameter name="obj" transfer-ownership="none"> + <type name="TestObj" c:type="RegressTestObj*"/> + </parameter> + <parameter name="two" transfer-ownership="none" allow-none="1"> + <doc xml:whitespace="preserve">Another object</doc> + <type name="TestObj" c:type="RegressTestObj*"/> + </parameter> + </parameters> + </callback> + </field> <field name="test_signal"> <type name="guint" c:type="guint"/> </field> diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h index 6c5a0361..8942130d 100644 --- a/tests/scanner/regress.h +++ b/tests/scanner/regress.h @@ -358,6 +358,12 @@ struct _RegressTestObjClass int (*matrix) (RegressTestObj *obj, const char *somestr); + /** + * RegressTestObjClass::allow_none_vfunc + * @two: (allow-none): Another object + */ + void (*allow_none_vfunc) (RegressTestObj *obj, RegressTestObj *two); + guint test_signal; guint test_signal_with_static_scope_arg; |