Write record/structs to gir file too. Add a couple of tests, fix an off by
authorJohan Dahlin <jdahlin@async.com.br>
Tue, 29 Apr 2008 11:07:35 +0000 (11:07 +0000)
committerJohan Dahlin <johan@src.gnome.org>
Tue, 29 Apr 2008 11:07:35 +0000 (11:07 +0000)
2008-04-29  Johan Dahlin  <jdahlin@async.com.br>

    * giscanner/girwriter.py:
    * giscanner/glibtransformer.py:
    * giscanner/transformer.py:
    * giscanner/xmlwriter.py:
    * tests/parser/Foo-expected.gir:
    * tests/parser/foo-object.h:
    Write record/structs to gir file too. Add a couple of tests,
    fix an off by one error in xmlwriter.py.

svn path=/trunk/; revision=257

ChangeLog
giscanner/girwriter.py
giscanner/glibtransformer.py
giscanner/transformer.py
giscanner/xmlwriter.py
tests/parser/Foo-expected.gir
tests/parser/foo-object.h

index b5d82c4..5ddbcaf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2008-04-29  Johan Dahlin  <jdahlin@async.com.br>
+
+       * giscanner/girwriter.py:
+       * giscanner/glibtransformer.py:
+       * giscanner/transformer.py:
+       * giscanner/xmlwriter.py:
+       * tests/parser/Foo-expected.gir:
+       * tests/parser/foo-object.h:
+       Write record/structs to gir file too. Add a couple of tests,
+       fix an off by one error in xmlwriter.py.
+
 2008-04-28  Johan Dahlin  <johan@gnome.org>
 
        * giscanner/xmlwriter.py: Calculate the line length properly,
index 1b640cd..5127fa1 100644 (file)
@@ -20,7 +20,8 @@
 
 from __future__ import with_statement
 
-from .ast import (Callback, Class, Enum, Function, Interface, Sequence)
+from .ast import (Callback, Class, Enum, Function, Interface, Sequence,
+                  Struct)
 from .glibast import (GLibBoxed, GLibEnum, GLibEnumMember,
                       GLibFlags, GLibObject, GLibInterface)
 from .xmlwriter import XMLWriter
@@ -57,6 +58,8 @@ class GIRWriter(XMLWriter):
             self._write_boxed(node)
         elif isinstance(node, Callback):
             self._write_callback(node)
+        elif isinstance(node, Struct):
+            self._write_record(node)
         else:
             print 'WRITER: Unhandled node', node
 
@@ -154,6 +157,10 @@ class GIRWriter(XMLWriter):
                 self._write_method(method)
             for prop in node.properties:
                 self._write_property(prop)
+            for field in node.fields:
+                self._write_field(field)
+            for signal in node.signals:
+                self._write_signal(signal)
 
     def _write_boxed(self, boxed):
         attrs = [('c:type', boxed.ctype),
@@ -177,3 +184,29 @@ class GIRWriter(XMLWriter):
         with self.tagcontext('callback', attrs):
             self._write_return_type(callback.retval)
             self._write_parameters(callback.parameters)
+
+    def _write_record(self, record):
+        attrs = [('name', record.name),
+                 ('c:type', record.symbol)]
+        if record.fields:
+            with self.tagcontext('record', attrs):
+                for field in record.fields:
+                    self._write_field(field)
+        else:
+            self.write_tag('record', attrs)
+
+    def _write_field(self, field):
+        if isinstance(field, Callback):
+            self._write_callback(field)
+            return
+
+        attrs = [('name', field.name),
+                 ('type', str(field.type))]
+        self.write_tag('field', attrs)
+
+    def _write_signal(self, signal):
+        attrs = [('name', signal.name)]
+        with self.tagcontext('glib:signal', attrs):
+            self._write_return_type(signal.retval)
+            self._write_parameters(signal.parameters)
+
index b8fc28a..3b24db6 100644 (file)
@@ -320,6 +320,7 @@ class GLibTransformer(object):
         node = GLibBoxed(self._strip_namespace_object(type_name),
                          type_name, symbol)
         self._add_attribute(node)
+        self._remove_attribute(type_name)
         self._register_internal_type(type_name, node)
 
     def _introspect_properties(self, node, type_id):
index 9239331..5382b6a 100644 (file)
@@ -163,16 +163,20 @@ class Transformer(object):
         return return_
 
     def _create_typedef_struct(self, symbol):
-        self._typedefs_ns[symbol.base_type.name] = symbol.ident
+        name = self._remove_prefix(symbol.ident)
+        struct = Struct(name, symbol.ident)
+        self._typedefs_ns[symbol.ident] = struct
+        return struct
 
     def _create_struct(self, symbol):
-        name = self._typedefs_ns.get(symbol.ident, None)
-        if name is None:
+        struct = self._typedefs_ns.get(symbol.ident, None)
+        if struct is None:
             name = self._remove_prefix(symbol.ident)
-        struct = Struct(name, symbol.ident)
+            struct = Struct(name, symbol.ident)
+
         for child in symbol.base_type.child_list:
-            struct.fields.append(self._traverse_one(child,
-                                                    child.base_type.type))
+            field = self._traverse_one(child, child.base_type.type)
+            struct.fields.append(field)
         return struct
 
     def _create_callback(self, symbol):
index 4dee3e2..b28d98c 100644 (file)
@@ -62,7 +62,7 @@ class XMLWriter(object):
 
     def _open_tag(self, tag_name, attributes=None):
         attrs = self._collect_attributes(
-            attributes, len(tag_name) + 2)
+            attributes, len(tag_name) + 1)
         self.write_line('<%s%s>' % (tag_name, attrs))
 
     def _close_tag(self, tag_name):
index 38bbe16..85599d8 100644 (file)
       <property name="string">
         <type name="gchararray" c:type="gchararray"/>
       </property>
+      <glib:signal name="signal">
+        <return-value>
+          <type name="gchararray" c:type="gchararray"/>
+        </return-value>
+        <parameters>
+          <parameter name="object">
+            <type name="GObject" c:type="GObject"/>
+          </parameter>
+          <parameter name="p0">
+            <type name="gpointer" c:type="gpointer"/>
+          </parameter>
+        </parameters>
+      </glib:signal>
     </class>
     <class name="Subobject"
            c:type="FooSubobject"
         </parameter>
       </parameters>
     </callback>
+    <record name="FooStruct" c:type="FooStruct"/>
+    <record name="FooStructPrivate" c:type="FooStructPrivate"/>
   </namespace>
 </repository>
index bc2984a..2ef8ce6 100644 (file)
@@ -121,4 +121,13 @@ typedef gboolean (* FooCallback) (FooObject *foo, gboolean b, gpointer data);
 /* @ */
 /* @: */
 
+typedef struct _FooStruct           FooStruct; 
+typedef struct _FooStructPrivate    FooStructPrivate; 
+
+struct _FooStruct
+{
+  FooStructPrivate *priv;
+  int member;
+};
+  
 #endif /* __FOO_OBJECT_H__ */