[gobject-introspection] scanner: Add c_type for callbacks



commit d8c4caf990642050049ba0cff7b6916e01c354da
Author: Colin Walters <walters verbum org>
Date:   Tue Sep 14 13:08:50 2010 -0400

    scanner: Add c_type for callbacks
    
    We weren't doing this consistently, which broke nsname != cprefix
    cases.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=629683

 giscanner/girwriter.py                 |    2 +-
 giscanner/transformer.py               |    3 ++-
 tests/scanner/Regress-1.0-expected.gir |   19 +++++++++++++++++++
 tests/scanner/regress.h                |    7 +++++++
 4 files changed, 29 insertions(+), 2 deletions(-)
---
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index d3b023a..80e1719 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -430,7 +430,7 @@ and/or use gtk-doc annotations. ''')
     def _write_callback(self, callback):
         attrs = []
         if callback.namespace:
-            attrs.append(('c:type', callback.c_name))
+            attrs.append(('c:type', callback.ctype or callback.c_name))
         self._write_callable(callback, 'callback', attrs)
 
     def _write_record(self, record, extra_attrs=[]):
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index f9a4ead..02942c8 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -703,7 +703,8 @@ raise ValueError."""
             except TransformerException, e:
                 message.warn(e)
                 return None
-        callback = ast.Callback(name, retval, parameters, False)
+        callback = ast.Callback(name, retval, parameters, False,
+                                ctype=symbol.ident)
         callback.add_symbol_reference(symbol)
 
         return callback
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 16b8015..ebbcb0a 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -126,6 +126,25 @@ use it should be.</doc>
         <type name="gint" c:type="int"/>
       </return-value>
     </callback>
+    <callback name="TestCallbackFull" c:type="RegressTestCallbackFull">
+      <return-value transfer-ownership="none">
+        <type name="gint" c:type="int"/>
+      </return-value>
+      <parameters>
+        <parameter name="foo" transfer-ownership="none">
+          <doc xml:whitespace="preserve">the investment rate</doc>
+          <type name="gint" c:type="int"/>
+        </parameter>
+        <parameter name="bar" transfer-ownership="none">
+          <doc xml:whitespace="preserve">how much money</doc>
+          <type name="gdouble" c:type="double"/>
+        </parameter>
+        <parameter name="path" transfer-ownership="none">
+          <doc xml:whitespace="preserve">Path to file</doc>
+          <type name="filename"/>
+        </parameter>
+      </parameters>
+    </callback>
     <callback name="TestCallbackUserData" c:type="RegressTestCallbackUserData">
       <return-value transfer-ownership="none">
         <type name="gint" c:type="int"/>
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index dde4e5b..ac71307 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -413,6 +413,13 @@ regress_test_fundamental_sub_object_new (const char *data);
 typedef void (*RegressTestSimpleCallback) (void);
 typedef int (*RegressTestCallback) (void);
 typedef int (*RegressTestCallbackUserData) (gpointer user_data);
+/**
+ * RegressTestCallbackFull:
+ * @foo: the investment rate
+ * @bar: how much money
+ * @path: (type filename): Path to file
+ */
+typedef int (*RegressTestCallbackFull) (int foo, double bar, char *path);
 
 void regress_test_simple_callback (RegressTestSimpleCallback callback);
 int regress_test_callback (RegressTestCallback callback);



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