diff options
author | Johan Dahlin <johan@gnome.org> | 2008-04-21 18:56:23 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-04-21 18:56:23 +0000 |
commit | 3761dec21258866945495a66773493e6206e7911 (patch) | |
tree | 3281f17dd83e193321e7ef538708470b5f2a1cc0 | |
parent | 6ed7f667291ae156e67a19bb86ccae809baac6e5 (diff) | |
download | gobject-introspection-3761dec21258866945495a66773493e6206e7911.tar.gz |
Add constructors for object/boxed types.
2008-04-21 Johan Dahlin <johan@gnome.org>
* giscanner/gidlwriter.py:
* giscanner/gobjecttreebuilder.py:
* giscanner/treebuilder.py:
Add constructors for object/boxed types.
svn path=/trunk/; revision=199
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | giscanner/gidlwriter.py | 7 | ||||
-rw-r--r-- | giscanner/gobjecttreebuilder.py | 29 | ||||
-rw-r--r-- | giscanner/treebuilder.py | 1 |
4 files changed, 44 insertions, 0 deletions
@@ -2,6 +2,13 @@ * giscanner/gidlwriter.py: * giscanner/gobjecttreebuilder.py: + * giscanner/treebuilder.py: + Add constructors for object/boxed types. + +2008-04-21 Johan Dahlin <johan@gnome.org> + + * giscanner/gidlwriter.py: + * giscanner/gobjecttreebuilder.py: Add support for boxed types 2008-04-21 Johan Dahlin <johan@gnome.org> diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py index d42c1af3..242a367b 100644 --- a/giscanner/gidlwriter.py +++ b/giscanner/gidlwriter.py @@ -44,6 +44,9 @@ class GIDLWriter(XMLWriter): def _write_method(self, method): self._write_function(method, tag_name='method') + def _write_constructor(self, method): + self._write_function(method, tag_name='constructor') + def _write_return_type(self, return_): if not return_: return @@ -85,6 +88,8 @@ class GIDLWriter(XMLWriter): if isinstance(class_, GLibObject): attrs.append(('get-type', class_.get_type)) with self.tagcontext('object', attrs): + for method in class_.constructors: + self._write_constructor(method) for method in class_.methods: self._write_method(method) @@ -101,5 +106,7 @@ class GIDLWriter(XMLWriter): if isinstance(boxed, GLibBoxed): attrs.append(('get-type', boxed.get_type)) with self.tagcontext('boxed', attrs): + for method in boxed.constructors: + self._write_constructor(method) for method in boxed.methods: self._write_method(method) diff --git a/giscanner/gobjecttreebuilder.py b/giscanner/gobjecttreebuilder.py index 72d80685..542871d2 100644 --- a/giscanner/gobjecttreebuilder.py +++ b/giscanner/gobjecttreebuilder.py @@ -63,6 +63,7 @@ class GLibObject(Class): class GLibBoxed(Struct): def __init__(self, name, methods, get_type): Struct.__init__(self, name) + self.constructors = [] self.methods = [] self.get_type = get_type @@ -129,6 +130,8 @@ class GObjectTreeBuilder(object): def _parse_function(self, func): if self._parse_get_type_function(func): return + elif self._parse_constructor(func): + return elif self._parse_method(func): return @@ -181,6 +184,32 @@ class GObjectTreeBuilder(object): class_.methods.append(method) return True + def _parse_constructor(self, func): + # FIXME: This is hackish, we should preserve the pointer structures + # here, so we can find pointers to objects and not just + # pointers to anything + rtype = func.retval.type + if rtype.count('*') != 1: + return False + + object_name = rtype.replace('*', '') + class_ = self._get_attribute(object_name) + if class_ is None or not isinstance(class_, (GLibObject, GLibBoxed)): + return False + + # GtkButton -> gtk_button_, so we can figure out the constructor name + prefix = to_underscores(object_name).lower() + '_' + if not func.name.startswith(prefix): + return False + + # Okay, the function is really a method + constructor = func + + # Strip namespace and object prefix: gtk_button_set_text -> set_text + constructor.name = func.name[len(prefix):] + class_.constructors.append(constructor) + return True + def _parse_struct(self, struct): if (struct.name.startswith('_') or struct.name.endswith('Iface') or diff --git a/giscanner/treebuilder.py b/giscanner/treebuilder.py index 9f2b42b4..8494556e 100644 --- a/giscanner/treebuilder.py +++ b/giscanner/treebuilder.py @@ -65,6 +65,7 @@ class Class(Node): self.name = name self.parent = parent self.methods = methods + self.constructors = [] def __repr__(self): return 'Class(%r, %r, %r)' % ( |