From f73ef1fb57df1994f30c008e1e3209334fb3aa38 Mon Sep 17 00:00:00 2001 From: Johan Dahlin Date: Tue, 29 Apr 2008 11:07:35 +0000 Subject: [PATCH] Write record/structs to gir file too. Add a couple of tests, fix an off by 2008-04-29 Johan Dahlin * 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 | 11 +++++++++++ giscanner/girwriter.py | 35 ++++++++++++++++++++++++++++++++++- giscanner/glibtransformer.py | 1 + giscanner/transformer.py | 16 ++++++++++------ giscanner/xmlwriter.py | 2 +- tests/parser/Foo-expected.gir | 15 +++++++++++++++ tests/parser/foo-object.h | 9 +++++++++ 7 files changed, 81 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index b5d82c4..5ddbcaf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2008-04-29 Johan Dahlin + + * 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 * giscanner/xmlwriter.py: Calculate the line length properly, diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py index 1b640cd..5127fa1 100644 --- a/giscanner/girwriter.py +++ b/giscanner/girwriter.py @@ -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) + diff --git a/giscanner/glibtransformer.py b/giscanner/glibtransformer.py index b8fc28a..3b24db6 100644 --- a/giscanner/glibtransformer.py +++ b/giscanner/glibtransformer.py @@ -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): diff --git a/giscanner/transformer.py b/giscanner/transformer.py index 9239331..5382b6a 100644 --- a/giscanner/transformer.py +++ b/giscanner/transformer.py @@ -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): diff --git a/giscanner/xmlwriter.py b/giscanner/xmlwriter.py index 4dee3e2..b28d98c 100644 --- a/giscanner/xmlwriter.py +++ b/giscanner/xmlwriter.py @@ -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): diff --git a/tests/parser/Foo-expected.gir b/tests/parser/Foo-expected.gir index 38bbe16..85599d8 100644 --- a/tests/parser/Foo-expected.gir +++ b/tests/parser/Foo-expected.gir @@ -174,6 +174,19 @@ + + + + + + + + + + + + + + + diff --git a/tests/parser/foo-object.h b/tests/parser/foo-object.h index bc2984a..2ef8ce6 100644 --- a/tests/parser/foo-object.h +++ b/tests/parser/foo-object.h @@ -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__ */ -- 2.7.4