[gobject-introspection/list-model-element-type: 13/14] Add element-type support to GListModel



commit b4c058bba4d95ae10e1e4238f9417fe954f97795
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Fri Feb 14 14:53:09 2020 +0000

    Add element-type support to GListModel
    
    GListModel is an interface for creating typed, list-like containers. The
    data stored is GObject instances, but it's useful to be able to annotate
    the actual type, for both documentation and code generation purposes.
    
    Fixes: #328

 giscanner/girparser.py                             |  2 +-
 giscanner/transformer.py                           |  3 ++
 .../Regress.test_list_model_none.page              | 30 ++++++++++++++++++++
 .../Regress.test_list_model_object.page            | 31 ++++++++++++++++++++
 .../Regress.test_list_model_object.page            | 33 ++++++++++++++++++++++
 .../Regress.test_list_model_object.page            | 32 +++++++++++++++++++++
 tests/scanner/Regress-1.0-expected.gir             | 32 +++++++++++++++++++++
 tests/scanner/Regress-1.0-sections-expected.txt    |  2 ++
 tests/scanner/regress.c                            | 30 ++++++++++++++++++++
 tests/scanner/regress.h                            |  6 ++++
 10 files changed, 200 insertions(+), 1 deletion(-)
---
diff --git a/giscanner/girparser.py b/giscanner/girparser.py
index 35206a41..d31b26cf 100644
--- a/giscanner/girparser.py
+++ b/giscanner/girparser.py
@@ -492,7 +492,7 @@ class GIRParser(object):
                 if ctype is None:
                     return ast.TypeUnknown()
                 return ast.Type(ctype=ctype)
-            elif name in ['GLib.List', 'GLib.SList']:
+            elif name in ['GLib.List', 'GLib.SList', 'Gio.ListModel']:
                 subchild = self._find_first_child(typenode,
                                                   list(map(_corens, ('callback', 'array',
                                                                 '    varargs', 'type'))))
diff --git a/giscanner/transformer.py b/giscanner/transformer.py
index bcabdedc..7f230a20 100644
--- a/giscanner/transformer.py
+++ b/giscanner/transformer.py
@@ -698,6 +698,9 @@ raise ValueError."""
         elif base in ('GHashTable', 'GLib.HashTable', 'GObject.HashTable'):
             return ast.Map(ast.TYPE_ANY, ast.TYPE_ANY, ctype=ctype, is_const=is_const,
                            complete_ctype=complete_ctype)
+        elif base in ('GListModel', 'Gio.ListModel'):
+            return ast.List('Gio.ListModel', ast.TYPE_ANY, ctype=ctype,
+                            is_const=is_const, complete_ctype=complete_ctype)
         return None
 
     def create_type_from_ctype_string(self, ctype, is_const=False,
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.test_list_model_none.page 
b/tests/scanner/Regress-1.0-C-expected/Regress.test_list_model_none.page
new file mode 100644
index 00000000..b1458649
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.test_list_model_none.page
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<page id="Regress.test_list_model_none"
+      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>GListModel*</api:type>
+      </api:returns>
+      <api:name>regress_test_list_model_none</api:name>
+    </api:function>
+  </info>
+  <title>regress_test_list_model_none</title>
+  <synopsis><code mime="text/x-csrc">
+GListModel* regress_test_list_model_none (void);
+  </code></synopsis>
+  <p>Test GListModel with no annotation.</p>
+
+<terms>
+<item>
+<title><code>Returns</code></title>
+  <p>a GListModel</p>
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.test_list_model_object.page 
b/tests/scanner/Regress-1.0-C-expected/Regress.test_list_model_object.page
new file mode 100644
index 00000000..620789cd
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.test_list_model_object.page
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<page id="Regress.test_list_model_object"
+      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>GListModel*</api:type>
+      </api:returns>
+      <api:name>regress_test_list_model_object</api:name>
+    </api:function>
+  </info>
+  <title>regress_test_list_model_object</title>
+  <synopsis><code mime="text/x-csrc">
+GListModel* regress_test_list_model_object (void);
+  </code></synopsis>
+  <p>Test GListModel return value with an element type annotation.</p>
+
+<terms>
+<item>
+<title><code>Returns</code></title>
+  <p>a GListModel
+  containing RegressTestObj values</p>
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_list_model_object.page 
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_list_model_object.page
new file mode 100644
index 00000000..a9dd90d7
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.test_list_model_object.page
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<page id="Regress.test_list_model_object"
+      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>Array(Regress.TestObj)</api:type>
+      </api:returns>
+      <api:name>regress_test_list_model_object</api:name>
+    </api:function>
+  </info>
+  <title>Regress.test_list_model_object</title>
+  <synopsis><code mime="text/x-gjs">
+function test_list_model_object(): Array(<link xref="Regress.TestObj">Regress.TestObj</link>) {
+    // Gjs wrapper for regress_test_list_model_object()
+}
+  </code></synopsis>
+  <p>Test GListModel return value with an element type annotation.</p>
+
+<terms>
+<item>
+<title><code>Returns</code></title>
+  <p>a GListModel
+  containing RegressTestObj values</p>
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.test_list_model_object.page 
b/tests/scanner/Regress-1.0-Python-expected/Regress.test_list_model_object.page
new file mode 100644
index 00000000..a4382c9d
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.test_list_model_object.page
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<page id="Regress.test_list_model_object"
+      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>[Regress.TestObj]</api:type>
+      </api:returns>
+      <api:name>regress_test_list_model_object</api:name>
+    </api:function>
+  </info>
+  <title>Regress.test_list_model_object</title>
+  <synopsis><code mime="text/x-python">
+@returns([Regress.TestObj])
+def test_list_model_object():
+    # Python wrapper for regress_test_list_model_object()
+  </code></synopsis>
+  <p>Test GListModel return value with an element type annotation.</p>
+
+<terms>
+<item>
+<title><code>Returns</code></title>
+{formatter.format(node, node.retval.doc)}
+</item>
+</terms>
+
+</page>
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index cef3b124..af648273 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -8041,6 +8041,38 @@ element-type annotation.</doc>
         </parameter>
       </parameters>
     </function>
+    <function name="test_list_model_none"
+              c:identifier="regress_test_list_model_none"
+              introspectable="0">
+      <doc xml:space="preserve"
+           filename="regress.c"
+           line="4689">Test GListModel with no annotation.</doc>
+      <source-position filename="regress.h" line="1538"/>
+      <return-value transfer-ownership="full">
+        <doc xml:space="preserve"
+             filename="regress.c"
+             line="4694">a GListModel</doc>
+        <type name="Gio.ListModel" c:type="GListModel*">
+          <type name="gpointer" c:type="gpointer"/>
+        </type>
+      </return-value>
+    </function>
+    <function name="test_list_model_object"
+              c:identifier="regress_test_list_model_object">
+      <doc xml:space="preserve"
+           filename="regress.c"
+           line="4704">Test GListModel return value with an element type annotation.</doc>
+      <source-position filename="regress.h" line="1541"/>
+      <return-value transfer-ownership="full">
+        <doc xml:space="preserve"
+             filename="regress.c"
+             line="4709">a GListModel
+  containing RegressTestObj values</doc>
+        <type name="Gio.ListModel" c:type="GListModel*">
+          <type name="TestObj"/>
+        </type>
+      </return-value>
+    </function>
     <function name="test_long" c:identifier="regress_test_long">
       <source-position filename="regress.h" line="73"/>
       <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 b35b3a9a..84f7ec67 100644
--- a/tests/scanner/Regress-1.0-sections-expected.txt
+++ b/tests/scanner/Regress-1.0-sections-expected.txt
@@ -159,6 +159,8 @@ regress_test_int64
 regress_test_int8
 regress_test_int_out_utf8
 regress_test_int_value_arg
+regress_test_list_model_none
+regress_test_list_model_object
 regress_test_long
 regress_test_multi_callback
 regress_test_multi_double_args
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index 3a63436b..e81d1989 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -4686,3 +4686,33 @@ regress_test_array_struct_in_none (RegressTestStructA *arr, gsize len)
   g_assert_cmpint (arr[2].some_int, ==, 303);
 }
 
+/**
+ * regress_test_list_model_none:
+ *
+ * Test GListModel with no annotation.
+ *
+ * Returns: (transfer full): a GListModel
+ */
+GListModel *
+regress_test_list_model_none (void)
+{
+  GListStore *res = g_list_store_new (regress_test_obj_get_type ());
+
+  return G_LIST_MODEL (res);
+}
+
+/**
+ * regress_test_list_model_object:
+ *
+ * Test GListModel return value with an element type annotation.
+ *
+ * Returns: (transfer full) (element-type RegressTestObj): a GListModel
+ *   containing RegressTestObj values
+ */
+GListModel *
+regress_test_list_model_object (void)
+{
+  GListStore *res = g_list_store_new (regress_test_obj_get_type ());
+
+  return G_LIST_MODEL (res);
+}
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index 0b239f14..9ff699fb 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -1534,4 +1534,10 @@ void regress_test_array_struct_in_full (RegressTestStructA *arr, gsize len);
 _GI_TEST_EXTERN
 void regress_test_array_struct_in_none (RegressTestStructA *arr, gsize len);
 
+_GI_TEST_EXTERN
+GListModel *regress_test_list_model_none (void);
+
+_GI_TEST_EXTERN
+GListModel *regress_test_list_model_object (void);
+
 #endif /* __GITESTTYPES_H__ */


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