summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <jdahlin@async.com.br>2008-04-29 11:07:35 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-04-29 11:07:35 +0000
commitf73ef1fb57df1994f30c008e1e3209334fb3aa38 (patch)
tree29aa027b4b2f47c8035077783ff142c42ef7a27c
parentffbe20f528aaa923c420b77391a47b3976a71f86 (diff)
downloadgobject-introspection-f73ef1fb57df1994f30c008e1e3209334fb3aa38.tar.gz
Write record/structs to gir file too. Add a couple of tests, fix an off by
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
-rw-r--r--ChangeLog11
-rw-r--r--giscanner/girwriter.py35
-rw-r--r--giscanner/glibtransformer.py1
-rw-r--r--giscanner/transformer.py16
-rw-r--r--giscanner/xmlwriter.py2
-rw-r--r--tests/parser/Foo-expected.gir15
-rw-r--r--tests/parser/foo-object.h9
7 files changed, 81 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index b5d82c49..5ddbcaf7 100644
--- 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,
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index 1b640cd6..5127fa1b 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 b8fc28a2..3b24db69 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 92393314..5382b6ad 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 4dee3e2f..b28d98c2 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 38bbe163..85599d8a 100644
--- a/tests/parser/Foo-expected.gir
+++ b/tests/parser/Foo-expected.gir
@@ -174,6 +174,19 @@
<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"
@@ -253,5 +266,7 @@
</parameter>
</parameters>
</callback>
+ <record name="FooStruct" c:type="FooStruct"/>
+ <record name="FooStructPrivate" c:type="FooStructPrivate"/>
</namespace>
</repository>
diff --git a/tests/parser/foo-object.h b/tests/parser/foo-object.h
index bc2984a7..2ef8ce6f 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__ */