summaryrefslogtreecommitdiff
path: root/giscanner
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/docwriter.py18
-rw-r--r--giscanner/girparser.py2
-rw-r--r--giscanner/girwriter.py11
-rw-r--r--giscanner/introspectablepass.py3
-rw-r--r--giscanner/transformer.py3
5 files changed, 27 insertions, 10 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/girwriter.py b/giscanner/girwriter.py
index d1333cb7..6eff6526 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -378,10 +378,15 @@ class GIRWriter(XMLWriter):
with self.tagcontext('array', attrs):
self._write_type(ntype.element_type)
elif isinstance(ntype, ast.List):
- if ntype.name:
+ # GListModel element-type annotations are not mandatory
+ if ntype.name in ('Gio.ListModel', 'GListModel') and ntype.element_type is ast.TYPE_ANY:
attrs.insert(0, ('name', ntype.name))
- with self.tagcontext('type', attrs):
- self._write_type(ntype.element_type)
+ self.write_tag('type', attrs)
+ else:
+ if ntype.name:
+ attrs.insert(0, ('name', ntype.name))
+ with self.tagcontext('type', attrs):
+ self._write_type(ntype.element_type)
elif isinstance(ntype, ast.Map):
attrs.insert(0, ('name', 'GLib.HashTable'))
with self.tagcontext('type', attrs):
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,