[scanner] Fix various hardcoded type name checks
authorDan Winship <danw@gnome.org>
Wed, 9 Dec 2009 21:38:57 +0000 (16:38 -0500)
committerDan Winship <danw@gnome.org>
Wed, 9 Dec 2009 22:04:25 +0000 (17:04 -0500)
Various places that check hardcoded type names were not always handling
the case of the type being used from within its own library (in which
case it won't have a type prefix). Make them more consistent.

https://bugzilla.gnome.org/show_bug.cgi?id=602512

giscanner/annotationparser.py
giscanner/glibtransformer.py
giscanner/transformer.py

index 18c40ed..d91bb1c 100644 (file)
@@ -417,7 +417,8 @@ class AnnotationApplier(object):
     def _parse_callable(self, callable, block):
         self._parse_node_common(callable, block)
         for i, param in enumerate(callable.parameters):
-            if param.type.name not in ['DestroyNotify', 'GLib.DestroyNotify']:
+            if (param.type.ctype != 'GDestroyNotify' and
+                param.type.name != 'GLib.DestroyNotify'):
                 continue
             if i < 2:
                 break
@@ -511,8 +512,8 @@ class AnnotationApplier(object):
             if scope:
                 param.scope = scope.one()
                 param.transfer = PARAM_TRANSFER_NONE
-            elif param.type.name in ['AsyncReadyCallback',
-                                     'Gio.AsyncReadyCallback']:
+            elif (param.type.ctype == 'GAsyncReadyCallback' or
+                  param.type.name == 'Gio.AsyncReadyCallback'):
                 param.scope = OPT_SCOPE_ASYNC
                 param.transfer = PARAM_TRANSFER_NONE
 
@@ -661,9 +662,11 @@ class AnnotationApplier(object):
         def combiner(base, *rest):
             if not rest:
                 return base
-            if base.name in ['GLib.List', 'GLib.SList'] and len(rest)==1:
+            if (base.name in ['GLib.List', 'GLib.SList'] or
+                base.ctype in ['GList*', 'GSList*']) and len(rest)==1:
                 return List(base.name, base.ctype, *rest)
-            if base.name in ['GLib.HashTable'] and len(rest)==2:
+            if (base.name in ['GLib.HashTable'] or
+                base.ctype in ['GHashTable*']) and len(rest)==2:
                 return Map(base.name, base.ctype, *rest)
             print "WARNING: throwing away type parameters:", type_str
             return base
@@ -682,13 +685,15 @@ class AnnotationApplier(object):
     def _parse_element_type(self, parent, node, options):
         element_type_opt = options.get(OPT_ELEMENT_TYPE)
         element_type = element_type_opt.flat()
-        if node.type.name in ['GLib.List', 'GLib.SList']:
+        if (node.type.name in ['GLib.List', 'GLib.SList'] or
+            node.type.ctype in ['GList*', 'GSList*']):
             assert len(element_type) == 1
             container_type = List(
                 node.type.name,
                 node.type.ctype,
                 self._resolve(element_type[0]))
-        elif node.type.name in ['GLib.HashTable']:
+        elif (node.type.name in ['GLib.HashTable'] or
+              node.type.ctype in ['GHashTable*']):
             assert len(element_type) == 2
             container_type = Map(
                 node.type.name,
index d44987b..658be69 100644 (file)
@@ -408,8 +408,8 @@ class GLibTransformer(object):
             return False
         if func.parameters:
             return False
-        if func.retval.type.name not in ['GLib.Quark',
-                                         'GQuark']:
+        if (func.retval.type.name != 'GLib.Quark' and
+            func.retval.type.ctype != 'GQuark'):
             return False
 
         self._error_quark_functions.append(func)
index bc5d943..1024ee3 100644 (file)
@@ -283,9 +283,8 @@ class Transformer(object):
         return False
 
     def _handle_destroy(self, param, destroy_idx, destroy_param):
-        if ((self._namespace.name == 'GLib' and
-             destroy_param.type.name == 'DestroyNotify') or
-            destroy_param.type.name == 'GLib.DestroyNotify'):
+        if (destroy_param.type.name == 'GLib.DestroyNotify' or
+            destroy_param.type.ctype == 'GDestroyNotify'):
             param.destroy_name = destroy_param.name
             param.destroy_index = destroy_idx
             return True