Follow aliases when resolving constructor return types
authorColin Walters <walters@src.gnome.org>
Sun, 31 Aug 2008 16:39:04 +0000 (16:39 +0000)
committerColin Walters <walters@src.gnome.org>
Sun, 31 Aug 2008 16:39:04 +0000 (16:39 +0000)
* giscanner/glibtransformer.py: Follow aliases to ensure
we don't get a constructor returning a basic type.
* giscanner/transformer.py: Add function to follow aliases.
* tests/ Update.

svn path=/trunk/; revision=556

giscanner/glibtransformer.py
giscanner/transformer.py
tests/scanner/foo-expected.gir
tests/scanner/foo.h

index 1f31631..512557a 100644 (file)
@@ -319,7 +319,9 @@ class GLibTransformer(object):
             if new_idx < 0:
                 return None
             # Constructors don't return basic types
-            if target_arg.type.name in type_names:
+            derefed = self._transformer.follow_aliases(target_arg.type.name,
+                                                       self._names)
+            if derefed in type_names:
                 print "NOTE: Rejecting constructor returning basic: %r" \
                     % (func.symbol, )
                 return None
index b866ce7..be6cb10 100644 (file)
@@ -490,3 +490,13 @@ class Transformer(object):
             return self.resolve_param_type_full(ptype, self._names)
         except KeyError, e:
             return ptype
+
+    def follow_aliases(self, type_name, names):
+        while True:
+            resolved = names.aliases.get(type_name)
+            if resolved:
+                (ns, alias) = resolved
+                type_name = alias.target
+            else:
+                break
+        return type_name
index 9675f01..649c5e7 100644 (file)
@@ -9,6 +9,7 @@
   <namespace name="foo" shared-library="foo">
     <alias name="List" target="GLib.SList" c:type="FooList"/>
     <alias name="XEvent" target="none" c:type="FooXEvent"/>
+    <alias name="ObjectCookie" target="any" c:type="FooObjectCookie"/>
     <interface name="Interface"
                c:type="FooInterface"
                glib:type-name="FooInterface"
           </parameter>
         </parameters>
       </method>
+      <method name="new_cookie" c:identifier="foo_object_new_cookie">
+        <return-value>
+          <type name="ObjectCookie" c:type="FooObjectCookie"/>
+        </return-value>
+        <parameters>
+          <parameter name="object">
+            <type name="Object" c:type="FooObject*"/>
+          </parameter>
+          <parameter name="target">
+            <type name="string" c:type="char*"/>
+          </parameter>
+        </parameters>
+      </method>
       <property name="string">
         <type name="string" c:type="gchararray"/>
       </property>
index caf6774..3c1e753 100644 (file)
@@ -58,6 +58,9 @@ typedef GSList FooList;
 
 void                  foo_object_with_tdef         (FooObject *object, FooList *blah);
 
+typedef gpointer FooObjectCookie;
+
+FooObjectCookie       foo_object_new_cookie        (FooObject *object, const char *target);
 
 struct _FooSubobject
 {