Bug 556732 – generate gir files consistently
authorTommi Komulainen <tommi.komulainen@iki.fi>
Fri, 17 Oct 2008 14:58:37 +0000 (14:58 +0000)
committerTommi Komulainen <tko@src.gnome.org>
Fri, 17 Oct 2008 14:58:37 +0000 (14:58 +0000)
2008-10-17  Tommi Komulainen  <tommi.komulainen@iki.fi>

Bug 556732 – generate gir files consistently

* giscanner/ast.py (Field): add readable and writable properties
* giscanner/girparser.py (_parse_field): copy 'readable' and
'writable' attributes
* giscanner/transformer.py (_create_member): create fields as
read-write
* giscanner/glibtransformer.py (_introspect_object,
_pair_class_struct): make object instance and class fields
read-only
* giscanner/girwriter.py (_write_field):
* tools/generate.c (write_field_info): write field 'readable'
and 'writable' attributes only if non-default (read-only)
* girepository/girparser.c (start_field): in the absence of
attributes assume fields are read-only
* tests/boxed.gir:
* tests/struct.gir: remove redundant readable="1" from fields
* tests/scanner/foo-1.0-expected.gir:
* tests/scanner/utility-1.0-expected.gir: add writable="1" to
all record and union fields

svn path=/trunk/; revision=743

12 files changed:
ChangeLog
girepository/girparser.c
giscanner/ast.py
giscanner/girparser.py
giscanner/girwriter.py
giscanner/glibtransformer.py
giscanner/transformer.py
tests/boxed.gir
tests/scanner/foo-1.0-expected.gir
tests/scanner/utility-1.0-expected.gir
tests/struct.gir
tools/generate.c

index 3f02fac..49ac08c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,29 @@
 
        Bug 556732 – generate gir files consistently
 
+       * giscanner/ast.py (Field): add readable and writable properties
+       * giscanner/girparser.py (_parse_field): copy 'readable' and
+       'writable' attributes
+       * giscanner/transformer.py (_create_member): create fields as
+       read-write
+       * giscanner/glibtransformer.py (_introspect_object,
+       _pair_class_struct): make object instance and class fields
+       read-only
+       * giscanner/girwriter.py (_write_field):
+       * tools/generate.c (write_field_info): write field 'readable'
+       and 'writable' attributes only if non-default (read-only)
+       * girepository/girparser.c (start_field): in the absence of
+       attributes assume fields are read-only
+       * tests/boxed.gir:
+       * tests/struct.gir: remove redundant readable="1" from fields
+       * tests/scanner/foo-1.0-expected.gir:
+       * tests/scanner/utility-1.0-expected.gir: add writable="1" to
+       all record and union fields
+
+2008-10-17  Tommi Komulainen  <tommi.komulainen@iki.fi>
+
+       Bug 556732 – generate gir files consistently
+
        * giscanner/girwriter.py (_write_property): write properties
        'construct' attribute if set
        * tools/generate.c (write_property_info): write properties
index 249aa1b..8dea909 100644 (file)
@@ -839,15 +839,11 @@ start_field (GMarkupParseContext *context,
   field = (GIrNodeField *)g_ir_node_new (G_IR_NODE_FIELD);
   ctx->current_typed = (GIrNode*) field;
   ((GIrNode *)field)->name = g_strdup (name);
-  if (readable && strcmp (readable, "1") == 0)
-    field->readable = TRUE;
-  else
-    field->readable = FALSE;
-  
-  if (writable && strcmp (writable, "1") == 0)
-    field->writable = TRUE;
-  else
-    field->writable = FALSE;
+  /* Fields are assumed to be read-only.
+   * (see also girwriter.py and generate.c)
+   */
+  field->readable = readable == NULL || strcmp (readable, "0") == 0;
+  field->writable = writable != NULL && strcmp (writable, "1") == 0;
   
   if (bits)
     field->bits = atoi (bits);
index 490fd90..2e83ede 100644 (file)
@@ -319,10 +319,12 @@ class Struct(Node):
 
 class Field(Node):
 
-    def __init__(self, name, typenode, symbol, bits=None):
+    def __init__(self, name, typenode, symbol, readable, writable, bits=None):
         Node.__init__(self, name)
         self.type = typenode
         self.symbol = symbol
+        self.readable = readable
+        self.writable = writable
         self.bits = bits
 
     def __repr__(self):
index 933bb97..0a9e579 100644 (file)
@@ -245,6 +245,8 @@ class GIRParser(object):
         return Field(node.attrib['name'],
                      type_node,
                      type_node.ctype,
+                     node.attrib.get('readable') != '0',
+                     node.attrib.get('writable') == '1',
                      node.attrib.get('bits'))
 
     def _parse_property(self, node):
index 55176d7..8b455ce 100644 (file)
@@ -327,6 +327,12 @@ class GIRWriter(XMLWriter):
             return
 
         attrs = [('name', field.name)]
+        # Fields are assumed to be read-only
+        # (see also girparser.c and generate.c)
+        if not field.readable:
+            attrs.append(('readable', '0'))
+        if field.writable:
+            attrs.append(('writable', '1'))
         if field.bits:
             attrs.append(('bits', str(field.bits)))
         with self.tagcontext('field', attrs):
index f069840..144caa6 100644 (file)
@@ -26,7 +26,7 @@ from ctypes.util import find_library
 from . import cgobject
 from .ast import (Callback, Constant, Enum, Function, Member, Namespace,
                   Parameter, Property, Return, Struct, Type, Alias, Array,
-                  Union, type_name_from_ctype,
+                  Union, Field, type_name_from_ctype,
                   default_array_types, TYPE_UINT8, PARAM_DIRECTION_IN)
 from .transformer import Names
 from .glibast import (GLibBoxed, GLibEnum, GLibEnumMember, GLibFlags,
@@ -461,6 +461,12 @@ class GLibTransformer(object):
             del self._names.names[maybe_class.name]
             return
 
+        # Object class fields are assumed to be read-only
+        # (see also _introspect_object and transformer.py)
+        for field in maybe_class.fields:
+            if isinstance(field, Field):
+                field.writable = False
+
         name = self._resolve_type_name(name)
         resolved = self._transformer.strip_namespace_object(name)
         pair_class = self._get_attribute(resolved)
@@ -540,6 +546,11 @@ class GLibTransformer(object):
         struct = self._get_attribute(node.name)
         if struct is not None:
             node.fields = struct.fields
+            for field in node.fields:
+                if isinstance(field, Field):
+                    # Object instance fields are assumed to be read-only
+                    # (see also _pair_class_struct and transformer.py)
+                    field.writable = False
 
         self._add_attribute(node, replace=True)
         self._register_internal_type(type_name, node)
index 6b5576d..fcba2a7 100644 (file)
@@ -310,7 +310,10 @@ class Transformer(object):
             node = self._create_callback(symbol)
         else:
             ftype = self._create_type(symbol.base_type, {})
-            node = Field(symbol.ident, ftype, symbol.ident, symbol.const_int)
+            # Fields are assumed to be read-write
+            # (except for Objects, see also glibtransformer.py)
+            node = Field(symbol.ident, ftype, symbol.ident,
+                       readable=True, writable=True, bits=symbol.const_int)
         return node
 
     def _create_typedef(self, symbol):
index a96158c..5a66d17 100644 (file)
@@ -5,13 +5,13 @@
             xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
   <namespace name="Foo" version="1.0">
     <glib:boxed glib:name="BoxedType1" glib:type-name="boxed1" glib:get-type="boxed1_get_type" deprecated="1">
-      <field name="field1" readable="1" writable="1" offset="0">
+      <field name="field1" writable="1" offset="0">
         <type name="uint32"/>
       </field>
-      <field name="field2" readable="1" writable="1" offset="4">
+      <field name="field2" writable="1" offset="4">
         <type name="uint32"/>
       </field>
-      <field name="field3" readable="1" writable="1" offset="8">
+      <field name="field3" writable="1" offset="8">
         <type name="uint32"/>
       </field>
       <method name="frob_boxed1" c:identifier="frob_boxed1">
index 17dfc6b..654f13b 100644 (file)
       </parameters>
     </callback>
     <record name="Struct" c:type="FooStruct">
-      <field name="priv">
+      <field name="priv" writable="1">
         <type name="StructPrivate" c:type="FooStructPrivate*"/>
       </field>
-      <field name="member">
+      <field name="member" writable="1">
         <type name="int" c:type="int"/>
       </field>
     </record>
     <record name="StructPrivate" c:type="FooStructPrivate">
     </record>
     <record name="Rectangle" c:type="FooRectangle">
-      <field name="x">
+      <field name="x" writable="1">
         <type name="int" c:type="gint"/>
       </field>
-      <field name="y">
+      <field name="y" writable="1">
         <type name="int" c:type="gint"/>
       </field>
-      <field name="width">
+      <field name="width" writable="1">
         <type name="int" c:type="gint"/>
       </field>
-      <field name="height">
+      <field name="height" writable="1">
         <type name="int" c:type="gint"/>
       </field>
     </record>
       </parameters>
     </function>
     <record name="EventAny" c:type="FooEventAny">
-      <field name="send_event">
+      <field name="send_event" writable="1">
         <type name="int8" c:type="gint8"/>
       </field>
     </record>
     <record name="EventExpose" c:type="FooEventExpose">
-      <field name="send_event">
+      <field name="send_event" writable="1">
         <type name="int8" c:type="gint8"/>
       </field>
-      <field name="count">
+      <field name="count" writable="1">
         <type name="int" c:type="gint"/>
       </field>
     </record>
     <union name="Event" c:type="FooEvent">
-      <field name="type">
+      <field name="type" writable="1">
         <type name="int" c:type="int"/>
       </field>
-      <field name="any">
+      <field name="any" writable="1">
         <type name="EventAny" c:type="FooEventAny"/>
       </field>
-      <field name="expose">
+      <field name="expose" writable="1">
         <type name="EventExpose" c:type="FooEventExpose"/>
       </field>
     </union>
             c:type="FooBRect"
             glib:type-name="FooBRect"
             glib:get-type="foo_brect_get_type">
-      <field name="x">
+      <field name="x" writable="1">
         <type name="double" c:type="double"/>
       </field>
-      <field name="y">
+      <field name="y" writable="1">
         <type name="double" c:type="double"/>
       </field>
       <constructor name="new" c:identifier="foo_brect_new">
            c:type="FooBUnion"
            glib:type-name="FooBUnion"
            glib:get-type="foo_bunion_get_type">
-      <field name="type">
+      <field name="type" writable="1">
         <type name="int" c:type="int"/>
       </field>
-      <field name="v">
+      <field name="v" writable="1">
         <type name="double" c:type="double"/>
       </field>
-      <field name="rect">
+      <field name="rect" writable="1">
         <type name="BRect" c:type="FooBRect*"/>
       </field>
       <constructor name="new" c:identifier="foo_bunion_new">
       </method>
     </union>
     <union name="Union" c:type="_FooUnion">
-      <field name="foo">
+      <field name="foo" writable="1">
         <type name="int" c:type="int"/>
       </field>
     </union>
index ce83ee3..b80c62c 100644 (file)
       <member name="c" value="2" c:identifier="UTILITY_FLAG_C"/>
     </enumeration>
     <record name="Struct" c:type="UtilityStruct">
-      <field name="field">
+      <field name="field" writable="1">
         <type name="int" c:type="int"/>
       </field>
-      <field name="bitfield1" bits="3">
+      <field name="bitfield1" writable="1" bits="3">
         <type name="uint" c:type="guint"/>
       </field>
-      <field name="bitfield2" bits="2">
+      <field name="bitfield2" writable="1" bits="2">
         <type name="uint" c:type="guint"/>
       </field>
     </record>
     <union name="Union" c:type="UtilityUnion">
-      <field name="pointer">
+      <field name="pointer" writable="1">
         <type name="utf8" c:type="char*"/>
       </field>
-      <field name="integer">
+      <field name="integer" writable="1">
         <type name="long" c:type="glong"/>
       </field>
-      <field name="real">
+      <field name="real" writable="1">
         <type name="double" c:type="double"/>
       </field>
     </union>
index 4420845..e76d4fc 100644 (file)
@@ -5,27 +5,27 @@
             xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
   <namespace name="Foo" version="1.0">
     <record name="FooStruct">
-      <field name="foo_int" readable="1" writable="1" offset="0">
+      <field name="foo_int" writable="1" offset="0">
         <type name="int"/>
       </field>
-      <field name="foo_int64" readable="1" writable="1" offset="4">
+      <field name="foo_int64" writable="1" offset="4">
         <type name="int64"/>
       </field>
-      <field name="foo_uint" readable="1" writable="1" offset="12">
+      <field name="foo_uint" writable="1" offset="12">
         <type name="uint"/>
       </field>
-      <field name="foo_uint64" readable="1" writable="1" offset="16">
+      <field name="foo_uint64" writable="1" offset="16">
         <type name="uint64"/>
       </field>
-      <field name="string" readable="1" writable="1" offset="24">
+      <field name="string" writable="1" offset="24">
         <type name="utf8"/>
       </field>
     </record>
     <record name="FooStruct2">
-      <field name="sub" readable="1" writable="1" offset="0">
+      <field name="sub" writable="1" offset="0">
         <type name="FooStruct"/>
       </field>
-      <field name="string" readable="1" writable="1" offset="24">
+      <field name="string" writable="1" offset="24">
         <type name="utf8"/>
       </field>
     </record>
index 729583f..fa7dd46 100644 (file)
@@ -338,10 +338,16 @@ write_field_info (const gchar *namespace,
   offset = g_field_info_get_offset (info);
 
   xml_start_element (file, "field");
-  xml_printf (file, " name=\"%s\" readable=\"%s\" writable=\"%s\"",
-            name, 
-            flags & GI_FIELD_IS_READABLE ? "1" : "0", 
-            flags & GI_FIELD_IS_WRITABLE ? "1" : "0");
+  xml_printf (file, " name=\"%s\"", name);
+
+  /* Fields are assumed to be read-only
+   * (see also girwriter.py and girparser.c)
+   */
+  if (!(flags & GI_FIELD_IS_READABLE))
+    xml_printf (file, " readable=\"0\"");
+  if (flags & GI_FIELD_IS_WRITABLE)
+    xml_printf (file, " writable=\"1\"");
+
   if (size)
     xml_printf (file, " bits=\"%d\"", size);