Bug 556174 – parse types for lists etc.
authorTommi Komulainen <tommi.komulainen@iki.fi>
Wed, 15 Oct 2008 22:08:26 +0000 (22:08 +0000)
committerTommi Komulainen <tko@src.gnome.org>
Wed, 15 Oct 2008 22:08:26 +0000 (22:08 +0000)
2008-10-15  Tommi Komulainen  <tommi.komulainen@iki.fi>

Bug 556174 – parse types for lists etc.

* girepository/girparser.c (end_type_recurse):
* tests/boxed.gir:
* tools/generate.c (write_type_info, write_field_info,
write_callable_info, write_callable_info, write_constant_info,
write_property_info): use nested <type>s for lists and hashes

svn path=/trunk/; revision=717

ChangeLog
girepository/girparser.c
tests/boxed.gir
tools/generate.c

index 9934cf4..2b7aa02 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2008-10-15  Tommi Komulainen  <tommi.komulainen@iki.fi>
 
+       Bug 556174 – parse types for lists etc.
+
+       * girepository/girparser.c (end_type_recurse):
+       * tests/boxed.gir:
+       * tools/generate.c (write_type_info, write_field_info,
+       write_callable_info, write_callable_info, write_constant_info,
+       write_property_info): use nested <type>s for lists and hashes
+
+2008-10-15  Tommi Komulainen  <tommi.komulainen@iki.fi>
+
        * tests/enum.gir:
        * tests/object.gir: remove trailing whitespace from inside
        elements to match g-ir-generate output
index cdc4731..35f882b 100644 (file)
@@ -1607,30 +1607,33 @@ end_type_recurse (ParseContext *ctx)
 {
   GList *types;
   GIrNodeType *parent;
+  GIrNodeType *param = NULL;
 
   parent = (GIrNodeType *) ((GList*)ctx->type_stack->data)->data;
+  if (ctx->type_parameters)
+    param = (GIrNodeType *) ctx->type_parameters->data;
 
   if (parent->tag == GI_TYPE_TAG_ARRAY ||
       parent->tag == GI_TYPE_TAG_GLIST ||
       parent->tag == GI_TYPE_TAG_GSLIST)
     {
-      if (ctx->type_parameters == NULL)
-       parent->parameter_type1 = parse_type (ctx, "pointer");
+      g_assert (param != NULL);
+
+      if (parent->parameter_type1 == NULL)
+        parent->parameter_type1 = param;
       else
-       parent->parameter_type1 = (GIrNodeType*)ctx->type_parameters->data;
+        g_assert_not_reached ();
     }
   else if (parent->tag == GI_TYPE_TAG_GHASH)
     {
-      if (ctx->type_parameters == NULL)
-       {
-         parent->parameter_type1 = parse_type (ctx, "pointer");
-         parent->parameter_type2 = parse_type (ctx, "pointer");
-       }
+      g_assert (param != NULL);
+
+      if (parent->parameter_type1 == NULL)
+        parent->parameter_type1 = param;
+      else if (parent->parameter_type2 == NULL)
+        parent->parameter_type2 = param;
       else
-       {
-         parent->parameter_type1 = (GIrNodeType*) ctx->type_parameters->data;
-         parent->parameter_type2 = (GIrNodeType*) ctx->type_parameters->next->data;
-       }
+        g_assert_not_reached ();
     }
   g_list_free (ctx->type_parameters);
   ctx->type_parameters = (GList *)ctx->type_stack->data;
index 0de395b..a96158c 100644 (file)
             <type name="BoxedType1"/>
           </parameter>
           <parameter name="w" direction="in">
-            <type name="GLib.List<boxed2>"/>
+            <type name="GLib.List">
+              <type name="boxed2"/>
+            </type>
           </parameter>
           <parameter name="t" transfer="full" direction="in">
-            <type name="GLib.HashTable<utf8,int64>"/>
+            <type name="GLib.HashTable">
+              <type name="utf8"/>
+              <type name="int64"/>
+            </type>
           </parameter>
           <parameter name="e" transfer="full" direction="out">
             <type name="GLib.Error"/>
index d4eb4e8..fb80138 100644 (file)
@@ -192,97 +192,112 @@ write_type_info (const gchar *namespace,
 
   if (tag == GI_TYPE_TAG_VOID) 
     {
-      if (is_pointer)
-       xml_printf (file, "%s", "any");
-      else
-       xml_printf (file, "%s", "none");
+      xml_start_element (file, "type");
+
+      xml_printf (file, " name=\"%s\"", is_pointer ? "any" : "none");
+
+      xml_end_element (file, "type");
     } 
   else if (G_TYPE_TAG_IS_BASIC (tag))
-    xml_printf (file, "%s", g_type_tag_to_string (tag));
+    {
+      xml_start_element (file, "type");
+      xml_printf (file, " name=\"%s\"", g_type_tag_to_string (tag));
+      xml_end_element (file, "type");
+    }
   else if (tag == GI_TYPE_TAG_ARRAY)
     {
       gint length;
 
+      xml_start_element (file, "array");
+
       type = g_type_info_get_param_type (info, 0);
-      write_type_info (namespace, type, file);
-      xml_printf (file, "[");
 
       length = g_type_info_get_array_length (info);
       
       if (length >= 0)
-       xml_printf (file, "length=%d", length);
+       xml_printf (file, " length=\"%d\"", length);
       
       if (g_type_info_is_zero_terminated (info))
-       xml_printf (file, "%szero-terminated=1", length >= 0 ? "," : "");
-      
-     xml_printf (file, "]");
+       xml_printf (file, " zero-terminated=\"1\"");
+
+      write_type_info (namespace, type, file);
+
       g_base_info_unref ((GIBaseInfo *)type);
+
+      xml_end_element (file, "array");
     }
   else if (tag == GI_TYPE_TAG_INTERFACE)
     {
       GIBaseInfo *iface = g_type_info_get_interface (info);
+      xml_start_element (file, "type");
+      xml_printf (file, " name=\"");
       write_type_name (namespace, iface, file);
+      xml_printf (file, "\"");
+      xml_end_element (file, "type");
       g_base_info_unref (iface);
     }
   else if (tag == GI_TYPE_TAG_GLIST)
     {
+      xml_start_element (file, "type");
+      xml_printf (file, " name=\"GLib.List\"");
       type = g_type_info_get_param_type (info, 0);
-      xml_printf (file, "GLib.List");
       if (type)
        {
-         xml_printf (file, "<");
          write_type_info (namespace, type, file);
-         xml_printf (file, ">");
          g_base_info_unref ((GIBaseInfo *)type);
        }
+      xml_end_element (file, "type");
     }
   else if (tag == GI_TYPE_TAG_GSLIST)
     {
+      xml_start_element (file, "type");
+      xml_printf (file, " name=\"GLib.SList\"");
       type = g_type_info_get_param_type (info, 0);
-      xml_printf (file, "GLib.SList");
       if (type)
        {
-         xml_printf (file, "<");
          write_type_info (namespace, type, file);
-         xml_printf (file, ">");
          g_base_info_unref ((GIBaseInfo *)type);
        }
+      xml_end_element (file, "type");
     }
   else if (tag == GI_TYPE_TAG_GHASH)
     {
+      xml_start_element (file, "type");
+      xml_printf (file, " name=\"GLib.HashTable\"");
       type = g_type_info_get_param_type (info, 0);
-      xml_printf (file, "GLib.HashTable");
       if (type)
        {
-         xml_printf (file, "<");
          write_type_info (namespace, type, file);
          g_base_info_unref ((GIBaseInfo *)type);
          type = g_type_info_get_param_type (info, 1);
-         xml_printf (file, ",");
          write_type_info (namespace, type, file);
-         xml_printf (file, ">");
          g_base_info_unref ((GIBaseInfo *)type);
        }
+      xml_end_element (file, "type");
     }
   else if (tag == GI_TYPE_TAG_ERROR) 
     {
       gint n;
 
-      xml_printf (file, "GLib.Error");
+      xml_start_element (file, "type");
+      xml_printf (file, " name=\"GLib.Error\"");
+
       n = g_type_info_get_n_error_domains (info);
       if (n > 0)
        {
-         xml_printf (file, "<");
          for (i = 0; i < n; i++)
            {
              GIErrorDomainInfo *ed = g_type_info_get_error_domain (info, i);
-             if (i > 0)
-               xml_printf (file, ",");
+             xml_start_element (file, "type");
+             xml_printf (file, " name=\"");
              write_type_name (namespace, (GIBaseInfo *)ed, file);
+             xml_printf (file, "\"");
+             xml_end_element (file, "type");
              g_base_info_unref ((GIBaseInfo *)ed);
            }
-         xml_printf (file, ">");
        }
+
+      xml_end_element (file, "type");
     }
   else
     {
@@ -336,17 +351,9 @@ write_field_info (const gchar *namespace,
       xml_printf (file, "\"");
     }
 
-  xml_start_element (file, "type");
-
-  xml_printf (file, " name=\"");
-
   write_type_info (namespace, type, file);
   g_base_info_unref ((GIBaseInfo *)type);
 
-  xml_printf (file, "\"");
-
-  xml_end_element (file, "type");
-
   xml_end_element (file, "field");
 }
 
@@ -382,16 +389,8 @@ write_callable_info (const gchar    *namespace,
   if (g_callable_info_may_return_null (info))
     xml_printf (file, " null-ok=\"1\"");
 
-  xml_start_element (file, "type");
-
-  xml_printf (file, " name=\"");
-
   write_type_info (namespace, type, file);
 
-  xml_printf (file, "\"");
-
-  xml_end_element (file, "type");
-
   xml_end_element (file, "return-value");
        
   if (g_callable_info_get_n_args (info) <= 0)
@@ -447,17 +446,9 @@ write_callable_info (const gchar    *namespace,
       if (g_arg_info_is_optional (arg))
        xml_printf (file, " optional=\"1\"");
       
-      xml_start_element (file, "type");
-      
-      xml_printf (file, " name=\"");
-
       type = g_arg_info_get_type (arg);
       write_type_info (namespace, type, file);
 
-      xml_printf (file, "\"");
-
-      xml_end_element (file, "type");
-
       xml_end_element (file, "parameter");
 
       g_base_info_unref ((GIBaseInfo *)arg);
@@ -697,13 +688,7 @@ write_constant_info (const gchar    *namespace,
   write_constant_value (namespace, type, &value, file);
   xml_printf (file, "\"");
 
-  xml_start_element (file, "type");
-  xml_printf (file, " name=\"");
-
   write_type_info (namespace, type, file);
-  xml_printf (file, "\"");
-
-  xml_end_element (file, "type");
 
   xml_end_element (file, "constant");
   
@@ -868,16 +853,8 @@ write_property_info (const gchar    *namespace,
     
   type = g_property_info_get_type (info);
 
-  xml_start_element (file, "type");
-
-  xml_printf (file, " name=\"");
-
   write_type_info (namespace, type, file);
 
-  xml_printf (file, "\"");
-  
-  xml_end_element (file, "type");
-
   xml_end_element (file, "property");
 }