Bug 560404 – Prefix types when resolving aliases in included modules
authorOwen Taylor <otaylor@src.gnome.org>
Tue, 11 Nov 2008 22:02:37 +0000 (22:02 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Tue, 11 Nov 2008 22:02:37 +0000 (22:02 +0000)
* girepository/girparser.c: When resolving aliases in an included
module, prefix types before looking them up.

svn path=/trunk/; revision=889

ChangeLog
girepository/girparser.c

index afaa4e7..371f08a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-11  Owen Taylor  <otaylor@redhat.com>
+
+       Bug 560404 – Prefix types when resolving aliases in included modules
+
+       * girepository/girparser.c: When resolving aliases in an included
+       module, prefix types before looking them up.
+
 2008-11-11  Owen Taylor  <otaylor@redhat.com>
 
        Compute field offsets and overall size for object structures
index 74d7275..850833f 100644 (file)
@@ -478,19 +478,39 @@ resolve_aliases (ParseContext *ctx, const gchar *type)
   gpointer orig;
   gpointer value;
   GSList *seen_values = NULL;
+  const char *lookup;
+  char *prefixed;
 
-  seen_values = g_slist_prepend (seen_values, (char*)type);
-  while (g_hash_table_lookup_extended (ctx->aliases, type, &orig, &value))
+  /* If we are in an included module, then we need to qualify the
+   * names of types before resolving them, since they will have
+   * been stored in the aliases qualified.
+   */
+  if (ctx->prefix_aliases && strchr (type, '.') == NULL)
+    {
+      prefixed = g_strdup_printf ("%s.%s", ctx->namespace, type);
+      lookup = prefixed;
+    }
+  else
+    lookup = type;
+
+  seen_values = g_slist_prepend (seen_values, (char*)lookup);
+  while (g_hash_table_lookup_extended (ctx->aliases, lookup, &orig, &value))
     {
-      g_debug ("Resolved: %s => %s", type, (char*)value);
-      type = value;
-      if (g_slist_find_custom (seen_values, type,
+      g_debug ("Resolved: %s => %s\n", lookup, (char*)value);
+      lookup = value;
+      if (g_slist_find_custom (seen_values, lookup,
                               (GCompareFunc)strcmp) != NULL)
        break;
-      seen_values = g_slist_prepend (seen_values, (gchar*)type);
+      seen_values = g_slist_prepend (seen_values, (gchar*)lookup);
     }
   g_slist_free (seen_values);
-  return type;
+
+  if (lookup == prefixed)
+    lookup = type;
+  
+  g_free (prefixed);
+  
+  return lookup;
 }
 
 static GIrNodeType *