summaryrefslogtreecommitdiff
path: root/giscanner
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-04-20 19:06:19 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-04-20 19:06:19 +0000
commite01880c5205ee16eebb7b0cedc7e207a08d4df3d (patch)
tree1a6a7f7f2aa3a462a0d034303d6731be26839449 /giscanner
parentf941a4ff59698c6a3c326eafe177af2d43a23505 (diff)
downloadgobject-introspection-e01880c5205ee16eebb7b0cedc7e207a08d4df3d.tar.gz
Avoid conflicts, keep the output ordered similar to the order of the
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 svn path=/trunk/; revision=180
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/gidlwriter.py2
-rw-r--r--giscanner/gobjecttreebuilder.py35
-rw-r--r--giscanner/odict.py24
3 files changed, 50 insertions, 11 deletions
diff --git a/giscanner/gidlwriter.py b/giscanner/gidlwriter.py
index 906a9dba..3287622d 100644
--- a/giscanner/gidlwriter.py
+++ b/giscanner/gidlwriter.py
@@ -24,7 +24,7 @@ class GIDLWriter(XMLWriter):
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)])
diff --git a/giscanner/gobjecttreebuilder.py b/giscanner/gobjecttreebuilder.py
index 789857cc..3576da41 100644
--- a/giscanner/gobjecttreebuilder.py
+++ b/giscanner/gobjecttreebuilder.py
@@ -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 @@ class GLibEnum(Enum):
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 GLibEnumMember(Member):
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 @@ class GObjectTreeBuilder(object):
# 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 @@ class GObjectTreeBuilder(object):
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 @@ class GObjectTreeBuilder(object):
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)
diff --git a/giscanner/odict.py b/giscanner/odict.py
new file mode 100644
index 00000000..00d5a5bd
--- /dev/null
+++ b/giscanner/odict.py
@@ -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[:]