summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-04-21 18:56:23 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-04-21 18:56:23 +0000
commit3761dec21258866945495a66773493e6206e7911 (patch)
tree3281f17dd83e193321e7ef538708470b5f2a1cc0
parent6ed7f667291ae156e67a19bb86ccae809baac6e5 (diff)
downloadgobject-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--ChangeLog7
-rw-r--r--giscanner/gidlwriter.py7
-rw-r--r--giscanner/gobjecttreebuilder.py29
-rw-r--r--giscanner/treebuilder.py1
4 files changed, 44 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 34b7f410..94c7d1c2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)' % (