gobject-introspection r180 - in trunk: . giscanner



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

Log:
2008-04-20  Johan Dahlin  <johan gnome org>

	* giscanner/gidlwriter.py:
	* giscanner/gobjecttreebuilder.py:
	* giscanner/odict.py:
	Avoid conflicts, keep the output ordered similar to
	the order of the input.
	Add a simple ordered dictionary implemenation



Added:
   trunk/giscanner/odict.py
Modified:
   trunk/ChangeLog
   trunk/giscanner/gidlwriter.py
   trunk/giscanner/gobjecttreebuilder.py

Modified: trunk/giscanner/gidlwriter.py
==============================================================================
--- trunk/giscanner/gidlwriter.py	(original)
+++ trunk/giscanner/gidlwriter.py	Sun Apr 20 19:06:19 2008
@@ -24,7 +24,7 @@
         elif isinstance(node, Enum):
             self._write_enum(node)
         else:
-            print 'Unhandled node', node
+            print 'WRITER: Unhandled node', node
 
     def _write_function(self, func):
         self.push_tag('function', [('name', func.name)])

Modified: trunk/giscanner/gobjecttreebuilder.py
==============================================================================
--- trunk/giscanner/gobjecttreebuilder.py	(original)
+++ trunk/giscanner/gobjecttreebuilder.py	Sun Apr 20 19:06:19 2008
@@ -1,7 +1,8 @@
 import ctypes
 
-from giscanner.treebuilder import Enum, Function, Member, Struct
 from giscanner import cgobject
+from giscanner.treebuilder import Enum, Function, Member, Struct
+from giscanner.odict import odict
 
 
 class GLibEnum(Enum):
@@ -9,6 +10,13 @@
         Enum.__init__(self, name, members)
         self.get_type = get_type
 
+    def __repr__(self):
+        return '%s(%r, %r, %r)' % (
+            self.__class__.__name__,
+            self.name,
+            self.members,
+            self.get_type)
+
 
 class GLibFlags(GLibEnum):
     pass
@@ -22,14 +30,14 @@
 
 class GObjectTreeBuilder(object):
     def __init__(self):
-        self.inputnodes = []
-        self.outputnodes = []
+        self.nodes = []
+        self._namespace = odict()
         self._library = None
 
     # Public API
 
     def get_nodes(self):
-        return self.outputnodes
+        return self._namespace.values()
 
     def load_library(self, libname):
         self._library = ctypes.cdll.LoadLibrary(libname)
@@ -41,6 +49,12 @@
 
     # Private
 
+    def _add_attribute(self, node, replace=False):
+        node_name = node.name
+        if node_name in self._namespace and not replace:
+            return
+        self._namespace[node_name] = node
+
     def _call_get_type_function(self, symbol_name):
         func = getattr(self._library, symbol_name)
         func.restype = cgobject.GType
@@ -58,24 +72,25 @@
             print 'Unhandled node:', node
 
     def _parse_enum(self, enum):
-        self.outputnodes.append(enum)
+        self._add_attribute(enum)
 
     def _parse_function(self, func):
-        if (func.name.endswith('_get_type') and
+        symbol = func.name
+        # GType *_get_type(void)
+        if (symbol.endswith('_get_type') and
             func.retval.type == 'GType' and
             not func.parameters):
-            symbol = func.name
             type_id = self._call_get_type_function(symbol)
             self._parse_gtype(type_id, symbol)
             return
-        print 'todo', func
+        self._add_attribute(func)
 
     def _parse_struct(self, struct):
         if (struct.name.startswith('_') or
             struct.name.endswith('Iface') or
             struct.name.endswith('Class')):
             return
-        print 'todo', struct
+        self._add_attribute(struct)
 
     def _parse_gtype(self, type_id, symbol):
         fundamental_type_id = cgobject.type_fundamental(type_id)
@@ -100,4 +115,4 @@
 
         klass = (GLibFlags if ftype_id == cgobject.TYPE_FLAGS else GLibEnum)
         cenum = klass(cgobject.type_name(type_id), members, symbol)
-        self.outputnodes.append(cenum)
+        self._add_attribute(cenum, replace=True)

Added: trunk/giscanner/odict.py
==============================================================================
--- (empty file)
+++ trunk/giscanner/odict.py	Sun Apr 20 19:06:19 2008
@@ -0,0 +1,24 @@
+# odict - an ordered dictionary
+
+from UserDict import DictMixin
+
+
+class odict(DictMixin):
+    def __init__(self):
+        self._items = {}
+        self._keys = []
+
+    def __setitem__(self, key, value):
+        if key not in self._items:
+            self._keys.append(key)
+        self._items[key] = value
+
+    def __getitem__(self, key):
+        return self._items[key]
+
+    def __delitem__(self, key):
+        del self._items[key]
+        self._keys.remove(key)
+
+    def keys(self):
+        return self._keys[:]



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