[gobject-introspection] scanner: Allow adding annotations to vfuncs directly



commit 9b4185f88aa321b5160b100597d83d295b0af76e
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Feb 9 15:43:23 2012 -0500

    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.

 giscanner/maintransformer.py           |    4 ++++
 tests/scanner/Regress-1.0-expected.gir |   27 +++++++++++++++++++++++++++
 tests/scanner/regress.h                |    6 ++++++
 3 files changed, 37 insertions(+), 0 deletions(-)
---
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index a9eea8a..ad04bff 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 10f86dd..24e8d05 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 6c5a036..8942130 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;
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]