summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--giscanner/gidlwriter.py42
-rw-r--r--giscanner/gobjecttreebuilder.py41
-rw-r--r--giscanner/treebuilder.py21
4 files changed, 80 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index 3f1b90eb..c4cf839e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2008-04-21 Johan Dahlin <johan@gnome.org>
+ * giscanner/gidlwriter.py:
+ * giscanner/gobjecttreebuilder.py:
+ * giscanner/treebuilder.py:
+ Add support for properties.
+ Refactor Class/Interface support a bit, to share more code and
+ always initialize their method attribute to an empty list.
+
+2008-04-21 Johan Dahlin <johan@gnome.org>
+
* giscanner/cgobject.py:
Add a workaround for a glib bug interface introspection bug
(object_interface_list_properties, object_class_list_properties):
diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py
index 242a367b..3ef34978 100644
--- a/giscanner/gidlwriter.py
+++ b/giscanner/gidlwriter.py
@@ -25,10 +25,8 @@ class GIDLWriter(XMLWriter):
self._write_function(node)
elif isinstance(node, Enum):
self._write_enum(node)
- elif isinstance(node, Class):
+ elif isinstance(node, (Class, Interface)):
self._write_class(node)
- elif isinstance(node, Interface):
- self._write_interface(node)
elif isinstance(node, GLibBoxed):
self._write_boxed(node)
else:
@@ -82,24 +80,23 @@ class GIDLWriter(XMLWriter):
attrs.append(('nick', member.nick))
self.write_tag('member', attrs)
- def _write_class(self, class_):
- attrs = [('name', class_.name),
- ('parent', class_.parent)]
- 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)
-
- def _write_interface(self, interface):
- attrs = [('name', interface.name)]
- if isinstance(interface, GLibInterface):
- attrs.append(('get-type', interface.get_type))
- with self.tagcontext('interface', attrs):
- for method in interface.methods:
+ def _write_class(self, node):
+ attrs = [('name', node.name)]
+ if isinstance(node, Class):
+ tag_name = 'object'
+ attrs.append(('parent', node.parent))
+ else:
+ tag_name = 'interface'
+ if isinstance(node, (GLibObject, GLibInterface)):
+ attrs.append(('get-type', node.get_type))
+ with self.tagcontext(tag_name, attrs):
+ if isinstance(node, Class):
+ for method in node.constructors:
+ self._write_constructor(method)
+ for method in node.methods:
self._write_method(method)
+ for prop in node.properties:
+ self._write_property(prop)
def _write_boxed(self, boxed):
attrs = [('name', boxed.name)]
@@ -110,3 +107,8 @@ class GIDLWriter(XMLWriter):
self._write_constructor(method)
for method in boxed.methods:
self._write_method(method)
+
+ def _write_property(self, prop):
+ attrs = [('name', prop.name),
+ ('prop', prop.type)]
+ self.write_tag('property', attrs)
diff --git a/giscanner/gobjecttreebuilder.py b/giscanner/gobjecttreebuilder.py
index 241d42c8..188f1607 100644
--- a/giscanner/gobjecttreebuilder.py
+++ b/giscanner/gobjecttreebuilder.py
@@ -3,7 +3,8 @@ import re
import os
from . import cgobject
-from .treebuilder import Class, Enum, Function, Interface, Member, Struct
+from .treebuilder import (Class, Enum, Function, Interface, Member, Property,
+ Struct)
from .odict import odict
@@ -55,13 +56,13 @@ class GLibEnumMember(Member):
class GLibObject(Class):
- def __init__(self, name, parent, methods, get_type):
- Class.__init__(self, name, parent, methods)
+ def __init__(self, name, parent, get_type):
+ Class.__init__(self, name, parent)
self.get_type = get_type
class GLibBoxed(Struct):
- def __init__(self, name, methods, get_type):
+ def __init__(self, name, get_type):
Struct.__init__(self, name)
self.constructors = []
self.methods = []
@@ -69,11 +70,15 @@ class GLibBoxed(Struct):
class GLibInterface(Interface):
- def __init__(self, name, methods, get_type):
- Interface.__init__(self, name, methods)
+ def __init__(self, name, get_type):
+ Interface.__init__(self, name)
self.get_type = get_type
+class GLibProperty(Property):
+ pass
+
+
class GObjectTreeBuilder(object):
def __init__(self, namespace_name):
self._namespace_name = namespace_name
@@ -255,21 +260,39 @@ class GObjectTreeBuilder(object):
def _introspect_object(self, type_id, symbol):
type_name = cgobject.type_name(type_id)
parent_name = cgobject.type_name(cgobject.type_parent(type_id))
- node = GLibObject(type_name, parent_name, [], symbol)
+ node = GLibObject(type_name, parent_name, symbol)
+ self._introspect_properties(node, type_id)
self._strip_namespace(node)
self._add_attribute(node)
self._remove_attribute(type_name)
def _introspect_interface(self, type_id, symbol):
type_name = cgobject.type_name(type_id)
- node = GLibInterface(type_name, [], symbol)
+ node = GLibInterface(type_name, symbol)
self._strip_namespace(node)
+ self._introspect_properties(node, type_id)
self._add_attribute(node)
self._remove_attribute(type_name)
def _introspect_boxed(self, type_id, symbol):
type_name = cgobject.type_name(type_id)
- node = GLibBoxed(type_name, [], symbol)
+ node = GLibBoxed(type_name, symbol)
self._strip_namespace(node)
self._add_attribute(node)
self._remove_attribute(type_name)
+
+ def _introspect_properties(self, node, type_id):
+ fundamental_type_id = cgobject.type_fundamental(type_id)
+ if fundamental_type_id == cgobject.TYPE_OBJECT:
+ pspecs = cgobject.object_class_list_properties(type_id)
+ elif fundamental_type_id == cgobject.TYPE_INTERFACE:
+ pspecs = cgobject.object_interface_list_properties(type_id)
+ else:
+ raise AssertionError
+
+ for pspec in pspecs:
+ if pspec.owner_type != type_id:
+ continue
+ node.properties.append(Property(
+ pspec.name,
+ cgobject.type_name(pspec.value_type)))
diff --git a/giscanner/treebuilder.py b/giscanner/treebuilder.py
index 688803c0..52d452a2 100644
--- a/giscanner/treebuilder.py
+++ b/giscanner/treebuilder.py
@@ -61,11 +61,12 @@ class Return(Node):
class Class(Node):
- def __init__(self, name, parent, methods):
+ def __init__(self, name, parent):
self.name = name
self.parent = parent
- self.methods = methods
+ self.methods = []
self.constructors = []
+ self.properties = []
def __repr__(self):
return '%s(%r, %r, %r)' % (
@@ -74,9 +75,10 @@ class Class(Node):
class Interface(Node):
- def __init__(self, name, methods):
+ def __init__(self, name):
self.name = name
- self.methods = methods
+ self.methods = []
+ self.properties = []
def __repr__(self):
return '%s(%r, %r)' % (
@@ -95,6 +97,17 @@ class Constant(Node):
self.name, self.type, self.value)
+class Property(Node):
+ def __init__(self, name, type):
+ self.name = name
+ self.type = type
+
+ def __repr__(self):
+ return '%s(%r, %r, %r)' % (
+ self.__class__.__name__,
+ self.name, self.type, self.value)
+
+
class TreeBuilder(object):
def __init__(self, generator):
self.generator = generator