gobject-introspection r181 - in trunk: . giscanner



Author: johan
Date: Sun Apr 20 19:52:33 2008
New Revision: 181
URL: http://svn.gnome.org/viewvc/gobject-introspection?rev=181&view=rev

Log:
2008-04-20  Johan Dahlin  <jdahlin async com br>

        * giscanner/cgobject.py:
        * giscanner/gidlwriter.py:
        * giscanner/gobjecttreebuilder.py:
        * giscanner/treebuilder.py:
        Add support for classes and methods



Modified:
   trunk/ChangeLog
   trunk/giscanner/cgobject.py
   trunk/giscanner/gidlwriter.py
   trunk/giscanner/gobjecttreebuilder.py
   trunk/giscanner/treebuilder.py

Modified: trunk/giscanner/cgobject.py
==============================================================================
--- trunk/giscanner/cgobject.py	(original)
+++ trunk/giscanner/cgobject.py	Sun Apr 20 19:52:33 2008
@@ -102,6 +102,9 @@
 def type_fundamental(type_id):
     return _gobj.g_type_fundamental(type_id)
 
+def type_parent(type_id):
+    return _gobj.g_type_parent(type_id)
+
 _gobj.g_type_class_ref.restype = ctypes.POINTER(GTypeClass)
 def type_class_ref(type_id):
     fundamental_type = type_fundamental(type_id)

Modified: trunk/giscanner/gidlwriter.py
==============================================================================
--- trunk/giscanner/gidlwriter.py	(original)
+++ trunk/giscanner/gidlwriter.py	Sun Apr 20 19:52:33 2008
@@ -1,7 +1,9 @@
-from giscanner.gobjecttreebuilder import GLibEnum, GLibEnumMember, GLibFlags
-from giscanner.treebuilder import Enum, Function
+from giscanner.gobjecttreebuilder import (GLibEnum, GLibEnumMember, GLibFlags,
+                                          GLibObject)
+from giscanner.treebuilder import Class, Enum, Function
 from giscanner.xmlwriter import XMLWriter
 
+
 class GIDLWriter(XMLWriter):
     def __init__(self, namespace, nodes):
         super(GIDLWriter, self).__init__()
@@ -23,6 +25,8 @@
             self._write_function(node)
         elif isinstance(node, Enum):
             self._write_enum(node)
+        elif isinstance(node, Class):
+            self._write_class(node)
         else:
             print 'WRITER: Unhandled node', node
 
@@ -32,6 +36,12 @@
         self._write_parameters(func.parameters)
         self.pop_tag()
 
+    def _write_method(self, method):
+        self.push_tag('method', [('name', method.name)])
+        self._write_return_type(method.retval)
+        self._write_parameters(method.parameters)
+        self.pop_tag()
+
     def _write_return_type(self, return_):
         if not return_:
             return
@@ -68,3 +78,13 @@
         if isinstance(member, GLibEnumMember):
             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))
+        self.push_tag('object', attrs)
+        for method in class_.methods:
+            self._write_method(method)
+        self.pop_tag()

Modified: trunk/giscanner/gobjecttreebuilder.py
==============================================================================
--- trunk/giscanner/gobjecttreebuilder.py	(original)
+++ trunk/giscanner/gobjecttreebuilder.py	Sun Apr 20 19:52:33 2008
@@ -1,7 +1,7 @@
 import ctypes
 
 from giscanner import cgobject
-from giscanner.treebuilder import Enum, Function, Member, Struct
+from giscanner.treebuilder import Class, Enum, Function, Member, Struct
 from giscanner.odict import odict
 
 
@@ -28,6 +28,12 @@
         self.nick = nick
 
 
+class GLibObject(Class):
+    def __init__(self, name, parent, methods, get_type):
+        Class.__init__(self, name, parent, methods)
+        self.get_type = get_type
+
+
 class GObjectTreeBuilder(object):
     def __init__(self):
         self.nodes = []
@@ -75,15 +81,43 @@
         self._add_attribute(enum)
 
     def _parse_function(self, func):
-        symbol = func.name
-        # GType *_get_type(void)
-        if (symbol.endswith('_get_type') and
-            func.retval.type == 'GType' and
-            not func.parameters):
-            type_id = self._call_get_type_function(symbol)
-            self._parse_gtype(type_id, symbol)
+        if self._parse_get_type_function(func):
+            return
+        elif self._parse_method(func):
             return
-        self._add_attribute(func)
+        else:
+            self._add_attribute(func)
+
+    def _parse_get_type_function(self, func):
+        # GType *_get_type(void)
+        symbol = func.name
+        if not symbol.endswith('_get_type'):
+            return False
+        if func.retval.type != 'GType':
+            return False
+        if func.parameters:
+            return False
+
+        type_id = self._call_get_type_function(symbol)
+        self._parse_gtype(type_id, symbol)
+        return True
+
+
+    def _parse_method(self, func):
+        if not func.parameters:
+            return False
+
+        first_arg = func.parameters[0].type
+        if first_arg.count('*') != 1:
+            return False
+
+        object_name = first_arg.replace('*', '')
+        class_ = self._namespace.get(object_name, None)
+        if class_ is None or not isinstance(class_, GLibObject):
+            return False
+
+        class_.methods.append(func)
+        return True
 
     def _parse_struct(self, struct):
         if (struct.name.startswith('_') or
@@ -96,9 +130,9 @@
         fundamental_type_id = cgobject.type_fundamental(type_id)
         if (fundamental_type_id == cgobject.TYPE_ENUM or
             fundamental_type_id == cgobject.TYPE_FLAGS):
-            self._introspect_enum(fundamental_type_id, type_id, symbol)
-        #elif fundamental_type == cgobject.TYPE_OBJECT:
-        #    pass
+            pass #self._introspect_enum(fundamental_type_id, type_id, symbol)
+        elif fundamental_type_id == cgobject.TYPE_OBJECT:
+            self._introspect_object(type_id, symbol)
         else:
             print 'unhandled GType: %s' % (cgobject.type_name(type_id),)
 
@@ -116,3 +150,9 @@
         klass = (GLibFlags if ftype_id == cgobject.TYPE_FLAGS else GLibEnum)
         cenum = klass(cgobject.type_name(type_id), members, symbol)
         self._add_attribute(cenum, replace=True)
+
+    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)
+        self._add_attribute(node, replace=True)

Modified: trunk/giscanner/treebuilder.py
==============================================================================
--- trunk/giscanner/treebuilder.py	(original)
+++ trunk/giscanner/treebuilder.py	Sun Apr 20 19:52:33 2008
@@ -57,6 +57,16 @@
         return 'Return(%r)' % (self.type,)
 
 
+class Class(Node):
+    def __init__(self, name, parent, methods):
+        self.name = name
+        self.parent = parent
+        self.methods = methods
+
+    def __repr__(self):
+        return 'Class(%r, %r)' % (self.name, self.methods)
+
+
 class TreeBuilder(object):
     def __init__(self, generator):
         self.generator = generator



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]