summaryrefslogtreecommitdiff
path: root/giscanner
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2020-04-26 13:17:15 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2020-04-26 13:38:35 +0100
commita9f45431684e6be3623e272e54d481e4c5d9423d (patch)
tree8ea9fccc6314d57995555fa8969c39db57fe40c5 /giscanner
parent07162e9064a0a64ee68826334d8ab2d5c25ff035 (diff)
downloadgobject-introspection-a9f45431684e6be3623e272e54d481e4c5d9423d.tar.gz
Add support for element-type 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. The annotation should be optional, to maintain backward compatibility.
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/docwriter.py18
-rw-r--r--giscanner/girparser.py2
-rw-r--r--giscanner/introspectablepass.py3
-rw-r--r--giscanner/transformer.py3
4 files changed, 19 insertions, 7 deletions
diff --git a/giscanner/docwriter.py b/giscanner/docwriter.py
index 786da80d..e4a8f7c5 100644
--- a/giscanner/docwriter.py
+++ b/giscanner/docwriter.py
@@ -793,7 +793,11 @@ class DocFormatterPython(DocFormatterIntrospectableBase):
return fundamental_types.get(name, name)
def format_type(self, type_, link=False):
- if isinstance(type_, (ast.List, ast.Array)):
+ if isinstance(type_, ast.List):
+ if type_.name == 'Gio.ListModel':
+ return 'Gio.ListModel(item_type=' + self.format_type(type_.element_type) + ')'
+ return '[' + self.format_type(type_.element_type) + ']'
+ elif isinstance(type_, ast.Array):
return '[' + self.format_type(type_.element_type) + ']'
elif isinstance(type_, ast.Map):
return '{%s: %s}' % (self.format_type(type_.key_type),
@@ -930,10 +934,14 @@ class DocFormatterGjs(DocFormatterIntrospectableBase):
return fundamental_types.get(name, name)
def format_type(self, type_, link=False):
- if isinstance(type_, ast.Array) and \
- type_.element_type.target_fundamental in ('gint8', 'guint8'):
- return 'ByteArray'
- elif isinstance(type_, (ast.List, ast.Array)):
+ if isinstance(type_, ast.Array):
+ if type_.element_type.target_fundamental in ('gint8', 'guint8'):
+ return 'ByteArray'
+ else:
+ return 'Array(' + self.format_type(type_.element_type, link) + ')'
+ elif isinstance(type_, ast.List):
+ if type_.name == 'Gio.ListModel':
+ return 'Gio.ListModel({item_type: ' + self.format_type(type_.element_type) + '})'
return 'Array(' + self.format_type(type_.element_type, link) + ')'
elif isinstance(type_, ast.Map):
return '{%s: %s}' % (self.format_type(type_.key_type, link),
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/introspectablepass.py b/giscanner/introspectablepass.py
index e2056b42..8ac50064 100644
--- a/giscanner/introspectablepass.py
+++ b/giscanner/introspectablepass.py
@@ -89,7 +89,8 @@ class IntrospectablePass(object):
return
if (isinstance(node.type, (ast.List, ast.Array))
- and node.type.element_type == ast.TYPE_ANY):
+ and node.type.element_type == ast.TYPE_ANY
+ and not (isinstance(node.type, ast.List) and node.type.name == 'Gio.ListModel')):
self._parameter_warning(parent, node, "Missing (element-type) annotation")
parent.introspectable = False
return
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,