diff options
author | Johan Dahlin <johan@gnome.org> | 2008-04-20 19:06:19 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-04-20 19:06:19 +0000 |
commit | e01880c5205ee16eebb7b0cedc7e207a08d4df3d (patch) | |
tree | 1a6a7f7f2aa3a462a0d034303d6731be26839449 /giscanner | |
parent | f941a4ff59698c6a3c326eafe177af2d43a23505 (diff) | |
download | gobject-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.py | 2 | ||||
-rw-r--r-- | giscanner/gobjecttreebuilder.py | 35 | ||||
-rw-r--r-- | giscanner/odict.py | 24 |
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[:] |