summaryrefslogtreecommitdiff
path: root/giscanner
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2011-08-29 22:17:02 -0400
committerColin Walters <walters@verbum.org>2011-08-29 22:17:02 -0400
commitcef390f65ffe9e51b103fcb29ee177882f762a0e (patch)
tree930904227ee8c35adf28300195f5567859b5e65b /giscanner
parent198bbaf8589dc2106a92050e74ad643a9411d047 (diff)
downloadgobject-introspection-cef390f65ffe9e51b103fcb29ee177882f762a0e.tar.gz
scanner: Don't try to copy c:type if we're parsing (element-type)
Commit 81abc2eb63317003a11d1484e84698a37e8ec035 tries harder to keep the c:type if it was overriden by a (type) annotation. However, the _resolve() function was also called for (element-type), which had undesirable effects - we'd copy the container c:type to the element type. Fix this by splitting out the c:type preservation to only happen when processing toplevel types. https://bugzilla.gnome.org/show_bug.cgi?id=656931
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/maintransformer.py15
1 files changed, 10 insertions, 5 deletions
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index 3eba1e7a..29d9229d 100644
--- a/giscanner/maintransformer.py
+++ b/giscanner/maintransformer.py
@@ -300,6 +300,11 @@ usage is void (*_gtk_reserved1)(void);"""
text = type_str
message.warn_node(parent, "%s: Unknown type: %r" %
(text, result.ctype), positions=position)
+ return result
+
+ def _resolve_toplevel(self, type_str, type_node=None, node=None, parent=None):
+ """Like _resolve(), but attempt to preserve more attributes of original type."""
+ result = self._resolve(type_str, type_node=type_node, node=node, parent=parent)
# If we replace a node with a new type (such as an annotated) we
# might lose the ctype from the original node.
if type_node is not None:
@@ -525,8 +530,8 @@ usage is void (*_gtk_reserved1)(void);"""
param_type = options.get(OPT_TYPE)
if param_type:
- node.type = self._resolve(param_type.one(),
- node.type, node, parent)
+ node.type = self._resolve_toplevel(param_type.one(),
+ node.type, node, parent)
caller_allocates = False
annotated_direction = None
@@ -753,7 +758,7 @@ usage is void (*_gtk_reserved1)(void);"""
prop.transfer = self._get_transfer_default(parent, prop)
type_tag = block.get(TAG_TYPE)
if type_tag:
- prop.type = self._resolve(type_tag.value, prop.type, prop, parent)
+ prop.type = self._resolve_toplevel(type_tag.value, prop.type, prop, parent)
def _apply_annotations_signal(self, parent, signal):
prefix = self._get_annotation_name(parent)
@@ -776,8 +781,8 @@ usage is void (*_gtk_reserved1)(void);"""
options = getattr(tag, 'options', {})
param_type = options.get(OPT_TYPE)
if param_type:
- param.type = self._resolve(param_type.one(), param.type,
- param, parent)
+ param.type = self._resolve_toplevel(param_type.one(), param.type,
+ param, parent)
else:
tag = None
self._apply_annotations_param(signal, param, tag)