summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Iofel <iofelben@gmail.com>2015-09-25 15:11:17 -0400
committerColin Walters <walters@verbum.org>2015-10-19 18:00:58 -0400
commitd9a6824b2dd373f7bd3d3b3f434d2fe7069eaa51 (patch)
treee14a47b2f213a3d363cb313f8921da2281ccbf2d
parent5341da3520ef513e5a7c49e2d8737bb3f2341a3d (diff)
downloadgobject-introspection-d9a6824b2dd373f7bd3d3b3f434d2fe7069eaa51.tar.gz
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
-rw-r--r--giscanner/transformer.py12
-rw-r--r--tests/scanner/Regress-1.0-C-expected/Regress.TestNoPtrCallback.page24
-rw-r--r--tests/scanner/Regress-1.0-C-expected/Regress.test_noptr_callback.page38
-rw-r--r--tests/scanner/Regress-1.0-Gjs-expected/Regress.TestNoPtrCallback.page19
-rw-r--r--tests/scanner/Regress-1.0-Gjs-expected/Regress.test_noptr_callback.page36
-rw-r--r--tests/scanner/Regress-1.0-Python-expected/Regress.TestNoPtrCallback.page21
-rw-r--r--tests/scanner/Regress-1.0-Python-expected/Regress.test_noptr_callback.page37
-rw-r--r--tests/scanner/Regress-1.0-expected.gir20
-rw-r--r--tests/scanner/Regress-1.0-sections-expected.txt1
-rw-r--r--tests/scanner/regress.c14
-rw-r--r--tests/scanner/regress.h4
11 files changed, 224 insertions, 2 deletions
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index fdb87f94..3183d622 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 00000000..02140c29
--- /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 00000000..c760265d
--- /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 00000000..7dd66f4d
--- /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 00000000..a7cec65d
--- /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 00000000..b7f04f55
--- /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 00000000..e3764462
--- /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 620a2907..6f991b78 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 335bfec7..e0f9a1b7 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 3644f4ca..83175b07 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 ba0b5626..d77a7a97 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