[gobject-introspection] Add support for function typedefs without pointer



commit d9a6824b2dd373f7bd3d3b3f434d2fe7069eaa51
Author: Ben Iofel <iofelben gmail com>
Date:   Fri Sep 25 15:11:17 2015 -0400

    Add support for function typedefs without pointer
    
    g-ir-scanner now supports something like this:
    
        typedef void my_callback(int);
    
    Notice how my_callback is not a pointer.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=755645

 giscanner/transformer.py                           |   12 +++++-
 .../Regress.TestNoPtrCallback.page                 |   24 ++++++++++++
 .../Regress.test_noptr_callback.page               |   38 ++++++++++++++++++++
 .../Regress.TestNoPtrCallback.page                 |   19 ++++++++++
 .../Regress.test_noptr_callback.page               |   36 ++++++++++++++++++
 .../Regress.TestNoPtrCallback.page                 |   21 +++++++++++
 .../Regress.test_noptr_callback.page               |   37 +++++++++++++++++++
 tests/scanner/Regress-1.0-expected.gir             |   20 ++++++++++
 tests/scanner/Regress-1.0-sections-expected.txt    |    1 +
 tests/scanner/regress.c                            |   14 +++++++
 tests/scanner/regress.h                            |    4 ++
 11 files changed, 224 insertions(+), 2 deletions(-)
---
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index fdb87f9..3183d62 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -596,6 +596,8 @@ raise ValueError."""
         ctype = symbol.base_type.type
         if (ctype == CTYPE_POINTER and symbol.base_type.base_type.type == CTYPE_FUNCTION):
             node = self._create_typedef_callback(symbol)
+        elif (ctype == CTYPE_FUNCTION):
+            node = self._create_typedef_callback(symbol)
         elif (ctype == CTYPE_POINTER and symbol.base_type.base_type.type == CTYPE_STRUCT):
             node = self._create_typedef_compound(ast.Record, symbol, disguised=True)
         elif ctype == CTYPE_STRUCT:
@@ -871,8 +873,14 @@ raise ValueError."""
             compound.fields.append(field)
 
     def _create_callback(self, symbol, member=False):
-        parameters = list(self._create_parameters(symbol, symbol.base_type.base_type))
-        retval = self._create_return(symbol.base_type.base_type.base_type)
+        if (symbol.base_type.type == CTYPE_FUNCTION):  # function
+            paramtype = symbol.base_type
+            retvaltype = symbol.base_type.base_type
+        elif (symbol.base_type.type == CTYPE_POINTER):  # function pointer
+            paramtype = symbol.base_type.base_type
+            retvaltype = symbol.base_type.base_type.base_type
+        parameters = list(self._create_parameters(symbol, paramtype))
+        retval = self._create_return(retvaltype)
 
         # Mark the 'user_data' arguments
         for i, param in enumerate(parameters):
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page 
b/tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page
new file mode 100644
index 0000000..02140c2
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<page id="Regress.TestNoPtrCallback"
+      type="topic"
+      style="callback"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="index" group="callback" type="guide"/>
+    </info>
+  <title>Regress.TestNoPtrCallback</title>
+  <synopsis><code mime="text/x-csrc">
+void TestNoPtrCallback (void);
+  </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>Returns</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page 
b/tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page
new file mode 100644
index 0000000..c760265
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<page id="Regress.test_noptr_callback"
+      type="topic"
+      style="function"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="index" group="function" type="guide"/>
+    <api:function>
+      <api:returns>
+        <api:type>void</api:type>
+      </api:returns>
+      <api:name>regress_test_noptr_callback</api:name>
+      <api:arg>
+        <api:type>RegressTestNoPtrCallback</api:type>
+        <api:name>callback</api:name>
+      </api:arg>
+    </api:function>
+  </info>
+  <title>regress_test_noptr_callback</title>
+  <synopsis><code mime="text/x-csrc">
+void regress_test_noptr_callback (RegressTestNoPtrCallback callback);
+  </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>callback</code></title>
+
+</item>
+<item>
+<title><code>Returns</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page 
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page
new file mode 100644
index 0000000..7dd66f4
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<page id="Regress.TestNoPtrCallback"
+      type="topic"
+      style="callback"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="index" group="callback" type="guide"/>
+  </info>
+  <title>Regress.TestNoPtrCallback</title>
+  <synopsis><code mime="text/x-gjs">
+function onTestNoPtrCallback(): void {
+}
+  </code></synopsis>
+
+
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page 
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page
new file mode 100644
index 0000000..a7cec65
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<page id="Regress.test_noptr_callback"
+      type="topic"
+      style="function"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="index" group="function" type="guide"/>
+    <api:function>
+      <api:returns>
+        <api:type>void</api:type>
+      </api:returns>
+      <api:name>regress_test_noptr_callback</api:name>
+      <api:arg>
+        <api:type>Regress.TestNoPtrCallback</api:type>
+        <api:name>callback</api:name>
+      </api:arg>
+    </api:function>
+  </info>
+  <title>Regress.test_noptr_callback</title>
+  <synopsis><code mime="text/x-gjs">
+function test_noptr_callback(callback: <link 
xref="Regress.TestNoPtrCallback">Regress.TestNoPtrCallback</link>): void {
+    // Gjs wrapper for regress_test_noptr_callback()
+}
+  </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>callback</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page 
b/tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page
new file mode 100644
index 0000000..b7f04f5
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<page id="Regress.TestNoPtrCallback"
+      type="topic"
+      style="callback"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="index" group="callback" type="guide"/>
+  </info>
+  <title>Regress.TestNoPtrCallback</title>
+  <synopsis><code mime="text/x-python">
+ returns(none)
+def on_TestNoPtrCallback():
+  </code></synopsis>
+
+
+<terms>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page 
b/tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page
new file mode 100644
index 0000000..e376446
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<page id="Regress.test_noptr_callback"
+      type="topic"
+      style="function"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="index" group="function" type="guide"/>
+    <api:function>
+      <api:returns>
+        <api:type>none</api:type>
+      </api:returns>
+      <api:name>regress_test_noptr_callback</api:name>
+      <api:arg>
+        <api:type>Regress.TestNoPtrCallback</api:type>
+        <api:name>callback</api:name>
+      </api:arg>
+    </api:function>
+  </info>
+  <title>Regress.test_noptr_callback</title>
+  <synopsis><code mime="text/x-python">
+ accepts(Regress.TestNoPtrCallback)
+ returns(none)
+def test_noptr_callback(callback):
+    # Python wrapper for regress_test_noptr_callback()
+  </code></synopsis>
+
+
+<terms>
+<item>
+<title><code>callback</code></title>
+
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 620a290..6f991b7 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -2883,6 +2883,11 @@ use it should be.</doc>
         <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
       </field>
     </record>
+    <callback name="TestNoPtrCallback" c:type="RegressTestNoPtrCallback">
+      <return-value transfer-ownership="none">
+        <type name="none" c:type="void"/>
+      </return-value>
+    </callback>
     <class name="TestObj"
            c:symbol-prefix="test_obj"
            c:type="RegressTestObj"
@@ -6224,6 +6229,21 @@ What we're testing here is that the scanner ignores the @a nested inside XML.</d
         </parameter>
       </parameters>
     </function>
+    <function name="test_noptr_callback"
+              c:identifier="regress_test_noptr_callback">
+      <return-value transfer-ownership="none">
+        <type name="none" c:type="void"/>
+      </return-value>
+      <parameters>
+        <parameter name="callback"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1"
+                   scope="call">
+          <type name="TestNoPtrCallback" c:type="RegressTestNoPtrCallback"/>
+        </parameter>
+      </parameters>
+    </function>
     <function name="test_null_gerror_callback"
               c:identifier="regress_test_null_gerror_callback">
       <return-value transfer-ownership="none">
diff --git a/tests/scanner/Regress-1.0-sections-expected.txt b/tests/scanner/Regress-1.0-sections-expected.txt
index 335bfec..e0f9a1b 100644
--- a/tests/scanner/Regress-1.0-sections-expected.txt
+++ b/tests/scanner/Regress-1.0-sections-expected.txt
@@ -155,6 +155,7 @@ regress_test_multi_callback
 regress_test_multi_double_args
 regress_test_multiline_doc_comments
 regress_test_nested_parameter
+regress_test_noptr_callback
 regress_test_null_gerror_callback
 regress_test_owned_gerror_callback
 regress_test_return_allow_none
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index 3644f4c..83175b0 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -3476,6 +3476,20 @@ regress_test_simple_callback (RegressTestSimpleCallback callback)
 }
 
 /**
+ * regress_test_noptr_callback:
+ * @callback: (scope call) (allow-none):
+ *
+ **/
+void
+regress_test_noptr_callback (RegressTestNoPtrCallback callback)
+{
+    if (callback != NULL)
+        callback();
+
+    return;
+}
+
+/**
  * regress_test_callback_user_data:
  * @callback: (scope call):
  * @user_data: (not nullable):
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index ba0b562..d77a7a9 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -1033,6 +1033,7 @@ regress_test_fundamental_sub_object_new (const char *data);
 
 /* callback */
 typedef void (*RegressTestSimpleCallback) (void);
+typedef void RegressTestNoPtrCallback (void);
 typedef int (*RegressTestCallback) (void);
 typedef int (*RegressTestCallbackUserData) (gpointer user_data);
 /**
@@ -1077,6 +1078,9 @@ _GI_TEST_EXTERN
 void regress_test_simple_callback (RegressTestSimpleCallback callback);
 
 _GI_TEST_EXTERN
+void regress_test_noptr_callback (RegressTestNoPtrCallback callback);
+
+_GI_TEST_EXTERN
 int regress_test_callback (RegressTestCallback callback);
 
 _GI_TEST_EXTERN


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