+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,
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
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
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),
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)
+
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):